Dynamically Manage and Update a File with SaltStack

I had the problem recently of two functions infinitely changing each other every time a highstate was triggered. The requirement was that a given config file needed to contain some static content on every minion along with, potentially, some added content based on a minion’s given role (e.g. web server and database server have different needs).

The problem arose from using both file.managed and file.append together to modify the same file. In common.sls :

baseline-generic-config: file.managed: - name: ~/.bash_profile - source: salt://path/to/.bash_profile

and in maven.sls :

add-maven-env-variables: file.append: - name: ~/.bash_profile - text: "export MAVEN_HOME=$HOME/path/to/maven"

On a minion that gets targeted with maven.sls (assuming every minion gets common.sls applied), every time a highstate is triggered, the file.managed function with ID baseline-generic-config will notice that the ~/.bash_profile has changed and revert the changes. Next, the file.append function with ID add-maven-variables will notice that the MAVEN_HOME export does not exist and will append to the file. Rinse and repeat for every subsequent highstate.

A good solution for working around this is to use file.exists and then manage the file exclusively through file.append . In the updated common.sls :

touch-generic-config: file.exists: - name: ~/.bash_profile baseline-generic-config: file.append: - name: ~/.bash_profile - source: salt://path/to/.bash_profile

and maven.sls goes unchanged. Now, a highstate will instead only trigger a file.append if the required contents are changed.

Please enable JavaScript to view the comments powered by Disqus.

Disqus