Ici, je vais noter ce que j'apprend sur Ansible et ce qui me semble pertinent.
Peut-être que si cet article devient trop long, il sera plus tard divisé en plusieurs...
Selon le site d'Ansible, il existe plusieurs méthodes :
J'ai commencé par installé via apt mais l'installation ne m'a pas créé de dossier /etc/ansible.
J'ai donc essayé via la commande pip mais le résultat est identique.
Il est nécessaire de pouvoir accéder en ssh à ses serveurs que l'on veut pouvoir gérer via ansible. Il faut pour cela utiliser la méthode de clé privée/publique. Rien de compliqué, plein de sites en parlent...
Quelques rappels de commandes.
Pour générer les clés :
Cette commande permet de générer une clé de type ecdsa avec la longueur maximale.
La page de manuel de ssh-keygen donne des infos sur les différentes types et les longueurs de clé que l'on peut générer en fonction de la méthode choisie.
Il est possible de générer une clé sans phrase de passe mais ce n'est pas le plus sécurisé...
Pour copier la clé sur le serveur distant :
Afin de simplifier les choses, il est conseiller de bien configurer ssh pour que la connexion soit simplifiée.
Pour cela, créer ou éditer le fichier ~/.ssh/config
L'ajout de ce type de bloc dans le fichier permet de spécifier pour un nom d'hôte : l'adresse ip ou le hostname configuré en dns, le port si on n'utilise pas le port 22, le nom d'utilisateur.
Dans le cas contraire, il sera nécessaire de configurer ces paramètres dans ansible via l'inventory.
On peut utiliser "manuellement" en ligne de commande.
Par exemple:
Lorsqu'on exécute ansible, la connexion se fait avec l'utilisateur courant donc si la clé privée sur le serveur distant est celle de remi, lancer une commande ansible avec root ne fonctionne pas... Il faut alors spécifier manuellement la clé (avec l'option --key-file de la commande ansible
ansible.cfg est le fichier de configuration d'ansible.
Si celui-ci n'est pas présent dans /etc/Ansible/, il est possible de le générer via la commande :
Cette commande n'est valable que depuis ansible 2.12. Pour les versions antérieures, on peut aller chercher des exemples de fichier ansible.cfg sur le github du projet. Par exemple pour la version 2.10 : Github de la version 2.10
Ce fichier gérera tout Ansible mais il est aussi possible de faire des fichiers plus spécifiques dans le dossier home (.Ansible/ansible.cfg) qui ne s'appliquera qu'à un utilisateur donné ou dans le dossier d'un playbook pour qu'il ne s'applique qu'à ce playbook.
On peut dans ce fichier modifier la localisation du fichier hosts mais ce n'est pas conseillé (voir ci-après)
Pour voir le fichier de configuration pris en compte, on peut utiliser la commande suivante :
Voici quelques paramètres intéressants à modifier dans ansible.cfg :
S'affranchir de la validation du fingerprint lors de la première connexion :
Les inventory vont permettre de lister les serveurs cibles d'Ansible. On peut y spécifier notamment :
A vérifier : les users et port doivent-ils être défini dans les inventory ou la config ssh suffit-elle
Le fichier inventory sera au format YAML, plus pratique (.yml ou .yaml).
Exemple d'un fichier d'inventory :
On met ici comme exemple la possibilité de définir des variables dans l'inventory mais ce n'est pas le meilleur endroit où le faire. Il est préférable d'utiliser des dossiers group_vars et host_vars pour cela. On peut ensuite soit créer des fichier avec le nom des groupes soit des dossiers avec le nom des groupes puis un fichier avec les variables à l'intérieur du fichier
Un fichier par groupe avec les variables à l'intérieur :
├── 00_inventory.yml
├── group_vars
│ ├── debian.yml
│ └── ubuntu.yml
└── host_vars
└── srv8.yml
Cette commande permet d'afficher de différentes manières l'inventory.
renverra l'inventaire avec -i le fichier d'inventaire. Voici la forme de restitution :
Code TEXT :
{
"_meta": {
"hostvars": {
"srv1": {
"var1": "debian"
},
"srv10": {
"var1": "linux"
},
"srv3": {
"var1": "debian"
},
"srv4": {
"var1": "debian"
},
"srv5": {
"var1": "debian"
},
"srv6": {
"var1": "debian"
},
"srv8": {
"var1": "Ubuntu"
},
"srv9": {
"var1": "linux"
}
}
},
L'option --yaml permet d'afficher en format yml. Cela revient à afficher le fichier inventory.yml en y ajoutant les variables des group_vars et host_vars.
Code TEXT :
all:
children:
debian:
hosts:
srv1:
var1: debian
srv3:
var1: debian
srv4:
var1: debian
srv5:
var1: debian
srv6:
var1: debian
ubuntu:
hosts:
srv10:
var1: linux
srv8:
var1: Ubuntu
srv9:
var1: linux
ungrouped: {}
L'option --graph à la place de --list change le format de restitution :
Code TEXT :
@all:
|--@debian:
| |--srv1
| |--srv3
| |--srv4
| |--srv5
| |--srv6
|--@ubuntu:
| |--srv10
| |--srv8
| |--srv9
|--@ungrouped:
L'option --vars ajouté à l'option --graph ajoute les variables.
Code TEXT :
@all:
|--@debian:
| |--srv1
| | |--{var1 = debian}
| |--srv3
| | |--{var1 = debian}
| |--srv4
| | |--{var1 = debian}
| |--srv5
| | |--{var1 = debian}
| |--srv6
| | |--{var1 = debian}
| |--{var1 = debian}
|--@ubuntu:
| |--srv10
| | |--{var1 = linux}
| |--srv8
| | |--{var1 = Ubuntu}
| |--srv9
| | |--{var1 = linux}
| |--{var1 = linux}
|--@ungrouped:
Le playbook s'écrit au format yaml. Il peut se mettre à la racine du dossier ansible ou dans un sous-dossier.
Il permet de faire le lien entre l'inventory et les tâches à réaliser.
Pour y mettre directement des tasks, on peut l'écrire de cette façon :
Code TEXT :
- name: "Mise à jour serveurs Debian"
hosts: serveurs
become: yes
become_method: su
tasks:
- name: "Update cache"
apt:
update_cache: yes
- name: "Full-upgrade"
apt:
upgrade: full
- name: "Autoremove & purge"
apt:
autoremove: yes
purge: yes
- name: "Vérification de la nécessité d'un reboot"
register: reboot_required_file
stat:
path: /var/run/reboot-required
- name: "Reboot si besoin"
reboot:
msg: "Reboot via Ansible"
connect_timeout: 10
reboot_timeout: 300
test_command: uptime
when: reboot_required_file.stat.exists
Pour lancer un playbook, on utilise la commande ansible-playbook.
Par exemple :
upgrade.yml est le chemin vers le playbook.
Lorsqu'on lance un module (avec -m), on lui passe les paramètres avec l'option (-a puis entre " " les paramètres).
Voir ci-dessous quelques exemples.
Le module apt permet de gérer les paquets. Les principaux paramètres sont :
En CLI :
Via un playbook :
Code TEXT :
- name: "Installation de htop"
hosts: transmission
become: yes
become_method: su
tasks:
- name: "Installation"
apt:
name: htop
state: present