salt/doc/ref/states/ordering.rst

187 lines
6.0 KiB
ReStructuredText
Raw Normal View History

.. _ordering:
2011-11-24 23:21:08 +00:00
===============
Ordering States
===============
2013-08-20 17:52:10 +00:00
The way in which configuration management systems are executed is a hotly
debated topic in the configuration management world. Two
major philosophies exist on the subject, to either execute in an imperative
fashion where things are executed in the order in which they are defined, or
in a declarative fashion where dependencies need to be mapped between objects.
2011-11-24 23:21:08 +00:00
2013-08-20 17:52:10 +00:00
Imperative ordering is finite and generally considered easier to write, but
2013-08-20 19:21:26 +00:00
declarative ordering is much more powerful and flexible but generally considered
2013-08-20 17:52:10 +00:00
more difficult to create.
2011-11-24 23:21:08 +00:00
2013-08-20 19:21:26 +00:00
Salt has been created to get the best of both worlds. States are evaluated in
a finite order, which guarantees that states are always executed in the same
order, and the states runtime is declarative, making Salt fully aware of
2013-10-24 13:40:21 +00:00
dependencies via the `requisite` system.
2013-08-20 17:52:10 +00:00
.. _ordering_auto_order:
2013-08-20 17:52:10 +00:00
State Auto Ordering
===================
2013-09-03 12:59:14 +00:00
.. versionadded: 0.17.0
2013-08-20 17:52:10 +00:00
Salt always executes states in a finite manner, meaning that they will always
2013-08-20 19:21:26 +00:00
execute in the same order regardless of the system that is executing them.
But in Salt 0.17.0, the ``state_auto_order`` option was added. This option
2013-08-20 17:52:10 +00:00
makes states get evaluated in the order in which they are defined in sls
files.
The evaluation order makes it easy to know what order the states will be
executed in, but it is important to note that the requisite system will
2013-08-20 19:21:26 +00:00
override the ordering defined in the files, and the ``order`` option described
below will also override the order in which states are defined in sls files.
2013-10-24 13:40:21 +00:00
If the classic ordering is preferred (lexicographic), then set
``state_auto_order`` to ``False`` in the master configuration file.
.. _ordering_requisites:
2012-02-17 18:41:48 +00:00
Requisite Statements
====================
.. note::
This document represents behavior exhibited by Salt requisites as of
version 0.9.7 of Salt.
Often when setting up states any single action will require or depend on
2013-10-24 13:40:21 +00:00
another action. Salt allows for the building of relationships between states
with requisite statements. A requisite statement ensures that the named state
is evaluated before the state requiring it. There are three types of requisite
statements in Salt, **require**, **watch** and **prereq**.
2012-02-17 18:41:48 +00:00
These requisite statements are applied to a specific state declaration:
.. code-block:: yaml
httpd:
pkg:
- installed
file.managed:
2012-02-17 18:41:48 +00:00
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd/httpd.conf
- require:
- pkg: httpd
In this example, the **require** requisite is used to declare that the file
2012-02-17 18:41:48 +00:00
/etc/httpd/conf/httpd.conf should only be set up if the pkg state executes
successfully.
The requisite system works by finding the states that are required and
executing them before the state that requires them. Then the required states
can be evaluated to see if they have executed correctly.
2014-01-20 19:08:59 +00:00
Require statements can refer to any state defined in Salt. The basic examples
are `pkg`, `service` and `file`, but any used state can be referenced.
In addition to state declarations such as pkg, file, etc., **sls** type requisites
are also recognized, and essentially allow 'chaining' of states. This provides a
mechanism to ensure the proper sequence for complex state formulas, especially when
the discrete states are split or groups into separate sls files:
.. code-block:: yaml
include:
- network
httpd:
pkg:
- installed
service:
- running
- require:
- pkg: httpd
- sls: network
In this example, the httpd service running state will not be applied
2014-09-11 12:45:44 +00:00
(i.e., the httpd service will not be started) unless both the httpd package is
2013-11-19 16:20:24 +00:00
installed AND the network state is satisfied.
2013-02-14 03:34:21 +00:00
.. note:: Requisite matching
Requisites match on both the ID Declaration and the ``name`` parameter.
2013-10-24 13:40:21 +00:00
Therefore, if using the ``pkgs`` or ``sources`` argument to install
a list of packages in a pkg state, it's important to note that it is
2013-11-19 16:20:24 +00:00
impossible to match an individual package in the list, since all packages
2013-10-24 13:40:21 +00:00
are installed as a single state.
2013-02-14 03:34:21 +00:00
2012-02-17 18:41:48 +00:00
Multiple Requisites
-------------------
The requisite statement is passed as a list, allowing for the easy addition of
more requisites. Both requisite types can also be separately declared:
.. code-block:: yaml
httpd:
pkg:
- installed
service.running:
2012-02-17 18:41:48 +00:00
- enable: True
- watch:
- file: /etc/httpd/conf/httpd.conf
- require:
- pkg: httpd
- user: httpd
- group: httpd
file.managed:
2012-02-17 18:41:48 +00:00
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd/httpd.conf
- require:
- pkg: httpd
user:
- present
group:
- present
2012-02-17 18:41:48 +00:00
In this example, the httpd service is only going to be started if the package,
2012-02-17 18:41:48 +00:00
user, group and file are executed successfully.
2014-06-05 22:24:59 +00:00
Requisite Documentation
-----------------------
2012-02-17 18:41:48 +00:00
2014-06-05 22:24:59 +00:00
For detailed information on each of the individual requisites, :ref:`please
look here. <requisites>`
2012-11-24 07:07:53 +00:00
2011-11-24 23:21:08 +00:00
The Order Option
================
Before using the `order` option, remember that the majority of state ordering
should be done with a :ref:`requisite-declaration`, and that a requisite
declaration will override an `order` option, so a state with order option
should not require or required by other states.
2011-11-24 23:21:08 +00:00
The order option is used by adding an order number to a state declaration
with the option `order`:
.. code-block:: yaml
2011-11-26 08:02:14 +00:00
2011-11-24 23:21:08 +00:00
vim:
pkg.installed:
2011-11-24 23:21:08 +00:00
- order: 1
By adding the order option to `1` this ensures that the vim package will be
installed in tandem with any other state declaration set to the order `1`.
Any state declared without an order option will be executed after all states
with order options are executed.
But this construct can only handle ordering states from the beginning.
2013-11-19 16:20:24 +00:00
Certain circumstances will present a situation where it is desirable to send
2013-10-24 13:40:21 +00:00
a state to the end of the line. To do this, set the order to ``last``:
.. code-block:: yaml
2011-11-26 08:02:14 +00:00
vim:
pkg.installed:
- order: last