Correction#
Commande via salt-master
#
Grains#
Listez les grains disponibles sur les minions
# liste des grains
salt "*" grains.ls
# liste des grains avec leurs valeurs
salt "*" grains.items
# récupérer les valeurs d'un grain
salt "*" grains.item os
Ciblage#
# tout les minions
salt "*" test.ping
# les minions dont le nom commence par salt-minion-
salt "salt-minion-*" test.ping
# salt-minion-2 et salt-minion-3
salt ""salt-minion-[2,3] test.ping
# les minons Ubuntu
salt -G os:Ubuntu test.ping
Copier des fichiers#
Création du fichier
cat > /tmp/hello_word.sh <<EOF
#!/bin/bash
echo "\$(hostname): Hello world!"
EOF
Copie du fichier
salt-cp "*" /tmp/hello_word.sh /tmp/hello_word.sh
Exécuter des commandes#
salt "*" cmd.run date
salt "*" cmd.run whoami
salt "*" cmd.run hostname
salt "*" cmd.run "bash /tmp/hello_word.sh"
Installer des paquets#
# installation de tree avec cmd.run
salt "*" cmd.run "apt-get update && apt-get install -y tree"
# installation de htop avec pkg.install
salt "*" pkg.install htop
États (states)#
Installer et configurer des paquets#
Fichier vimrc
à mettre dans /srv/salt/vimrc
" generated by salt
set background=dark
syntax on
filetype plugin indent on
set tabstop=2 softtabstop=2 expandtab shiftwidth=2 smarttab
set modeline
set nocompatible
let g:sls_use_jinja_syntax = 1
Fichier editor.sls
à mettre dans /srv/salt/editor.sls
vim:
pkg.installed:
- name: vim
- name: vim-addon-manager
vimrc:
file.managed:
- name: /root/.vimrc
- source: salt://vimrc
- require:
- vim
Appliquer le state
# tester
salt "*" state.apply editor test=true
# appliquer
salt "*" state.apply editor
Fichier /srv/salt/top.sls
base:
"*":
- editor
Fichier /srv/salt/redis.sls
redis:
pkg.installed:
- name: redis
Fichier /srv/salt/top.sls
base:
"*":
- editor
"salt-minion-2":
- redis
Fichier /srv/salt/nginx.sls
gpg:
pkg.installed:
- name: gpg
nginx:
pkgrepo.managed:
- name: deb http://nginx.org/packages/{{ grains['os'] | lower }} {{ grains['oscodename'] }} nginx
- gpgcheck: 1
- key_url: https://nginx.org/keys/nginx_signing.key
- require:
- gpg
pkg.installed:
- refresh: 1
- name: nginx
Fichier /srv/salt/remove-nginx.sls
remove-nginx:
pkgrepo.absent:
- name: deb http://nginx.org/packages/{{ grains['os'] | lower }} {{ grains['oscodename'] }} nginx
pkg.purged:
- name: nginx
Paramétrer les états avec Jinja#
Gestion des clés SSH#
Copier les clés SSH dans le répertoire de salt
cp -r /opt/ssh_keys /srv/salt/ssh_keys
Fichier /srv/salt/ssh.sls
{% set users = ('alice', 'bob', 'carole') %}
{% set removed_users = ('mallory', 'eve') %}
{% for user in users %}
ssh-{{ user }}:
ssh_auth.present:
- user: root
- source: salt://ssh_keys/{{ user }}.pub
{% endfor %}
{% for user in removed_users %}
ssh-{{ user }}:
ssh_auth.absent:
- user: root
- source: salt://ssh_keys/{{ user }}.pub
{% endfor %}
Gestions de fichiers#
Fichier /srv/salt/vimrc-bob-alice-root.sls
{% set users = ('alice', 'bob', 'root') %}
{% for user in users %}
vimrc-{{ user }}:
file.managed:
{% if user == "root" %}
- name: /root/.vimrc
{% else %}
- name: /home/{{ user }}/.vimrc
{% endif %}
- source: salt://vimrc
- user: {{ user }}
- group: {{ user }}
- mode: 600
{% endfor %}
Fichier /srv/salt/vimrc-all-users.sls
{% for user in salt["user.list_users"]() %}
{% if salt["user.info"](user).home.startswith("/home") or user == "root" %}
vimrc-{{ user }}:
file.managed:
{% if user == "root" %}
- name: /root/.vimrc
{% else %}
- name: /home/{{ user }}/.vimrc
{% endif %}
- source: salt://vimrc
- user: {{ user }}
- group: {{ user }}
- mode: 600
{% endif %}
{% endfor %}
Fichier /srv/salt/index.html.jinja2
<!DOCTYPE html>
<html>
<body>
<h1>{{username}}</h1>
<p>Bonjour, je m'appelle {{username}}</p>
</body>
</html>
Fichier /srv/salt/html.sls
html-{{ user }}:
file.managed:
- name: /home/{{ user }}/html/index.html
- makedirs: True
- template: jinja
- source: salt://index.html.jinja2
- user: {{ user }}
- group: {{ user }}
- defaults:
username: {{ user }}
{% endif %}
{% endfor %}
Configuration du salt-master#
Fichier /etc/salt/master
file_roots:
base:
- /srv/salt/states
pillar_roots:
base:
- /srv/salt/pillars
pillar_merge_lists: True
Déplacer les states actuels dans le répertoire /srv/salt/states
mkdir /srv/salt/states
mv * /srv/salt/states
mkdir /srv/salt/pillars
Redémarrer le master
systemctl restart master
Pillars#
Séparer les états et les valeurs des paramètres#
Fichier /srv/salt/pillars/ssh_users.sls
ssh_users:
allowed_users:
- alice
- bob
- carole
denied_users:
- eve
- mallory
Raffraichir les pillars
salt '*' saltutil.refresh_pillar
Lister les pillars
salt "*" pillar.ls
salt "*" pillar.get ssh_users
Ficher /srv/salt/states/ssh.sls
{% for user in pillar["ssh_users"]["allowed_users"] %}
ssh-{{ user }}:
ssh_auth.present:
- user: root
- source: salt://ssh_keys/{{ user }}.pub
{% endfor %}
{% for user in pillar["ssh_users"]["denied_users"] %}
ssh-{{ user }}:
ssh_auth.absent:
- user: root
- source: salt://ssh_keys/{{ user }}.pub
{% endfor %}
Définir des rôles et des groupes de minions#
Fichier pillars/role/editor.sls
role:
- editor
Fichier pillars/role/redis.sls
role:
- redis
Fichier pillars/role/nginx.sls
role:
- nginx
Fichier pillars/top.sls
base:
"*":
- ssh_users
- role/editor
"salt-minion-1":
- role/nginx
"salt-minion-2":
- role/redis
"salt-minion-3":
- role/redis
- role/nginx
Raffraichir les pillars
salt '*' saltutil.refresh_pillar
Lister les pillars
salt "*" pillar.ls
salt "*" pillar.get role
Ne diffuser que les informations nécessaires#
Fichier pillars/credentials/prod.sls
password:
- prod:azerty123
Fichier pillars/credentials/recette.sls
password:
- recette:qwerty456
Fichier pillars/top.sls
base:
"*":
- ssh_users
- role/editor
"salt-minion-1":
- role/nginx
- credentials/prod
"salt-minion-2":
- role/redis
- credentials/prod
"salt-minion-3":
- role/redis
- role/nginx
- credentials/recette
Fichier states/password.sls
{% if "password" in pillar %}
password:
file.managed:
- name: /root/.password
- contents_pillar: password
- user: root
- group: root
- mode: 400
{% endif %}
Publisher ACL#
Fichier /etc/salt/master
publisher_acl:
bob:
- pkg
alice:
- test.ping
- salt-minion-3:
- pkg
Changement des permissons des répertoires salt
chmod 755 /var/cache/salt /var/cache/salt/master /var/cache/salt/master/jobs /var/run/salt /var/run/salt/master
Tester avec l’utilisateur bob
# connexion avec l'utilisateur bob
sudo -u bob -i
salt "*" test.ping
salt "*" pkg.install tree
Formulas#
Cloner le dépôt de la formula dans /srv/salt/formulas
mkdir -p /srv/salt/formulas
cd /srv/salt/formulas
git clone https://github.com/saltstack-formulas/apache-formula.git
Ajouter le dépôt dans la configuration de salt /etc/salt/master
file_roots:
base:
- /srv/salt/states
- /srv/salt/formulas/apache-formula
Redémarrer le master
systemctl restart salt-master
Ajouter l’état dans le fichier /srv/salt/top.sls
base:
"salt-minion-1":
- apache