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.
comments powered by Disqus