SALTSTACK
1 SALTSTACK
Quand on administre plusieurs serveurs, il y a des tâches qu’on effectue sur chacun d’eux de manière répétées.
Quand on a 2 ou 3 serveurs, ça va, mais quand on gère 10, 100 ou 1000 serveurs, la tâche est impossible.
Saltstack (ou salt) est un gestionnaire de configuration, de provisionning, de commande à distance et de déploiement de fichiers.

L’outils fonctionne sur le principe du client/serveur, avec une machine master qui dispose de toutes les configurations et les déploie vers les clients, qui sont appelés minions.

Les minions peuvent utiliser fonctionner sur plusieurs systèmes d’exploitation : debian, RedHat, et même Windows.
Les minions et le master s’identifient par clé privée, communiquent via ZeroMQ et échange des informations chiffrées en AES.
Il est également possible d’avoir plusieurs Masters ou d’utiliser salt-minion sans aucun master.
1.1 PRINCIPE DE FONCTIONNEMENT

Le principe est simple :
le master envoie des commandes aux minions qui lui retournent les résultats de ces commandes
Le schéma suivant présente plus en détails le mode de communication entre un master et son minion.

2 INSTALLATION
2.1 SERVEUR (MASTER)
Travailler sur Debian 8, on va utiliser le paquet généré et maintenu par Salt.
On commence par ajouter la clé du serveur de dépôt :
# wget −O − http://repo.saltstack.com/apt/debian/8/amd64/latest/SALTSTACK−GPG−KEY.pub \
| apt−key add −
# echo « deb http://repo.saltstack.com/apt/debian/latest jessie main » > \
/etc/apt/sources.list.d/saltstack.list
On peut ensuite passer à la phase d’installation du master :
# apt−get update ; apt−get install salt−master
Quelques commandes utiles :
# salt−key −L # liste les cles
# salt−key −a minion1 # accepte minion1
# salt ’∗’ test.ping # on verifie que nos minions repondent
# salt ’∗’ cmd.run ‘uname −a‘ # lancer une commande sur tous les minions
# salt ’∗’ cmd.run ‘echo « Le master me controle ! »‘
# salt minion1 network.ipaddr eth0 # donne l’IP d’eth0
2.2 CLIENT (MINION)
Tout comme pour le serveur, on commence par ajouter la clé du serveur de dépôt :
# wget −O − http://repo.saltstack.com/apt/debian/8/amd64/latest/SALTSTACK−GPG−KEY.pub \
| apt−key add −
# echo « deb http://repo.saltstack.com/apt/debian/latest jessie main » > \
/etc/apt/sources.list.d/saltstack.list
On passe à l’installation :
# apt−get install salt−minion
# apt−get install salt−ssh
# systemctl restart salt−minion
On modifie l’identifiant du serveur client dans /etc/salt/minion_id
Dans le cas présent : myserver.nosland.com
On peut ensuite redémarrer le minion :
# systemctl restart salt−minion
2.2.1 MODIFICATION SUR LE SERVEUR
En listant les clés, on voit que le minion myserver.nosland.com est en mode “unaccepted” :
# salt−key −L
Accepted Keys:
salt−minion.nosland.com
salt.nosland.com
Denied Keys:
(none)
Unaccepted Keys:
myserver.nosland.com
Rejected Keys:
(none)
# salt−key −a myserver.nosland.com
La dernière commande permet d’accepter le minion.
On peut passer à la phase de configuration des services.
3 CONFIGURATION ET UTILISATION
Le but recherché est de déployer une configuration minimale sur des serveurs afin de leur garantir un même état et une certaine cohérence :
- même version de paquets
- même fichier de configuration
- même utilisateurs admin
Pour cela, nous allons utiliser des States.
Il s’agit de fichier texte en YAML (Yes Another Markup Language ! !) assez simple à lire et à comprendre où on décrit l’état voulu pour notre serveur.
Le placement de ces fichiers doit être structuré afin de garantir une certaine cohérence.
Ces states, de base, se trouvent dans /srv/salt.
Le fichier top.sls référence l’ensemble des configurations disponibles :
base:
’myserver.nosland.com’:
− apache2
Dans le cas présent, on déclare un service apache2 utilisable par le minion myserver.nosland.com.
3.1 INSTALLATION D’UN PACKAGE
On souhaite installer le paquet apache2 sur myserver.nosland.com.
On crée le dossier /srv/salt/apache2 et le fichier /srv/salt/apache2/init.sls :
apache2: # ID declaration
pkg: # state declaration
− installed # function declaration
Pour réaliser l’installation sur le minion, il suffit ensuite d’exécuter la commande :
# salt myserver.nosland.com state.apply
On peut vérifier l’installation d’apache2 sur myserver.nosland.com.
3.2 AUTO DEMARRAGE D’UN SERVICE
Le paquet apache2 est installé sur le minion, mais il n’est pas lancé !
Pour cela, on modifie le fichier /srv/salt/apache2/init.sls :
apache2: # ID declaration
pkg.installed: []
service.running:
− require:
− pkg: apache2
Pour réaliser la configuration sur le minion, il suffit ensuite d’exécuter la commande :
# salt myserver.nosland.com state.apply
3.3 PERSONNALISATION D’UN PAQUET
Notre service apache2 fonctionne.
On souhaite modifier la page par défaut /var/www/html/index.html :
<html>
<body>
Page en construction…
</body>
</html>
On place ce fichier dans le dossier /srv/salt/apache2/files/
On modifie ensuite le fichier /srv/salt/apache2/init.sls :
apache2:
pkg.installed: []
service.running:
− require:
− pkg: apache2
/var/www/html/index.html:
file: # state declaration
− managed # function
− source: salt://apache2/files/index.html # function arg
− require: # requisite declaration
− pkg: apache2
Pour réaliser la configuration sur le minion, il suffit ensuite d’exécuter la commande :
# salt myserver.nosland.com state.apply
4 PILLAR
Les pillar permettent de placer des configurations spécifiques sur des minions.
Le dossier de configuration se trouve dans /srv/pillar, et le fichier de base est /srv/pillar/top.sls
4.1 UTILISATEURS
Les utilisateurs à configurer sur les minions se placent dans /srv/pillar/users.
Dans l’exemple suivant /srv/pillar/users/nospheratus.sls, on déclare toutes les informations personnelles de l’utilisateur nospheratus:
users:
nospheratus:
fullname: NosPHeratus NPH
password: $6$htudop$JtgUjOFuioHHJsdtkeazdlOjkj..AXH4iKjOO/
home: /home/nospheratus
sudouser: True
sudo_rules:
− ALL=(ALL) ALL
shell: /bin/bash
groups:
− adm
− sudo
ssh_key_type: rsa
ssh_auth:
− ssh−rsa AAAAC5GhuR2pl2FAAAAEAFACAAARASD3YlAiCGah48lXWbotiq6FZQZdE6FdqXec4oVrKH4Y yeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXD5ytDZkAfX9 nospheratus@nosland
Pour réaliser la configuration sur le minion, il suffit ensuite d’exécuter la commande :# salt myserver.nosland.com state.apply
5 EXEMPLES DE STATES
5.1 WORDPRESS
Le state wordpress a pour but de pouvoir installer et configurer le gestionnaire de contenu Web automatiquement sur un minion.
Dans le dossier de configuration de Salt /src/salt, on y place le state wordpress/init.sls :
# Creation de l’utilisateur local wordpress
wordpress:
user.present:
− fullname: Utilisateur pour Wordpress
− home: /home/wordpress
− shell: /bin/bash
− password: None
# Creation de la base de donnees
wordpress_db:
mysql_user.present:
− name: wordpress
− password: {{ pillar[’SQL_WORDPRESS_PASSWORD’] }}
− connection_user: root
− connection_pass: {{ pillar[’SQL_ROOT_PASSWORD’] }}
− connection_charset: utf8
mysql_database.present:
− name: wordpress
− connection_user: root
− connection_pass: {{ pillar[’SQL_ROOT_PASSWORD’] }}
− connection_charset: utf8
mysql_grants.present:
− database: wordpress.∗
− grant: ALL PRIVILEGES
− user: wordpress
− host: ’%’
− connection_user: root
− connection_pass: {{ pillar[’SQL_ROOT_PASSWORD’] }}
− connection_charset: utf8
# Archive eventuelle de l’ancienne version de WP
archive_wordpress:
cmd.run:
− name: ’mv {{ pillar[’SITE_NAME’] }} {{ pillar[’SITE_NAME’] }}_‘date +%F‘’
− cwd: /var/www/html/
# Telechargement de la derniere version de wordpress
get_wordpress:
cmd.run:
− name: ’wget http://wordpress.org/latest.tar.gz && tar xvzf latest.tar.gz && rm latest.tar.gz \
&& mv wordpress {{ pillar[’SITE_NAME’] }}’
− cwd: /var/www/html/
# Installation de WP−Cli
get_wp−cli:
cmd.run:
− name: ’curl −O https://raw.githubusercontent.com/wp−cli/builds/gh−pages/phar/wp−cli.phar \
&& chmod +x wp−cli.phar’
− cwd: /home/wordpress/
− user: wordpress
# Ajout du lien symbolique dans le PATH par defaut
/usr/local/bin/wp:
file:
− symlink
− target: /home/wordpress/wp−cli.phar
# Creation du fichier de configuration wp−config.php
config_wordpress:
cmd.run:
− cwd: /var/www/html/{{ pillar[’SITE_NAME’] }}/
− name: ’/usr/local/bin/wp core config −−dbname=wordpress −−dbuser=wordpress \
−−dbpass={{ pillar[’SQL_WORDPRESS_PASSWORD’] }} −−allow−root \
−−path=/var/www/html/{{ pillar[’SITE_NAME’] }}’
# Installation de wordpress
install_wordpress:
cmd.run:
− cwd: /var/www/html/{{ pillar[’SITE_NAME’] }}/
− name: ’/usr/local/bin/wp core install \
−−url=http://{{ pillar[’SITE_SERVEUR’] }}/{{ pillar[’SITE_NAME’] }} \
−−title= »{{ pillar[’SITE_TITRE’] }} » −−admin_user=admin −−admin_password=password \
−−admin_email={{ pillar[’SITE_WEBMASTER’] }} −−allow−root \
−−path=/var/www/html/{{ pillar[’SITE_NAME’] }}’
# Ajout de parametres a la config
config_wordpress_add:
cmd.run:
− cwd: /var/www/html/{{ pillar[’SITE_NAME’] }}/
− name: ’echo « define(’’WP_SITEURL’’,’’{{ pillar[’SITE_URL’] }}’’); » >> wp−config.php’
Plusieurs paramètres sont à renseigner dans un pillar :
SQL_ROOT_PASSWORD: mot de passe root de mysql
SQL_WORDPRESS_PASSWORD: mot de passe de l’utilisateur WP
SITE_NAME: nom/URI du site web
SITE_WEBMASTER: adresse de courriel du webmaster
SITE_TITRE: titre du site WP
SITE_SERVEUR: adresse IP/nom du serveur WP