Ansible, la voie de l’automatisation

Après m’être étendu sur Docker et sa facilité de déploiement pour les stacks complexes, je vais vous parler d’Ansible pour rajouter une couche d’automatisation aux déploiements.

La première chose à faire est de vous mettre un lab à disposition, quelques VMs feront l’affaire, et comme d’habitude je me concentrerai sur des CentOs 7+.

Ansible est une solution en ligne de commande qui ne s’appuie pas sur l’installation d’agent sur le machines cibles, mais bosse uniquement par la voie (royale) de SSH. Pour cela Ansible est bien plus facile a appréhender que les concurrents (Puppet, Chef, CFEngine, …) et tout aussi puissant.

Avant de commencer, je suis obliger de vous mettre en garde sur le développement rapide (trop) d’Ansible et des versions associées de python. Une installation via les package risque de vous causer quelques désagréments.

 

Installation du serveur de déploiement

La version 2.4+ a supprimer le support des python 3.5-, du coup mieux vaut l’installer via pip.

yum update
yum -y install python36u python36u-devel python36u-pip python36u-setuptools python36u-libs
pip3.6 install ansible

Vérification de la version

[Zeph@ans ]$ ansible --version
ansible 2.4.1.0
  config file = 
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /bin/ansible
  python version = 3.6.3 (default, Oct 11 2017, 18:17:37) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

La première chose qui saute à l’œil c’est que le fichier de configuration n’est pas défini. Je vais donc copier celui du package et le mettre à un emplacement standard.

[Zeph@ans ]# mkdir /etc/ansible
[Zeph@ans ]# cp /usr/lib/python3.6/site-packages/ansible/galaxy/data/container_enabled/tests/ansible.cfg /etc/ansible/ansible.cfg

Voila une configuration minimal utilisable :

[Zeph@ans ]$ mkdir /etc/ansible
[defaults]
inventory=./inventory
log_path = /var/log/ansible.log
deprecation_warnings=True
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
connect_timeout = 30
connect_retries = 30
connect_interval = 1
[accelerate]
[selinux]
[colors]
[diff]

On relance Ansible pour voir ma mise à jour du fichier de configuration.

[Zeph@ans ]$ ansible --version
ansible 2.4.1.0
  config file = /etc/ansible/ansible.cfg
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /bin/ansible
  python version = 3.6.3 (default, Oct 11 2017, 18:17:37) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

Ansible dans la pratique

Envvars

Les variables d’environnement permettent de surcharger les valeurs par défaut.

ANSIBLE_CONFIG: pour mettre votre fichier dans une chemin spécifique
ANSIBLE_INVENTORY: le fichier host sur lequel Ansible se base (très proche d’un fichier /etc/hosts)
ANSIBLE_ROLES_PATH: le chemin ou les rôles seront définis (s’il n’y a pas de répertoire rôles dans le répertoire courant)

La documentation liste toutes les variables disponibles.

Au minimum il vous faudra un fichier de configuration et un fichier d’inventaire. Avec ça en main vous pourrez tester la connectivité vers vos cibles.

Hosts

Le fichier hosts peut être défini comme cela

[Zeph@ans ]$ cat hosts.inc
[groupe]
vm1 ansible_ssh_host=192.168.1.11
vm2 ansible_ssh_host=192.168.1.12

On a donc 2 machines qui sont définies (vm1, vm2) avec leurs adresses IP respectives.
Il faut encore tester la connexion ssh vers ces hosts, elle doit se faire via les échanges de clés RSA pour éviter de taper le mot de passe.
Vous pouvez vous inspirer de la la fonction ssh-pwdless.

[Zeph@ans ]$ ssh 192.168.1.11

Si votre SSH fonctionne avec authentification par clé, il est temps d’utiliser Ansible.

[Zeph@ans ]$ ansible all -m ping

Extension des possibilités

Vous avez la possibilité de spécifier un user.

[Zeph@ans ]$ ansible all -m ping -u root

Vous avez aussi la possibilité de spécifier un fichier host .

[Zeph@ans ]$ ansible -i hosts.inc all -m ping -u root

Et même de préciser une seule machine (ne pas oublier la virgule)

[Zeph@ans ]$ ansible -l vm1, -m ping -u root

Playbook

Les playbooks sont les enchainements de commandes que l’on va exécuter sur les hosts précédemment définis. Ils sont écrits en YAML, un langage identé, qui est extensible par de nombreuses variables.

[Zeph@ans ]$ vi info.yml
---
- hosts: groupe
  remote_user: root
  tasks:
  - name: This is a debug message
    debug:
      msg: "System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }} AND {{hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"

Dans l’ordre on définit le groupe (ou le host), le user qui sera utilisé et les taches qu’on va exécuter. Il suffit ensuite d’exécuter le playbook avec la commande suivante:

[Zeph@ans ]$ ansible-playbook info.yml
PLAY [groupe] **************************************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************************
ok: [vm1]
ok: [vm2]

TASK [This is a debug message] ******************************************************************************************************************************************************************
ok: [vm1] => {
    "msg": "System vm1 has uuid 564D8BA1-6D62-CE03-318A-CC15E2B4A4F7 AND 192.168.1.11"
}
ok: [vm1] => {
    "msg": "System vm2 has uuid 564D27AE-7D47-53B7-130B-A496A71046D8 AND 192.168.1.12"
}

PLAY RECAP **************************************************************************************************************************************************************************************
vm1		           : ok=2    changed=0    unreachable=0    failed=0   
vm2		           : ok=2    changed=0    unreachable=0    failed=0   

Vous avez maintenant toute liberté pour utiliser tous les modules Ansible disponibles.

 

Pour marque-pages : Permaliens.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *