Ansible
Ansible est une plate-forme logicielle libre pour la configuration et la gestion des ordinateurs. Elle combine le déploiement de logiciels (en) multi-nœuds, l’exécution des tâches ad-hoc et la gestion de configuration. Elle gère les différents nœuds à travers SSH et ne nécessite l’installation d’aucun logiciel supplémentaire sur ceux-ci. Les modules communiquent via la sortie standard en notation JSON et peuvent être écrits dans n’importe quel langage de programmation. Le système utilise YAML pour exprimer des descriptions réutilisables de systèmes, appelées playbook.
utilisation de SSH
Ansible a donc besoin de SSH pour ce faire,en ouvrant un terminal et saisis la commande ci-dessous, le paramètre t spécifie le type de chiffrement et le paramètre b le nombre de bit.
ssh-keygen -t rsa -b 4096Il faut ensuite ajouter la clé publique sur le serveur. C’est la commande ssh-copy-id qui va permettre de poser la clé publique sur le serveur distant, avec le paramètre -i elle permet de spécifier l’identity file.
ssh-copy-id -i ~/.ssh/clef_privée_ssh.pub user_ssh@ip_serveuril est possible de configurer la connexion avec la clé privée dans le fichier ~/.ssh/config et édite le fichier config avant de pas rentrer la passe-phrase à chaque utilisation de la clef.
En ajoutant un nom de Host au choix (il est recommander de données celui du nom du serveur mais ce n’est pas obligatoire), et spécifier trois options, l’User qui est l’user SSH que utiliser pour ma connection SSH, le Hostname qui est l’adresse IP du serveur ou le nom de domaine et enfin l’IdentifyFile qui est le chemin vers ta clé privée.
Host nom_choisi_host
User user_ssh
Hostname ip_serveur
IdentityFile ~/.ssh/clef_privée_sshAinsi la connection sur le serveur en SSH, il suffit d’utiliser ssh nom_choisi_host sans devoir saisir la passe-phrase de la clé.
Une fois cela fait, Ansible pourra être utiliser.
module Ansible
Ansible est un outil qui s’utilise avec des modules défini ce qui lui permet d’avoir sa propre nomenclature et évite de devoir connaitre totalement un système ou un langage particulier pour son utilisation.
Pour commencer voici un exemple de commande ansible utilisant un module simple. Le module ping permettant de faire un ping.
ansible -i "ip_serveur," all -u utilisateur_ssh -b -K -m ping cette commande permet d’utiliser ansible en une seule commande. L’option i permet de spécifié une clef ssh si il en existe plusieurs, si ce n’est pas le cas, il suffit juste de laissé i sans arguments. Le ou les différent serveurs peuvent être spécifier entre les “”, l’argument all qui suit permet de spécifier à ansible qu’on utilise tout les serveurs renseigner dans la commande. l’option u permet de mettre en argument l’utilisateur du serveur qui acceptera la connexion ssh pour ansible si il est différent de l’utilisateur de la machine master ansible. les options b et K sont des option permettant l’élevation de privilège. Une fois ses options rentrer, ansible demandera le mot de passe de l’utilisateur root du serveur. L’option m à pour effet de spécifier en argument le module que l’on va utilisé, ping pour l’exemple. Ainsi la commande retournera pong si c’est reussi ou un echec.
Attention ansible a besoin de python sur le serveur cible pour fonctionner cependant il existe quelques modules qui n’en ont pas besoin comme le module “raw”.
ansible -i "ip-server1,ip-server2,..." all -u utilisateur_ssh -b -K -m raw -a "apt install -y paquet_apt"Cette commande utilise l’option a en plus pour permet de donner en argument au module raw une commande apt. Ceci peut être pratique pour installer python sur les serveurs distant ou un paquet précis si le besoin d’administration par ansible est peu utile.
Attention cependant le module apt existe bien sur ansible mais nécessite d’avoir python sur le serveur.
| Paramètres | Commentaire |
|---|---|
| allow-change-held-packages | booléen |
| allow_downgrade aliases: allow-downgrade, allow_downgrades, allow-downgrades | boolean |
| allow_unauthenticated aliases: allow-unauthenticated | boolean |
| autoclean | booléen |
| autoremove | booléen |
| Cache-valid-time | entier |
| clean | booléen |
| deb | Path |
| default_release alias: default-release | string |
| dpkg - options | string |
| fail_on_autoremove | boolean |
| force | boolean |
Inventaires
Au lieu de référencer dans la commande les machines qui seront impacter par Ansible, il est possible de créer un fichier d’inventaire dans le /etc/ansible. Généralement appeler hosts. Il permet aussi de créer des groups de machines. ETa avoir un fichier similaire a celui qui suit.
...
[infra]
192.168.100.11
192.168.100.12
[Windows]
ip_machine_windows
[Linux]
ip_machine_linux
[Web]
ip_machine_web
...
Playbooks
Les playbooks sont des fichiers YAML permettant d’utiliser plusieurs mondules modules déclarer à la suite afin d’avoir un ou plusieurs fichiers utilisable et réutilisables pour du déploiement,de l’ochestration ou de l’application de configuration.
Pour cela un playbook ressemble à ceci
- name: nom du groupes de taches pour ce groupes de machines
hosts: les machines référencer dans le fichier d'inventaire
become: true
tasks:
- name: installation du paquet apt
ansible.builtin.apt:
name: nom_du_paquet_apt
update_cache: yes #mets à jour le cache apt
state: present
- name: demarrer le service télécharger sur le répo APT
service:
name: nom du service systemd
state: started #le service a été démarrer et se lancera au démarrage
utilisation de template
Pour le déploiement de fichier de configuration ou de modification de fichier de configuration, il faut utiliser des template Jinja2. Pour cela il faut avoir le fichier de configuration original, le renommer en .j2 (pour une meilleur lisibilité). Une fois fait, dans le playbook déclarer plus haut, le template va être rajouter. Avec une utilisation en localhost
- name: nom du groupe de taches pour ce groupes de machines
hosts: les machines référencer dans le fichier d'inventaire
become: true (permettre l'utilisation de la commande sudo si l'utilisateur n'est pas root)
tasks:
- name: installation du paquet apt
ansible.builtin.apt:
name: nom_du_paquet_apt
update_cache: yes #mets à jour le cache apt
state: present
- name: demarrer le service télécharger sur le répo APT
service:
name: nom du service systemd
state: started #le service a été démarrer et se lancera au démarrage
- name: utilisation d'un template
hosts: localhost
connection: local ( permet de faire comprendre à Ansible qu'il applique les taches en locals)
tasks:
- name: application du template
template:
src: template_node_ip.j2
dest: /home/vagrant/prometheus/prometheus.yml
vars: #mes variables qui seront déclarer
nom_variable: #mise en place d'une liste
- variable1
- variable2
Pour appliquer le templates il faut déclarer comme ci dessus des variables et les référencer dans le template à l’endroit où la variable sera appliquer de cette façon {{ nom_variable }}.
Pour l’utilisation sur Windows
Ansible est outils qui utilise SSH et python pour fonctionner cependant, pour Windows le SSH n’est pas forcement utilisé. Pour cela, Ansible permet d’utilisé un protocole interne à Microsoft WinRM. Qui est utiliser pour la liaison des machines Windows dans un contrôleur de domaine. Ceci est applicable seulement avec WinRM et un systeme Windows utilisant WinRM ( qui est normalement activer par defaut) Pour ce faire il faut référencer le fichier d’inventaire différemment en précisant qu’on utilise le protocole WinRM.
ansible_connection=winrm
Si Kerberos est utilisé aux seins du domaine. Pour pouvoir utiliser ansible avec kerberos il faut installer kerberos sur la machine ansible et référencer les options dans le fichier /etc/krb5.conf. Pour commencer il faut éditeur le fichier d’inventaire en fonction de kerberos
[windows]
_hostname_windows_serveur ansible_host=ip_server_windows
[windows:vars]
ansible_user=domain_user@DOMAIN.LOCAL
ansible_password=password_domaine_user
ansible_port=5985 #port par defaut de winrm en http
ansible_connection=winrm
ansible_winrm_transport=kerberos
ansible_winrm_kerberos_delegation=true
Afin que les informations d’indentification ne soit pas consultable facilement, il est possible de créer un fichier YAML comme par exemple “credential.yml” avec dedans les informations d’identification.
ansible_user=domain_user@DOMAIN.LOCAL ansible_password=user_domain_password
un fois fait, il faut utiliser la commande suivant pour chiffrer le fichier avec un mot de passe.
ansible-vault encrypt credential.yml
Une fois fait, il faut installer le serveur kerberos, pywinrm et modifier le fichier de configuration krb5.conf.
apt install pywinrm libkrb5-dev krb5-config krb5-clients krb5-user
[libdefaults]
default_realm = DOMAIN.LOCAL
[realms]
DOMAIN.LOCAL = {
kdc = dc.DOMAIN.LOCAL
admin_server = dc.DOMAIN.LOCAL
default_domain = DOMAIN.LOCAL
default_domain = DOMAIN.LOCAL
}
[domain_realm]
.domain.local = DOMAIN.LOCAL
domain.local = DOMAIN.LOCAL
Une fois fait, il faut sur le serveur Windows taper la commande powershell suivant:
Set-Item -Path WSMan:\localhost\Service\AllowUnencrypted -Value true