SALTSTACK

18 décembre 2018 Non Par nospheratus

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.

PIC
https://saltstack.com

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.

PIC

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

PIC

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.

PIC

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