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

Related