Table des matières

Salt

Il s'agit d'un logiciel de gestion de configuration.

La gestion de configurations via un logiciel comme Salt ou Puppet présente un certain nombre d'avantages qui justifient pleinement l'adoption d'une telle organisation au sein d'un chaton Membre du collectif CHATONS :

Architecture

Un agent doit être déployé sur chaque machine à contrôler (un minion dans le jargon salt), qui se connectera à un maître via les ports 4505 et 4506. Avantage d'un minion qui se connecte à un maître plutôt que l'inverse : il n'y a qu'un endroit où on devra modifier le pare-feu.

Pourquoi Salt ?

Parmi les gestionnaires de configuration, il y a Salt, Puppet, Ansible et plein d'autres encore.

Framasoft a choisi Salt parce que sa syntaxe est relativement simple (± du YAML, pour ceux qui connaissent), et que sa courbe d'apprentissage est rapide.

Salt permet aussi d'envoyer directement des commandes sur les serveurs distants. Cela peut être très utile pour tester une configuration rapidement sans modifier les formules ou pour mettre à jour tous les serveurs en une seule commande.

Mise en place de Salt sur un serveur

La doc officielle : http://repo.saltstack.com/.

On prend ici pour exemple la machine omerine avec comme maître souane.chatons.org.

Exécutez les commandes suivantes (attention si vous êtes en Wheezy ou Jessie, il faut remplacer stretch dans la définition du dépôt de Salt) :

if [ ! -f /etc/apt/sources.list.d/salt.list ]
then
    wget -O - https://repo.saltstack.com/apt/debian/9/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
    echo "deb http://repo.saltstack.com/apt/debian/9/amd64/latest stretch main" > /etc/apt/sources.list.d/salt.list
fi

apt-get update

if [[ $(dpkg -l | grep -c salt-minion) -eq 0 ]]
then 
    apt-get install salt-minion debconf-util -y

    service salt-minion stop
    echo $(hostname -s) > /etc/salt/minion_id
    echo -e "master: souane.chatons.org\nbackup_mode: minion\nhash_type: sha256" > /etc/salt/minion.d/custom.conf
    service salt-minion start
fi

Pour Ubuntu, on ira voir http://docs.saltstack.com/en/latest/topics/installation/ubuntu.html, puis on créera le fichier /etc/salt/minion.d/custom.conf dans lequel on mettra :

master: souane.chatons.org

Sur la machine qui sert de maître Salt (souane), exécutez salt-key -L qui vous donnera toutes les clés acceptées ou non des minions :

Accepted Keys:
Unaccepted Keys:
omerine
Rejected Keys:

Ensuite, toujours sur le maître, exécutez salt-key -a omerine :

The following keys are going to be accepted:
Unaccepted Keys:
omerine
Proceed? [n/Y] y
Key for minion omerine accepted.

Vérification et lancement

Sur le maître, on vérifiera que tout fonctionne comme prévu avec salt omerine test.ping qui doit donner :

omerine:
    True

Si cela fonctionne comme prévu, on lance salt omerine state.highstate pour pousser l'ensemble des configurations sans attendre.

Commandes utiles

Voir la liste des machines up/down

salt-run manage.status

Mettre à jour toutes les machines

salt \* -b1 -t600 pkg.upgrade
# Pour tous les serveurs sauf vaiana
salt -C 'not vaiana' -b1 -t600 pkg.upgrade

Voir les paquets à mettre à jour sur tous les serveurs :

salt \*  pkg.list_upgrades false

Exécuter une commande shell sur le minion

salt minion cmd.run "echo toto"

Écriture des recettes

include:
  - monitoring.munin
  - .shinken

La différence entre les deux écritures est qu'on spécifie le chemin complet vers la recette d'un côté et un chemin relatif de l'autre. Dans ce dernier cas, il faut que shinken.sls soit dans le même répertoire que la recette qui fait l'include. La première syntaxe permet d'appeler une recette d'un autre répertoire.
Le découpage en include permet d'avoir des recettes atomiques, qui ne se rapporte qu'à un seul logiciel/une seule thématique au sein d'une recette plus globale.

/etc/fail2ban/jail.local:
  file.managed:
    - makedirs: True
    - source:
      - salt://fail2ban/files/jail.local
    - template: jinja
    - user: root
    - group: root
    - mode: 644
    - default:
      f2b: {{pillar['shinken-hosts'][grains['id']]['f2b']}}
      host: {{grains['id']}}
truc: {% if salt['file.file_exists' ]('/var/log/mail.log') -%}True{% else -%}False{% endif %}

Liens utiles

1)
fichiers décrivant les configurations à pousser, ± la configuration des configurations