Gérer basiquement Nginx avec Salt

By KrustyHack / 3 years ago

SaltStack, qu’est-ce que c’est ?

Comme exposé sur le site officiel SaltStack, c’est un outil rapide, flexible et extensible de gestion de systèmes pour l’automatisation de tâches d’administration.

Avec SaltStack, vous pouvez par exemple gérer des centaines de serveurs en quelques ligne de commande. Installer un service avec une conf par défaut, vérifier qu’un service est existant, qu’il est en fonctionnement, ajouter des utilisateurs à la chaîne, paramétrer des templates de vhost pour Nginx, … Les possibilités sont sans limites.

SaltStack fonctionne avec un système maître/minions et le maître peut également être minion de lui-même.

Au programme

  • Installation de SaltStack (serveur maître et serveur minion)
  • Préparation des instructions pour gérer Nginx (installation, contrôle de processus, …)
  • Test puis envoi de l’ordre au serveur minion
  • Contrôle de la bonne exécution de l’ordre

Installation de Salt

Pour tout problème, je vous conseille d’aller consulter la documentation officielle, notamment pour les dépendances qui ne seraient pas satisfaites. Pour ma part, je suis sur Ubuntu.

Sur le serveur maître

╭─root@krustyhack ~ 
╰─➤ apt-get install python-software-properties
╭─root@krustyhack ~ 
╰─➤ add-apt-repository ppa:saltstack/salt
╭─root@krustyhack ~ 
╰─➤ apt-get update
╭─root@krustyhack ~ 
╰─➤ apt-get install salt-master salt-minion

Sur le serveur minion

╭─root@krustyhack ~ 
╰─➤ apt-get install python-software-properties
╭─root@krustyhack ~ 
╰─➤ add-apt-repository ppa:saltstack/salt
╭─root@krustyhack ~ 
╰─➤ apt-get update
╭─root@krustyhack ~ 
╰─➤ apt-get install salt-minion

Configuration de Salt

Sur le serveur maître

Par défaut la configuration se trouve dans /etc/salt/master. Personnellement je n’ai quasiment rien touché, hormis la configuration du file system pour les states files:

[...]
#####      File Server settings      #####
##########################################
# Salt runs a lightweight file server written in zeromq to deliver files to
# minions. This file server is built into the master daemon and does not
# require a dedicated port.

# The file server works on environments passed to the master, each environment
# can have multiple root directories, the subdirectories in the multiple file
# roots cannot match, otherwise the downloaded files will not be able to be
# reliably ensured. A base environment is required to house the top file.
# Example:
file_roots:
  base:
    - /srv/salt/states
#   dev:
#     - /srv/salt/dev/services
#     - /srv/salt/dev/states
#   prod:
#     - /srv/salt/prod/services
#     - /srv/salt/prod/states
[...]

Vous pouvez modifier à votre convenance et ajouter des chemins où SaltStack devra chercher les states files. Si vous ne savez pas ce qu’est les states, n’hésitez pas à aller voir la documentation.

Une fois la configuration prête, vous pouvez redémarrer le salt-master:

╭─root@krustyhack ~ 
╰─➤ service salt-master restart

Sur le serveur minion

Par défaut la configuration se trouve dans /etc/salt/minion. Il faut notamment paramétrer l’adresse du serveur master, éventuellement le port si vous avez changé celui d’origine et l’id du minion (ce qui permet de se faire connaître du master):

##### Primary configuration settings #####
##########################################

# Per default the minion will automatically include all config files
# from minion.d/*.conf (minion.d is a directory in the same directory
# as the main minion config file).
#default_include: minion.d/*.conf

# Set the location of the salt master server, if the master server cannot be
# resolved, then the minion will fail to start.
master: MONSERVEURMASTER.COM

# Set whether the minion should connect to the master via IPv6
#ipv6: False

# Set the number of seconds to wait before attempting to resolve
# the master hostname if name resolution fails. Defaults to 30 seconds.
# Set to zero if the minion should shutdown and not retry.
# retry_dns: 30

# Set the port used by the master reply and authentication server
master_port: 4506

[...]

# Explicitly declare the id for this minion to use, if left commented the id
# will be the hostname as returned by the python call: socket.getfqdn()
# Since salt uses detached ids it is possible to run multiple minions on the
# same machine but with different ids, this can be useful for salt compute
# clusters.
id: MONIDMINION
[...]

Une fois la configuration prête, on redémarre salt-minion:

╭─root@krustyhack ~ 
╰─➤ service salt-minion restart

Principe du maître des clés

Un des principes fondamentaux de SaltStack c’est la gestion des clés. Le serveur maître gère les clés des minions, acceptant ou refusant celles-ci. Ces clés, quand elles sont acceptées par le maître, permettent à celui-ci de communiquer des ordres aux minions.

On liste donc, sur notre serveur master, les clés:

╭─root@krustyhack ~ 
╰─➤ salt-key -L
Accepted Keys:
Unaccepted Keys:
master
minion1
Rejected Keys:

On voit qu’il y a 2 minions qui n’ont pas encore été acceptés. Il s’agit du serveur maître et du serveur minion que nous venons juste d’installer et de lancer. On les accepte donc:

╭─root@krustyhack ~ 
╰─➤ salt-key -A

Le -A demande au maître d’accepter toutes les clés en attente. On peut également accepter clé par clé avec l’option -a [IDDUMINION].

On peut désormais paramétrer des states pour gérer notre nouveau minion ou communiquer directement avec lui.

Pinger le serveur par exemple:

╭─root@krustyhack ~ 
╰─➤ salt \minion1 test.ping
web1:
    True

Lui demander de nous parler:

╭─root@krustyhack ~ 
╰─➤ salt \minion1 cmd.run "echo 'Hi ! Im a minion'"
web1:
    Hi ! Im a minion

Bien évidemment, le plus intéressant c’est le principe des states SaltStack. Ce sont des instructions sous format YAML qui nous permettent d’effectuer des actions sur nos minions. Nous allons, pour mettre en pratique le principe, créer une procédure pour gérer Nginx sur nos minions.

Gérer Nginx avec Salt

Comme spécifié dans notre configuration du master, le dossier où se situent les states files est:

file_roots:
  base:
    - /srv/salt/states

Bien évidemment celui-ci peut être changé et on peut même ajouter une multitude de dossier qui seront utilisés dans l’ordre (genre j’ai pas de fichier dans mon premier dossier bim SaltStack va voir le deuxième, etc… Pratique !).

On prépare le states file dans /srv/salt/states/nginx et on le nomme init.sls (il me semble que c’est la nom de base normé pour SaltStack, même si l’ont peut par la suite la nommer autrement).

nginx:
  pkg:
    - installed
  service:
    - running

Donc là on demande à SaltStack de gérer le paquet Nginx. Celui-ci doit, dans l’ordre:

  • être installé
  • être en fonctionnement

Vous avez donc désormais un fichier /srv/salt/states/nginx/init.sls que l’on va pouvoir faire exécuter mais en mode test=true pour l’instant:

╭─root@krustyhack ~ 
╰─➤ salt \minion1 state.sls nginx test=true
minion1:
----------
          ID: nginx
    Function: pkg.installed
      Result: None
     Comment: The following packages are set to be installed/updated: nginx.
     Changes:   
----------
          ID: nginx
    Function: service.running
      Result: False
     Comment: The named service nginx is not available
     Changes:   

Summary
------------
Succeeded: 0
Failed:    1
Not Run:   1
------------
Total:     2

On voit donc que Nginx n’est pas encore installé et qu’il ne tourne pas. On relance donc notre commande sans le mode test:

╭─root@krustyhack ~ 
╰─➤ salt \minion1 state.sls nginx          
minion1:
----------
          ID: nginx
    Function: pkg.installed
      Result: True
     Comment: The following packages were installed/updated: nginx.
     Changes:   
              ----------
              fontconfig-config:
                  ----------
                  new:
                      2.11.0-0ubuntu4.1
                  old:
                      
              fonts-dejavu-core:
                  ----------
                  new:
                      2.34-1ubuntu1
                  old:
                      
              geoip-database:
                  ----------
                  new:
                      20140313-1
                  old:
                      
              libfontconfig1:
                  ----------
                  new:
                      2.11.0-0ubuntu4.1
                  old:
                      
              libfreetype6:
                  ----------
                  new:
                      2.5.2-1ubuntu2.2
                  old:
                      
              libgd3:
                  ----------
                  new:
                      2.1.0-3
                  old:
                      
              libgeoip1:
                  ----------
                  new:
                      1.6.0-1
                  old:
                      
              libjbig0:
                  ----------
                  new:
                      2.0-2ubuntu4.1
                  old:
                      
              libjpeg-turbo8:
                  ----------
                  new:
                      1.3.0-0ubuntu2
                  old:
                      
              libjpeg8:
                  ----------
                  new:
                      8c-2ubuntu8
                  old:
                      
              libtiff5:
                  ----------
                  new:
                      4.0.3-7ubuntu0.1
                  old:
                      
              libvpx1:
                  ----------
                  new:
                      1.3.0-2
                  old:
                      
              libxpm4:
                  ----------
                  new:
                      1:3.5.10-1
                  old:
                      
              libxslt1.1:
                  ----------
                  new:
                      1.1.28-2build1
                  old:
                      
              nginx:
                  ----------
                  new:
                      1.4.6-1ubuntu3.1
                  old:
                      
              nginx-common:
                  ----------
                  new:
                      1.4.6-1ubuntu3.1
                  old:
                      
              nginx-core:
                  ----------
                  new:
                      1.4.6-1ubuntu3.1
                  old:
                      
----------
          ID: nginx
    Function: service.running
      Result: True
     Comment: Started Service nginx
     Changes:   
              ----------
              nginx:
                  True

Summary
------------
Succeeded: 2
Failed:    0
------------
Total:     2

Et voilà ! Notre paquet Nginx est installé et en fonctionnement:

╭─root@krustyhack ~ 
╰─➤ salt \minion1 cmd.run "curl -s 127.0.0.1"
minion1: Welcome to nginx!

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com. Thank you for using nginx.

Aller plus loin

Alors là évidemment on a vu la base de SaltStack avec un exemple tout bête. Il reste plusieurs éléments à configurer comme pouvoir gérer la configuration de Nginx ou les vhosts via SaltStack. Rassurez-vous, c’est aussi simple que ce 1er tutorial rapide.

Leave a comment: