Ansible - Outer Heaven

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 4096

Il 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_serveur

il 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_ssh

Ainsi 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