I am trying to use salt to move over my php.ini file, but I only want it to run once on the first run. I am trying to use salt grains to do this, but this is working inconsistently. Any ideas?
#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 %}
What is the expected behavior of using grain.present?
It will make sure that the grain will be present. In other words. Ik will make it when it's not there.
Any ideas?
You want to make sure that the php.ini file is only placed on your minion once. During the first 'state.apply'
file.managed
will make sure that your file is present, with the right permissions and the right content.
When you do another state.apply, Salt will see that the file is already available with the correct content and moves on. In this case you could run this as many times as you want without a problem.
If your php.ini file is changed manually after it is placed by Salt I understand that you want to make sure to only run it once. In this case you could use the unless
requisite like this:
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
The unless
requisite specifies that a state should only run when any of the specified commands return False. In this case the ls
returns false if the file does not exist.
I hope this helps.