Les bases d'ansibles

Ansible est un outil opensource dl’automatisation qui fonctionne sans agent. Dans cette article, je présente les notions de base.
Rappel de vocabulaire

node ou managed node :
entité qui sera configurée via Ansible (ansible n’est pas installé sur les nodes).
inventory :
la liste des nodes
node manager :
serveur sur lequel sera installés les outils Ansible et depuis lequel, les opérations de configuration seront lancées à distance sur les nodes.
Ansible pousse la configuration via ssh et python.
task :
action élémentaire qui va faire appel à un module.
handler :
comme une tâche mais déclenché par des notifications.
role :
structure arborescente constituée de répertoires et de fichiers de configuration YAML.
playbook :
regroupement de rôles.
Préparation du node manager
Environnement
# apt-get install python3-venv sshpass python3-pip --no-install-recommends
Création d’un utilisateur dédié à l’administration
# adduser user-ansible
Adding user `user-ansible' ...
Adding new group `user-ansible' (1001) ...
Adding new user `user-ansible' (1001) with group `user-ansible' ...
Creating home directory `/home/user-ansible' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for user-ansible
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
Dans la suite on travaille en tant qu’utilisateur “user-ansible”.
# su user-ansible
Installation d’ansible
$ python3 -m venv ansible2.9.2
$ source ansible2.9.2/bin/activate
$ pip3 install wheel ; pip3 install ansible==2.9.2
Préparation de la clé ssh
$ ssh-keygen -a 100 -f ~/.ssh/ansible-key -t ed25519
Generating public/private ecdsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user-ansible/.ssh/ansibe-key.
Your public key has been saved in /home/user-ansible/.ssh//ansible-key.pub.
The key fingerprint is:
SHA256:qU7djLRFSAcozxjwXVfHs1BLQ9d+nWlyPaovQ8PYCuA user-ansible@lab
The key's randomart image is:
+---[ECDSA 256]---+
| .. .+.o..+* o|
| .o..o + .oo+.|
| .*. . . ..+=|
| ..o o ..*=|
| . . S = = o|
| E = B = . |
| o = = o |
| o . + |
| . +. |
+----[SHA256]-----+
$ ssh-copy-id -i ~/.ssh/ansible-key eric@192.168.112.132
Création de l’inventaire
inventory.ini
[myLabel]
192.168.112.132
Activation de l’environnement virtuel
source ansible2.9.2/bin/activate
Exemple 1 - Execution d’un ping ansible (mode adoc)
Utiliser le module ping pour effectuer une action sur le node.
$ ansible -i inventaire.ini -m ping 192.168.112.132 --user eric --ask-pass
SSH password:
192.168.112.132 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
S’agissant de la première connexion à cet hôte, la clé publique n’est pas connue par le node-manager. Une solution temporaire est d’ignorer l’erreur :
$ export ANSIBLE_HOST_KEY_CHECKING=False
ou encore en créant un fichier ansible.cfg
[defaults]
host_key_checking = false
Sous windows avec le sous-système linux il est nécéssaire de définir la variable d’environnement suivante si on se place en dehors du système de fichier
export ANSIBLE_CONFIG=./ansible.cfg
$ ansible -i inventaire.ini -m ping 192.168.112.132 --user eric --ask-pass
SSH password:
[WARNING]: Platform linux on host 192.168.112.132 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.112.132 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Exemple 2 - Créer un utilisateur ansible sur le node (mode adoc)
$ ansible -i inventory.ini -m user -a 'name=user-ansible2 group=sudo' --become --user eric --become-method=su --ask-become-pass --ask-pass all
SSH password:
BECOME password[defaults to SSH password]:
[WARNING]: Platform linux on host 192.168.112.132 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.112.132 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 27,
"home": "/home/user-ansible2",
"name": "user-ansible2",
"shell": "/bin/sh",
"state": "present",
"system": false,
"uid": 1003
}
Exemple 3
Créer un nouvel utilisateur “user-ansible” (qui sera le compte dédié à l’automatisation), lui donner les droits sudo et déclarer une clé publique ssh de connexion.
Préparation de la clé ssh
$ ssh-keygen -a 100 -f ~/.ssh/ansible-key -t ed25519
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user-ansible/.ssh/ansible-key.
Your public key has been saved in /home/user-ansible/.ssh/ansible-key.pub.
The key fingerprint is:
SHA256:HOX1psEANp7XcEoX7CjkLs2Qvh3564aYQEZes2kyKDk user-ansible@lab
The key's randomart image is:
+---[ECDSA 256]---+
| +.=.=. |
| . oo.* X.. |
| . + . B+ +o+ o |
|E . * *.oo. .+ |
| o o = =So . |
| . o * |
| . * + |
| + o o |
| oo. |
+----[SHA256]-----+
Création de l’arborescence du rôle
$ ansible-galaxy init init_user
- Role init_user was created successfully
(ansible2.9.2) user-ansible@lab:~$ ls ansible2.9.2 init_user inventory.ini
Arborescence :
./.travis.yml
./vars
./vars/main.yml
./tests
./tests/test.yml
./tests/inventory
./tasks
./tasks/main.yml
./defaults
./defaults/main.yml
./README.md
./meta
./meta/main.yml
./templates
./files
./handlers
./handlers/main.yml
Création de la tâche
init_user/tasks/main.yml
- name: create_user
user:
name: user-ansible
comment: For automation
groups: sudo
shell: /bin/bash
append: yes
become: yes
become_method: su
- name: Set up multiple authorized keys
authorized_key:
user: user-ansible
state: present
key: '{{ item }}'
with_file:
- ~/.ssh/ansible-key.pub
become: yes
become_method: su
Création du playbook
Le playbook va faire appel à notre rôle init_user et l’appliquera à toutes les machines (hosts: all)
playbook.yml
- name: "Initialisation du system"
hosts: all
roles:
- role: "init_user"
Execution du playbook
On utilise le compte eric ( –user) avec son mot de passe (–ask-pass), l’escalade de privilège sera réalisée avec un su sur le compte root via le mot de passe fourni (–ask-become-pass)
ansible-playbook playbook.yml -i inventory.ini -K --user eric --ask-pass
Association clé ssh au node
Pour ne plus avoir besoin de saisir le mot de passe de connexion on déclare un nouvel hôte.
~/.ssh/config
Host 192.168.112.132
User user-ansible
Port 22
IdentityFile ~/.ssh/ansible-key
Validation du bon fonctionnement :
ssh 192.168.112.132
Astuce pour lancer ansible sans fichier d’inventaire (la virgule est importante):
ansible-playbook ansible/main.yml -i 127.0.0.1:2022, --user vagrant --ask-pass