Ansible est une solution de gestion de configuration (open source). Ansible se connecte avec le protocole SSH sur des machines Linux ou Windows. Il peut effectuer un grand nombre de tâche et gérer la configuration des fichiers. Ansible n’utilise pas directement les commandes Linux ou Windows, il possède sont propre langage. Un langage très complet qui fournis beaucoup de possibilité et ajoute un grand nombre d’options pour chaque tache.

Dans ce tutoriel, nous allons utilisée Ansible pour automatiser la création d’un conteneur WordPress (avec un serveur web nginx). La base de données de ce site WordPress sera externe à ce conteneur.

Avant de commencer à utiliser Ansible, il faut tout d’abord établir une connexion SSH entre le conteneur Ansible et le conteneur sur lequel on veut gérer la configuration (on l’appellera Client pour simplifier). Dans ce tutoriel, le conteneur Ansible a pour IP 10.10.111.110 et le conteneur client 10.10.111.141.

Connexion SSH par clés

On commence par installer le paquet « openssh-server » sur le client et « openssh-client » sur Ansible. On peut tout d’abord tester la connexion de notre client SSH vers le serveur SSH (client Ansible) :

#ssh root@10.10.111.141

CaptureAnsible1

On obtient donc le message si dessus qui nous informe que l’authentification par clés n’a pas été établie. Un message nous demande de continuer et si l’on choisit de continuer (YES), on peut se connecter en SSH avec le mot de passe root. Cela montre que la connexion SSH peut être établie entre les deux conteneur, mais nous voulons que la connexion se fasse avec des clés et sans mot de passe. Pour cela, on commence par générer une paire de clés RSA publique/privée sur le client SSH (le conteneur Ansible) :

# ssh-keygen -t rsa

Puis on appuie 3 fois sur la touche entrée pour sauvegarder les clés dans le fichier par défaut et pour ne définir aucune passphrase.

CaptureAnsible2.PNG

Ensuite, on se rend dans le dossier « ~/.ssh » où se trouve notre clé publique. Et on envoie la clé publique sur le serveur SSH :

#ssh-copy-id -i id_rsa.pub root@10.10.111.141

A partir de maintenant, lorsque l’on se connecte en SSH au client Ansible, la connexion s’effectue directement sans demande de mot de passe.

Installation d’Ansible

L’installation d’Ansible est assez simple sous Debian 9, il suffit de faire un :

#apt-get install ansible

Pour plus d’informations sur l’installation d’Ansible, il faut se rendre sur le site officiel d’Ansible.

Configuration d’Ansible

Ansible utilise une arborescence spécifique que l’utilisateur doit créer lui même. Toutes les configurations d’Ansible s’effectuent dans le dossier « /etc/ansible ». Voici mon arborescence pour la création d’un serveur web nginx avec wordpress :

tree

Playbook.yml :

On commence par se rendre dans le fichier playbook.yml qui est le ficher centrale pour la configuration d’Ansible. Il s’agit du fichier que nous allons lancer pour exécuter la procédure sur notre client en SSH. Le fichier est assez cour et renvoie donc vers d’autres fichiers de configurations.

  • playbook.yml
---
- name: Installation de WordPress
  hosts: web
  remote_user: root

  roles:
    - wordpress

...

Il est important de remarquer que tous les fichiers de configuration d’Ansible commencent par « — » (trois tirets) et finissent par « … » (trois points). Dans ce fichier, nous avons une première partie que l’on nomme « Installation de WordPress » (ce nom n’a aucune importance, il convient à l’administrateur de le définir pour simplifier la compréhension des fichiers de configurations). Ensuite, dans cet même partie, nous avons le paramètre hosts qui définis le groupe de clients affectés par l’installation de wordpress et enfin, l’utilisateur « root » utilisé pour les installations et la connexion SSH.

La deuxième partie « roles » indique à Ansible l’emplacement des fichiers de configurations à exécuter, ici dans le dossier /roles/wordpress.

Hosts :

Le fichier hosts permet de définir plusieurs groupes d’hôtes selon les actions que nous voulons effectuer. On peut par exemple définir un groupe d’hôte pour l’installation d’un serveur web et un autre groupe pour l’installation d’un serveur SGBD. Le fichier serait écrit comme ceci :

[web]
192.168.10.2
192.168.10.3
[sgbd]
192.168.10.4
192.168.10.5

On définie le nom du groupe enter crochets et on liste les différentes adresses IP en dessous. On retrouve donc ce nom de groupe dans le fichier paybook.yml (hosts: web)

Roles :

Le dossier roles comprends tous les rôles que créer pour Ansible. Pour ce tutoriel, nous avons besoin d’un seul rôles. Le dossier wordpress est donc le premier rôle que nous avons créé et il contient lui même 4 dossiers avec chacun son utilité :

  • defaults (contient des paramètres utilisée pour configurer wordpress)
  • handlers (permet de créer des raccourcis pour certaines taches)
  • tasks (contiens toutes les instructions pour l’installation de wordpress)
  • templates (contiens les fichiers de configurations)

Tasks/main.yml :

Voici le fichier d’instructions avec les commentaires de chaque étape :

---
- name: apt update
  apt: update_cache=yes  # faire un apt-get update 

- name: Update all packages to the latest version
  apt:
  upgrade: dist          # faire un apt-get upgrade

- name: Installation des paquets
  apt: name={{ item }} state=latest
  with_items:            #installer les paquets suivants
  - php5-fpm
  - php5
  - php5-mysql
  - nano
  - nginx
  - php5-gd
  - mysql-client

- name: main | uninstall apache packages
  apt: >
    pkg={{ item }}
    state=absent
    purge=yes
    force=yes
  with_items:
    - apache2*
  sudo: yes

- name: Telechargement WordPress
  get_url:               # Télécharger wordpress et le placer dans /var/www
    url: http://fr.wordpress.org/latest-fr_FR.tar.gz
    dest: /var/www/latest-fr_FR.tar.gz
    force_basic_auth: yes

- name: Unzip wordpress
  unarchive:             # décomprésser l'archive = création d'un dossier wordpres
    src: /var/www/latest-fr_FR.tar.gz
    dest: /var/www/
    remote_src: yes

- name: supprimer le tar gz
  file:                  # suprimmer l'archive
    path: /var/www/latest-fr_FR.tar.gz
    state: absent

- name: Creation de la configuration nginx  #remplacer le fichier de configuration nginx
  template: src=templates/nginx.j2 dest=/etc/nginx/sites-available/default force=yes
  notify: nginx reload #recharger le service nginx

- name: Creation de la configuration wordpress #ajouter le fichier de configuration de wordpress
  template: src=templates/wp-config.j2 dest=/var/www/wordpress/wp-config.php force=yes
  notify: php restart  #redémarrer le service php
...

Les trois autres dossiers sont utilisés pour les deux dernières taches de cette procédure.

Handlers/main.yml :

Dans ce tutoriel, ce fichier est utilisé pour définir les instructions de redémarrage de php et nginx.

---
- name: nginx reload
  service: name=nginx state=reloaded
- name: php restart
  service: name=php5-fpm state=restarted
...

Il permet de simplement utiliser les instructions « notify: nginx reload » dans le fichier « /tasks/main.yml » au lieu de récrire plusieurs fois la même chose. Les handlers sont utilisée pour des taches répétées régulièrement comme les redémarrages de services par exemple.

Templates :

Les templates sont simplement les fichiers de configuration que l’on utilise lors de notre procédure. Dans notre cas, nous avons le fichier de configuration de notre site et de notre wordpress.

nginx.j2 :

server {
 listen 80; ## listen for ipv4; this line is default and implied
 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

#root /usr/share/nginx/www;
 root /var/www/wordpress;

index index.html index.htm index.php;

#access_log /var/log/nginx/wordpress.access.log;
 #error_log /var/log/nginx/wordpress.error.log

# Make site accessible from http://localhost/
 server_name localhost;

location / {
 # First attempt to serve request as file, then
 # as directory, then fall back to displaying a 404.
 try_files $uri $uri/ /index.html;
 # Uncomment to enable naxsi on this location
 # include /etc/nginx/naxsi.rules
 }

location /doc/ {
 alias /usr/share/doc/;
 autoindex on;
 allow 127.0.0.1;
 allow ::1;
 deny all;
 }
# Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
 #location /RequestDenied {
 # proxy_pass http://127.0.0.1:8080;
 #}
 #error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
 #
 #error_page 500 502 503 504 /50x.html;
 #location = /50x.html {
 # root /usr/share/nginx/www;
 #}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
 #
 location ~ \.php$ {
 try_files $uri =404;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_pass unix:/var/run/php5-fpm.sock;
 fastcgi_index index.php;
 include fastcgi_params;
 }

# deny access to .htaccess files, if Apache's document root
 # concurs with nginx's one
 #
 #location ~ /\.ht {
 # deny all;
 #}
}

wp-config.php :

N’oubliez pas d’ajouter les balises PHP, «  » à la fin.

/**
 * La configuration de base de votre installation WordPress.
 *
 * Ce fichier contient les r glages de configuration suivants : r glages MySQ$ L,
 * pr fixe de table, cl s secr tes, langue utilis e, et ABSPATH.
 * Vous pouvez en savoir plus leur sujet en allant sur
 * {@link http://codex.wordpress.org/fr:Modifier_wp-config.php Modifier
 * wp-config.php}. C ^v^r^ ^v^r^ ^v^rest votre h bergeur qui doit vous donner vos
 * codes MySQL.
 *
 * Ce fichier est utilis par le script de cr ation de wp-config.php pendant
 * le processus d ^v^r^ ^v^r^ ^v^rinstallation. Vous n ^v^r^ ^v^r^ ^v^ravez pas utiliser le site web$, vous
 * pouvez simplement renommer ce fichier en "wp-config.php" et remplir les
 * valeurs.
 *
 * @package WordPress
 */

// ** R glages MySQL - Votre h bergeur doit vous fournir ces informations. ** //
/** Nom de la base de donn es de WordPress. */
define('DB_NAME', '{{ wp_nom_db }}');

/** Utilisateur de la base de donn es MySQL. */
define('DB_USER', '{{ wp_user_db }}');

/** Mot de passe de la base de donn es MySQL. */
define('DB_PASSWORD', '{{ wp_mdp_db }}');

/** Adresse de l ^v^r^ ^v^r^ ^v^rh bergement MySQL. */
define('DB_HOST', '{{ wp_host_db }}');

/** Jeu de caract res utiliser par la base de donn es lors de la cr ation des tables. */
define('DB_CHARSET', 'utf8');

/** Type de collation de la base de donn es.
 * N ^v^r^ ^v^r^ ^v^ry touchez que si vous savez ce que vous faites.
 */
define('DB_COLLATE', '');

/**#@+
 * Cl s uniques d ^v^r^ ^v^r^ ^v^rauthentification et salage.
 *
 * Remplacez les valeurs par d faut par des phrases uniques !
 * Vous pouvez g n rer des phrases al atoires en utilisant
 * {@link https://api.wordpress.org/secret-key/1.1/salt/ le service de clefs secr tes de WordPress.org}.
 * Vous pouvez modifier ces phrases n ^v^r^ ^v^r^ ^v^rimporte quel moment, afin d ^v^r^ ^v^r^ ^v^rinvalider tous les cookies existants.
 * Cela forcera galement tous les utilisateurs se reconnecter.
 *
 * @since 2.6.0
 */
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
/**#@-*/

/**
 * Pr fixe de base de donn es pour les tables de WordPress.
 *
 * Vous pouvez installer plusieurs WordPress sur une seule base de donn es
 * si vous leur donnez chacune un pr fixe unique.
 * N ^v^r^ ^v^r^ ^v^rutilisez que des chiffres, des lettres non-accentu es, et des caract res soulign s !
 */
$table_prefix = 'wp_';

/**
 * Pour les d veloppeurs : le mode d boguage de WordPress.
 *
 * En passant la valeur suivante "true", vous activez l ^v^r^ ^v^r^ ^v^raffichage des
 * notifications d ^v^r^ ^v^r^ ^v^rerreurs pendant vos essais.
 * Il est fortemment recommand que les d veloppeurs d ^v^r^ ^v^r^ ^v^rextensions et
 * de th mes se servent de WP_DEBUG dans leur environnement de
 * d veloppement.
 *
 * Pour plus d ^v^r^ ^v^r^ ^v^rinformation sur les autres constantes qui peuvent tre utilis es
 * pour le d boguage, rendez-vous sur le Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define('WP_DEBUG', false);

/* C ^v^r^ ^v^r^ ^v^rest tout, ne touchez pas ce qui suit ! */
/** Chemin absolu vers le dossier de WordPress. */
 
if ( !defined('ABSPATH') )
 define('ABSPATH', dirname(__FILE__) . '/');

/** R glage des variables de WordPress et de ses fichiers inclus. */
require_once(ABSPATH . 'wp-settings.php');

Ces deux fichiers de configuration sont appelé par les configuration templates dans le fichier « /tasks/main.yml », exemple si dessous :

template: src=templates/nginx.j2 dest=/etc/nginx/sites-available/default force=yes

Nous avons donc la source du fichier de configuration ainsi que la destination et pour finir l’option force=yes qui autorise le remplacement du fichier si celui là existe déjà dans la destination.

Defaults/main.yml :

Ce fichier contient les variables que l’on trouve dans wp-config.j2. Cela permet à l’administrateur de facilement changer ces variables sans devoir parcourir entièrement les templates.

wp_nom_db: wordpress
wp_user_db: root
wp_mdp_db: Iroise29
wp_host_db: 10.10.111.139

Ces variables sont annoncées dans le templates entre deux accolades : {{ nom_de_la_variable }}. Par exemple {{ wp_nom_db }}. Attention, Ansible n’accepte par les tirets « – » pour les noms de variables.

Une fois tous ces fichiers de configurations en place, on se rend dans le fichier /etc/ansible et on lance la commande suivante pour lancée la procédure :

ansible-playbook -i hosts playbook.yml

(Le début de la procédure prend un peut de temps (jusqu’a quelques minutes) pour réaliser l’update et l’upgrade de votre client).

playbook.PNG

On obtient donc le détail des tâches réalisées et des changements effectuées. A la fin de cette procédure, vous devez vous rendre sur votre navigateur web à l’adresse de votre serveur. Votre WordPress est entièrement près à l’utilisation.

Pour aller plus loin avec Ansible, vous pouvez utiliser la documentation officielle avec toutes les syntaxes et options de chaque taches réalisables par Ansible.

Sources :
https://www.youtube.com/watch?v=DwNapBHypE8
https://www.grafikart.fr/formations/serveur-linux/ansible