Configuration
Written in YAML files, located in /etc/salt/master and /etc/salt/master.d/
Master configuration: /etc/salt/master
Master configuration overrides: /etc/salt/master.d/myoverrides.conf
Minion configuration: /etc/salt/minion
Minion configuration overrides: /etc/salt/minion.d/myoverrides.conf
Overrides require .conf suffix, otherwise they are not included and nothing is logged.
States
Defined using *.sls files, located in state directories listed in file_roots configuration option (/srv/salt/ by default).
The state directories are also called State Tree
Example of state file contents:
funny_user_setup: # state ID
user.present: # <state module>.<function>
- name: cool_guy # <function's> arguments
- fullname: Cool Guy Jr
- shell: /bin/bash
- home: /home/cool_guy
Given the above file_roots configuration this state file must be located in /srv/salt/the_state.sls or /srv/salt/the_state/init.sls,
(the init.sls is treated as parent directory).
The sls filename cannot contain dots (other than suffix .sls). Filename with dots is expanded by salt as directories, e.g.,
the_state.something.sls will be understood as /srv/salt/the_state/something.sls.
When both /srv/salt/the_state.sls or /srv/salt/the_state/init.sls exist, the the_state/init.sls is ignored.
By default the sls file represents python dictionaries, lists, strings and numbers only.
Salt also requires special file to exist in top level of State Tree. This special file is responsible for matching states to actual machines.
It is called top.sls, example:
base:
'machine':
- the_state
For more information about Top File structure and state definition refer to Targeting and Top file
saltenv
file_roots configuration contains environment specification. In order to specify multiple environments list them along with their directories containing states:
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
It is possible to specify directories multiple times in order to 'reuse' some states from other environments:
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
- /srv/salt/base
Custom states
In order to create your own states, put them in _states under State Tree root. This directory is configured to be synchronized
to minions upon state.highstate or saltutil.sync_all calls.
Pillar
Defined in similar way as state files, located in directories listed in pillar_roots configuration option.
There is no enforced pillar data syntax, given default renderer the pillar must be just provided as YAML file.
Example pillar data file:
some_user_data:
mail: cool_guy@o2.io
home_dir: /home/cool_guy
The top.sls file is also expected to exist in pillar_roots top directory.
Custom pillar
Documentation refers to custom pillars as external pillars.
It is possible to extend Pillar subsystem to fetch data from arbitrary sources. The requirement is to implement:
def ext_pillar( minion_id, pillar, *args, **kwargs ):
...
return pillar_dict
The external pillar must be configured in Salt Master configuration first. Some already existing custom pillars deserve special mentions.
git_pillar
file_tree
ext pillar: file_tree
File becomes the value of key
Under the root_dir you must have either hosts/minion_id folder or nodegroups/nodegroup folder
Data is available to matching hosts.
Example configuration:
ext_pillar:
- file_tree:
root_dir: /path/to/root/directory
keep_newline:
- files/testdir/*
gpg renderer
The pillar values can be encrypted using GPG.
The keypair (without passphrase) must be either setup or imported beforehand on the master node (or on masterless node).
It is possible to change default location of gpgkeys using: gpg_keydir configuration option.
To create encrypted secret: cat secret_file | gpg --armor --trust-model always -r pillargpg --encrypt --homedir ~/somewhere/the/keys
Dunder dictionaries
Some of the Salt modules are 'wrapped' within special dunder dictionaries. These special dictionaries provide access to Salt different modules.
| Dictionary name | Available in | Information |
|---|---|---|
| __opts__ | Loader modules | configuration file contents |
| __salt__ | Execution, State, Returner, Runner, SDB modules | execution modules |
| __grains__ | Execution, State, Returner, External Pillar modules | minion grains data |
| __pillar__ | Execution, State, Returner modules | pillar data |
| __context__ | Execution, State modules | all-purpose dict, that exists during all state runs |
Using dunder dictionaries
Jinja2+YAML
Double underscores are omitted.
apache:
pkg.installed:
- name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}
{% for mnt in salt['cmd.run']('ls /dev/data/moose*').split() %}
/mnt/moose{{ mnt[-1] }}:
mount.mounted:
- device: {{ mnt }}
- fstype: xfs
- mkmnt: True
{% endfor %}
py
#!py
def run():
states = {}
swaps = __salt__['mount.swaps']()
for swap, dev in swaps.items():
states["kubeadm_disable_swap_{}".format(swap)] = {
'module.run': [
{ 'mount.swapoff': [
{ 'name': swap },
]},
{ 'require_in': [
{ 'pkg': "kubeadm" }
]}
]
}
return states
Fileserver
All of the above configuration samples assumed filesystem to be used as primary sls storage.
Actually fileserver is also a Salt module.
Thus it is possible to create your own (place it in _fileserver directory under State Tree root).
In order to enable different fileserver, switch them on in master configuration:
fileserver_backend:
- roots
It is possible to specify multiple backends, they are merged together. The sls files that are same within backends
are taken in the order of their definition (fileserver_backend is a list after all).
Example:
fileserver_backend:
- roots
- gitfs
If the top.sls file exists in both gitfs and roots top directories then the roots one will be used.
gitfs
Enabled with:
fileserver_backend:
- gitfs
Allows to pull state and pillar definitions from git repositories.
Reactor
Part of the Salt, that starts different actions upon fired events. The configuration contains the list of handled events
with different sls files run as a reaction.
reactor:
- 'salt/job/*/ret/*':
- salt://do_something_after_job.sls
- /full/path/to/file.sls
By default this is configured in /etc/salt/master and /etc/salt/master.d/reactor.conf.
Reactions can be specified using /full/path/notation or relative to State Tree: salt://
Thorium
Cloud
Extending Salt
It is very easy to create your own Salt modules or even alter existing ones. All of the module changes must be synchronized
to minions prior to use (this happens automatically only for state.highstate call). By default, extensions must be placed in directories in State Tree
root, following naming convention: _<module_type>.
It is also possible to define custom extensions in different places, given proper extension_modules configuration.
Anything from salt module can be customized.
Salt SSH
No software needs to be installed on managed host, on the Salt Master side: salt-ssh package is required.
Configure /etc/salt/roster file with remote host details, the working roster file:
minion:
host: minion.local
user: dev
passwd: password # required even if keys are used
sudo: true
tty: true
minion_opts:
log_level: debug
log_level_logfile: debug
log_file: ../../salt-ssh.log # nice trick from https://twitter.com/SaltTips/status/1146306964026253312
The remote host must have at least python-minimal installed, the passwd is always mandatory (since on the remote the sudo is required)
Read more in Salt-SSH