Note
This tutorial builds on topics covered in part 1. It is recommended that you begin there.
In the last part of the Salt States tutorial we covered the
basics of installing a package. We will now modify our webserver.sls
file
to have requirements, and use even more Salt States.
You can specify multiple State declaration under an
ID declaration. For example, a quick modification to our
webserver.sls
to also start Apache if it is not running:
1apache:
2 pkg.installed: []
3 service.running:
4 - require:
5 - pkg: apache
Try stopping Apache before running state.apply
once again and observe the output.
Note
For those running RedhatOS derivatives (Centos, AWS), you will want to specify the
service name to be httpd. More on state service here, service state
. With the example above, just add "- name: httpd"
above the require line and with the same spacing.
We now have a working installation of Apache so let's add an HTML file to
customize our website. It isn't exactly useful to have a website without a
webserver so we don't want Salt to install our HTML file until Apache is
installed and running. Include the following at the bottom of your
webserver/init.sls
file:
1apache:
2 pkg.installed: []
3 service.running:
4 - require:
5 - pkg: apache
6
7/var/www/index.html: # ID declaration
8 file: # state declaration
9 - managed # function
10 - source: salt://webserver/index.html # function arg
11 - require: # requisite declaration
12 - pkg: apache # requisite reference
line 7 is the ID declaration. In this example it is the location we
want to install our custom HTML file. (Note: the default location that
Apache serves may differ from the above on your OS or distro. /srv/www
could also be a likely place to look.)
Line 8 the State declaration. This example uses the Salt file
state
.
Line 9 is the Function declaration. The managed function
will download a file from the master and install it
in the location specified.
Line 10 is a Function arg declaration which, in this example, passes
the source
argument to the managed function
.
Line 11 is a Requisite declaration.
Line 12 is a Requisite reference which refers to a state and an ID.
In this example, it is referring to the ID declaration
from our example in
part 1. This declaration tells Salt not to install the HTML
file until Apache is installed.
Next, create the index.html
file and save it in the webserver
directory:
<!DOCTYPE html>
<html>
<head><title>Salt rocks</title></head>
<body>
<h1>This file brought to you by Salt</h1>
</body>
</html>
Last, call state.apply
again and the minion
will fetch and execute the highstate as well as our
HTML file from the master using Salt's File Server:
salt '*' state.apply
Verify that Apache is now serving your custom HTML.
require
vs. watch
There are two Requisite declaration, “require”, and “watch”. Not
every state supports “watch”. The service state
does support “watch” and will restart a service
based on the watch condition.
For example, if you use Salt to install an Apache virtual host configuration file and want to restart Apache whenever that file is changed you could modify our Apache example from earlier as follows:
/etc/httpd/extra/httpd-vhosts.conf:
file.managed:
- source: salt://webserver/httpd-vhosts.conf
apache:
pkg.installed: []
service.running:
- watch:
- file: /etc/httpd/extra/httpd-vhosts.conf
- require:
- pkg: apache
If the pkg and service names differ on your OS or distro of choice you can specify each one separately using a Name declaration which explained in Part 3.
In part 3 we will discuss how to use includes, extends, and templating to make a more complete State Tree configuration.