使用 grain.present 的预期行为是什么?

What is the expected behavior of using grain.present?

我正在尝试使用 salt 移动我的 php.ini 文件,但我只希望它在第一个 运行 上 运行 一次。我正在尝试使用盐粒来做到这一点,但这是不一致的。有什么想法吗?

#phpinifile.sls
{%- set php_ini_initialized = salt['grains.get']('PHP_INI_INITIALIZED') | default( False, true) %}

{% if php_ini_initialized == False %}
etc-php-70-cli-phpini:
file.managed:
    - name: /etc/php/7.0/cli/php.ini
    - source: salt://billing/sources/etc/php/7.0/cli/php.ini
    - user: root
    - group: root
    - mode: 644
    - context:
      set_pear_path: True
    - template: jinja


PHP_INI_INITIALIZED:
  grains.present:
    - value: True
{% endif %}

使用 grain.present 的预期行为是什么?

它将确保颗粒存在。换一种说法。 Ik会在它不在的时候做到。

有什么想法吗?

您要确保 php.ini 文件仅在您的 minion 上放置一次。在第一个 'state.apply'

file.managed 将确保您的文件存在,具有正确的权限和正确的内容。 当您执行另一个 state.apply 时,Salt 将看到该文件已经可用且内容正确并继续。在这种情况下,您可以 运行 任意多次都没有问题。

如果您的 php.ini 文件在被 Salt 放置后被手动更改,我知道您想确保只 运行 它一次。在这种情况下,您可以像这样使用 unless 必要条件:

phpini:
file.managed:
    - name: /etc/php/7.0/cli/php.ini
    - source: salt://billing/sources/etc/php/7.0/cli/php.ini
    - unless: ls /etc/php/7.0/cli/php.ini

unless 必要条件指定仅当任何指定命令 return 为 False 时,状态才应 运行。在这种情况下,如果文件不存在,ls returns false。

希望对您有所帮助。