C’est quoi un Ansible playbook ?
Un playbook est un fichier de configuration au format YAML qui décrit des tâches qui s’exécuteront sur les serveurs cibles.
L’indentation est de 2 espaces en YAML, cette indentation est très importante car sinon le fichier est en erreur.
Avantage des playbooks
Les playbooks sont intéressants car ils permettent le déploiement de configurations/d’applications sur un ou plusieurs node client simplement.
Ansible est fourni avec une multitude de modules et ces modules sont disponibles dans nos playbooks, ce qui nous donne beaucoup de flexibilité pour exécuter les actions de nos choix facilement.
Enfin les playbooks sont généralement facile à lire (quand ils sont bien faits) et permettent de maintenir notre infrastructure.
Conception de notre premier yml ansible playbook.yml
Ce premier playbook aura pour objectif de créer un utilisateur « ansible » sur notre machine cible puis de générer une clé SSH sur notre serveur ansible et enfin déployer cette clé SSH sur toutes les nodes.
Avant de commencer la conception de notre playbook, je te propose de créer un fichier chiffré qui va stocker notre variable password qui sera attribué à l’utilisateur Ansible.
Ansible-vault
Pour ce faire nous allons utiliser ansible-vault qui est un outil livré avec l’installation d’ansible, c’est une sorte de coffre-fort qui va stocker nos fichier et variable chiffré :
ansible-vault create vars/password_ssh.yml
La commande nous demande de choisir un mot de passe ( ce mot de passe sera demandé à chaque fois que l’on utilisera ansible-vault ou un de ses fichiers).
La commande ouvre alors notre éditeur de texte par défaut (généralement VI) et c’est là que l’on va inscrire notre variable tel que :
Vault password:
---
password_ssh: 'password'
On peut enfin commencer la conception de notre playbook.
cle_ssh_playbook.yml :
- name: "[cle ssh]"
hosts: all
vars_files:
- vars/password_ssh.yml
hosts : all pour cibler toutes nos node de notre inventaire /etc/ansible/hosts.yml
vars_files: permet de spécifier des fichiers de variables ici notre fichier que l’on a précédemment chiffré vars/password_ssh.yml
Ensuite :
tasks:
- name: génération de la clé ssh
openssh_keypair:
path: /home/ansible/.ssh/id_ecdsa
type: ecdsa
size: 521
state: present
force: no
owner: ansible
delegate_to: localhost
run_once: yes
tasks est l’élément qui spécifie à Ansible les tâches qui devront être exécuté
Notre première tache est la génération de notre clé ssh à l’aide du module openssh_keypair.
Les différentes options nous permettent de spécifier le chemin de destination de notre clé, du type de chiffrement, son degrés de sécurité, son état (présent ou absent) et son propriétaire.
Enfin j’ai utilisé delegate_to: localhost pour que la tâche ne soit lancée que sur la node master et run_once: yes pour que cette tâche ne soit exécutée qu’une seule fois.
Puis :
- name: création user ansible et ajout sudo pour Centos
user:
name: ansible
shell: /bin/bash
group: wheel
password: "{{ password_ssh | password_hash('sha512')}}"
become: yes
when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'
Il faut savoir que j’ai une infrastructure composée de serveurs Debian et Centos or sur les serveurs Centos le groupe sudo est le wheel tandis que sur debian c’est sudo.
Cette tâche va créer l’user ansible, lui attribuer le groupe wheel (pour utiliser sudo sur Centos) et définira le mot de passe à la valeur de notre variable password_ssh du fichier de variable chiffré.
Enfin pour que cette action ne soit lancée que sur les OS centos j’ai rajouté l’option :
when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'
when indique à quelle condition lancée la tâche.
Derrière on lance la même tâche mais pour les Debian ou Ubuntu:
- name: création user ansible et ajout sudo pour Debian/Ubuntu
user:
name: ansible
shell: /bin/bash
group: sudo
password: "{{ password_ssh | password_hash('sha512')}}"
become: yes
when: ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'
Et on termine avec la tâche qui va déployer notre clé SSH :
- name: Deploy SSH Key
authorized_key:
user: ansible
key: "{{ lookup('file', '/home/ansible/.ssh/id_ecdsa.pub') }}"
state: present
become: yes
Pour cela on utilise le module « authorized key », on lui spécifie l’user et on lui indique la clé :
key: "{{ lookup('file', '/home/ansible/.ssh/id_ecdsa.pub') }}"
lookup(‘file’ permet d’indiquer un fichier existant sur le node master.
Au final notre playbook ressemble à ça :
- name: "[cle ssh]"
hosts: all
vars_files:
- vars/password_ssh.yml
tasks:
- name: génération de la clé
openssh_keypair:
path: /home/ansible/.ssh/id_ecdsa
type: ecdsa
size: 521
state: present
force: no
owner: ansible
delegate_to: localhost
run_once: yes
- name: création user ansible et ajout sudo pour Centos
user:
name: ansible
shell: /bin/bash
group: wheel
password: "{{ password_ssh | password_hash('sha512')}}"
become: yes
when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'
- name: création user ansible et ajout sudo pour Debian/Ubuntu
user:
name: ansible
shell: /bin/bash
group: sudo
password: "{{ password_ssh | password_hash('sha512')}}"
become: yes
when: ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'
- name: Deploy SSH Key
authorized_key:
user: ansible
key: "{{ lookup('file', '/home/ansible/.ssh/id_ecdsa.pub') }}"
state: present
become: yes
Pour l’exécuter on utilise la commande ansible-playbook :
ansible-playbook cle_ssh_playbook.yml --ask-vault-pass -u root -k
- –ask-vault-pass nous permettra d’entrer le mot de passe vault
- -u root pour exécuter ces actions en tant que root car nous n’avons pas encore d’accès SSH sur l’user ansible
- – k pour spécifier le mot de passe SSH
Une fois ce playbook lancé tu pourras te connecter en ssh depuis la node master sur les nodes clients sans utiliser de mot de passe.
Tu pourras aussi (surtout) executer des commande ansible sans utiliser l’option -u ou -k.
Si tu veux en savoir plus Ansible Playbook tu peux aller voir ici et si tu veux savoir comment installer Ansible c’est ici.