Logo Khaganat
Traductions de cette page?:

Ceci est une ancienne révision du document !


Ansible

Cet article est un gros brouillon de fatras. Ansible est utilisé par certains ici, mais moi, j'y connais rien, et je m'y lance dans l'optique de répliquer certaines manip, entre autre avec BURPS.

C'est donc de la doc pour noob avec probablement des erreurs.

zatalyz 2017/10/13 11:26

Ansible s'installe sur sa machine à soi (pas sur un serveur), afin d'administrer ses serveurs en automatisant pleins de choses. C'est sensé simplifier le boulot du sysadmin1).

Donc, suivant votre système :

sudo apt-get install ansible
yaourt -S ansible
dnf install ansible
...

Le fichier de configuration se trouve dans /etc/ansible/ansible.cfg ; il est en principe fonctionnel tel quel.

Sur Archlinux, il est surtout plein de lignes commentées, de base. Considérez-le comme le fichier expliquant les possibilités d'Ansible.

Ensuite on va renseigner ses serveurs.

Par défaut, Ansible les cherchent dans /etc/ansible/hosts (à créer et paramétrer). Mais on peut créer le fichier du nom qu'on veut à l'emplacement qu'on veut ; il suffira soit de le renseigner dans /etc/ansible/ansible.cfg probablement en renseignant la variable inventory = /chemin/fichier, soit de lancer Ansible avec la variable -i en indiquant le chemin.

ansible -i /chemin/fichier

Créer un ou des fichiers ailleurs a deux avantages :

  • cela permet de séparer suivant les infrastructures, par exemple un fichier pour les serveurs en production, un autre pour les serveurs en pré-production ;
  • cela permet de renseigner son fichier hosts sans avoir besoin des droits root, par exemple en le mettant dans /home/ansible/khanat_hosts.

Renseigner le fichier ansible/hosts

Il y a visiblement plusieurs syntaxes possibles (peut-etre à paramétrer dans /etc/ansible/ansible.cfg ?), on va rester au truc par défaut qui est la syntaxe de type INI, c'est à dire avec des crochets pour les sections, dans ce genre-là :

mail.example.com
 
[webservers]
foo.example.com
bar.example.com
 
[dbservers]
one.example.com
two.example.com
three.example.com

Ce qui est entre crochet est le nom donné à un groupe et ce nom est libre, mais il ne doit pas reprendre un de noms des serveurs géré dessous. Ici par exemple, il y a un groupe de serveur qui concerne le web, un autre groupe avec les machines hébergeant les databases ; les noms ont été choisis pour être parlant.

Les serveurs renseignés dessous peuvent l'être suivant diverses syntaxes :

  • d'après le nom de domaine qui leur est lié (par exemple foo.example.com)
  • d'après leur ip (par exemple 8.8.8.8)
  • d'après leur raccourci renseigné dans .ssh/config (le plus pratique car cela précise le port, l'utilisateur…)

Agent ssh et test

Pensez à activer l'agent ssh qui va se souvenir du mot de passe de votre clé ssh le temps de la session, sinon vous aurez du mal à vous connecter aux serveurs.

L'agent ssh est un passage obligé avec ansible.

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

Pour tester votre configuration, vous pouvez faire un ping-pong avec vos serveurs !

Exemple avec l'host suivant :

[khanat]
lirria
jukni
ansible -i ./khanat_host -m ping khanat
lirria | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}
jukni | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}

Suite de commandes : playbooks

L'une des grandes forces d'Ansible va être d'automatiser des opérations qu'on répète sur plusieurs serveurs.

Un exemple très bête : la mise à jour des dépôts, le téléchargement et déployement des nouveaux paquets. Le tout en gardant un oeil quand même si tout se passe bien… Cette action est à faire régulièrement sur les serveurs : elle peut se scripter via ansible.

La première manipulation de cet article permet d'envoyer une commande sur plusieurs serveurs (un ping dans l'exemple). Pour passer plusieurs commandes, on créé des “playbooks”. Ce sont des fichiers écrits au format YAML. À noter qu'Ansible a pour but de favoriser la lecture par des êtres humains : il y a donc beaucoup de façon d'écrire ces playbooks…

Créez un répertoire dans lequel seront stockés vos playbooks, puis un playbook :

mkdir ./ansible/playbooks
nano  ./ansible/playbooks/maj_base.yml

Pour exécuter le playbook :

ansible-playbook -i ./khanat_host ./ansible/playbooks/maj_base.yml

Mais avant de l'exécuter, il faut l'écrire…

YAML est assez strict sur les indentations. Si vous avez des erreurs lors de vos premiers palybooks, c'est peut-être à cause d'un espace manquant…

Écrire un playbook

Pour la rédaction des playbook, les possibilités sont nombreuses et il vaut mieux se référerer à la doc officielle. Pour les options de base :

  1. Nous renseignons les hosts où le playbook sera lancé
  2. Nous listons les tâches qui seront exécutées dessus

Il est possible de renseigner des variables et diverses options.

Chaque tâche (task) démarre par un tiret - après lequel on peut spécifier un ensemble d'options. On peut renseigner une variable “name”, qui nous indiquera, lors du lancement du playbook, à quel stade il en est. On peut faire appel au shell, ou même directement à un programme. On peut passer sudo, ou devenir un autre utilisateur (pour peu qu'on aie les droits), le temps d'une commande. On peut avoir des retours si un reboot est nécessaire… etc.

- name: Texte décrivant la tâche
  module: option=value

Commençons en douceur… on reproduit notre “ping” via le playbook.

khanatping.yml
# Indiquer sur quels serveurs ce playbook va marcher, ici ceux du groupe "khanat"
- hosts: khanat
#  Nous indiquons les tâches qui vont s'exécuter
  tasks:
    - action: ping

Lors de l'exécution de ansible-playbook -i ./khanat_host ./ansible/playbooks/khanatping.yml, la réponse est affiché différement de la commande ansible -i ./khanat_host -m ping khanat mais le résultat est le même : ça marche.

Allons un peu plus loin et créons un playbook pour mettre à jour un serveur Debian. La lecture des possibilités offerte par les modules apt sous ansible est utile.

Les mises à jour doivent se faire avec les droits root. Mais comme on respecte les règles de sécurité, on ne se connecte jamais directement en root… mais via un utilisateur ayant le droit de faire sudo. Et toujours pour des questions de sécurité, cet utilisateur doit taper un mot de passe pour faire du sudo. On ajoutera donc la commande –ask-become-pass en appelant le script. On va aussi ajouter dans le playbook de quoi passer en sudo quand nécessaire.

maj_base.yml
# Nos hôtes concernés par le playbook
- hosts: khanat
# On préviens que sur cet host et pour ce playbook, on va utiliser sudo.
  become: yes
  become_method: sudo
# On renseigne les tâches et on leur donne des descriptions
  tasks:
    - name: mise à jour des dépôts
      apt: update_cache=yes
 
    - name: Mettre à jour les paquets
      apt: upgrade=yes
 
    - name: Vérifie s'il faut rebooter
      register: reboot
      stat: path=/var/run/reboot-required get_md5=no

Puis lancer :

ansible-playbook -i ./khanat_host ./ansible/playbooks/maj_base.yml --ask-become-pass

Insérer des playbooks dans des playbooks

Imbriquer les playbooks peut être utile. Par exemple, vous avez un playbook bien fait pour les mises à jour, mais vous souhaitez le lancer parfois pour un groupe de serveur, parfois pour un autre2).

Il y a plusieurs façon de réaliser des imbrications, définir des rôles, inclure des tâches… Cette dernière façon de faire est assez simple.

Créez votre premier playbook contenant vos hosts, et appelez dedans un second playbook, qui contiendra la liste des tâches :

khanat.yml
- hosts: khanat
  tasks:
  - import_tasks: includeping.yml
includeping.yml
  - action: ping

Sources

1)
En attendant ça fait un truc de plus à apprendre. En même temps si l'outil permet vraiment de faire gagner du temps ensuite, ça vaut le coup
2)
Typiquement chez nous, on met à jour les hyperviseurs, puis on fait des snapshots des VM, puis on passe aux MàJ des VM, donc des mises à jour en deux temps.
CC Attribution-Share Alike 4.0 International Driven by DokuWiki
fr/ansible.1517835357.txt.gz · Dernière modification : 2021/12/03 19:18 (modification externe)

Licences Mentions légales Accueil du site Contact