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