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.append together to modify the same file. In
baseline-generic-config: file.managed: - name: ~/.bash_profile - source: salt://path/to/.bash_profile
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
touch-generic-config: file.exists: - name: ~/.bash_profile baseline-generic-config: file.append: - name: ~/.bash_profile - source: salt://path/to/.bash_profile
maven.sls goes unchanged. Now, a highstate will instead only trigger a
file.append if the required contents are changed.
comments powered by Disqus