Concepts#

Ansible est un logiciel libre (GPLv3) d’automatisation à large spectre. Ansible est notamment très adapté pour la configuration et la gestion des ordinateurs. Il combine le déploiement de logiciels multi-hosts et multi-os, l’exécution de tâches ad hoc et la gestion de configuration.

Il interagit avec ces différents hosts à travers SSH (par défaut, de nombreuses options sont disponibles) et ne nécessite l’installation d’aucun logiciel supplémentaire sur ceux-ci.

Le but principal du projet Ansible est de rester simple d’accès et d’utilisation. Le projet déploie également de gros efforts sur la sécurité et la fiabilité. Le langage d’expression d’Ansible est notamment pensé pour être auditable par des humains non formés à Ansible.

Ansible…#

  • est codé en Python et distribué comme un package PyPi ;

  • exécute des actions décrites en YAML (écrit par ses utilisateurs) ;

  • peut exécuter des actions sur un ou plusieurs systèmes distants ;

  • repose sur SSH comme mécanique de connexion par défaut ;

  • vise à l’idempotence ;

  • s’installe dans l’espace utilisateur ;

  • ne nécessite pas l’installation d’agent sur les machines pilotées.


Lexique#

Inventaire#

Liste de machines avec lesquelles interagir, organisées en groupes. Un inventaire peut être :

  • statique : un fichier au format INI, YAML ou JSON

  • dynamique : un retour JSON sur le stdout d’un programme à exécuter par Ansible

Exemple d’inventaire statique

web_1 ansible_host=10.10.10.101 ansible_ssh_private_key_file=...
web_2 ansible_host=10.10.10.102 ansible_ssh_private_key_file=...

[web_servers]
web_1
web_2

[databases]
db_1 ansible_host=10.10.20.201 ansible_ssh_private_key_file=...
10.10.20.202 ansible_ssh_private_key_file=...

[production:children]
web_servers
databases

Exemple d’inventaire dynamique

$ ./dyn_inventory --list
{ 
  "databases" : { 
    "hosts" : [ "db_1", "10.10.20.202" ]
  }, 

  "web_servers" : [ "web_1", "web_2" ],

  "production" : { 
    "children": [ "web_servers", "databases" ]
  }
}

$ ./dyn_inventory --host web_1
{ 
  "ansible_host": "10.10.10.101" 
}

Les inventaires dynamiques peuvent prendre la forme de scripts et donc forger leur réponse en interrogeant des API qui connaissent les machines auxquelles se connecter (AWS, OpenStack, Cobbler, etc.).

Module/Task#

C’est la plus petite unité d’action disponible. Le résultat de son exécution par Ansible peut être changed, ok ou failed.

Exemple d’appel au module apt

- name: un joli titre c’est mieux
  apt: 
    pkg: "tmux"
    state: present

Handler#

Task lancée en fin de play si “notifiée” par une autre task, c’est-à-dire si la task porte un attribut notify avec le name du handler et que son résultat d’exécution est changed. Un handler notifié plusieurs fois ne sera exécuté qu’une fois.

Exemple de handler

---
- hosts: webservers 
  tasks: 
    - template: [...] 
      notify: restart my service 

  handlers:
    - name: restart my service 
      service: 
        name: my_service
        state: restarted

Rôle#

Unité de réutilisation de code Ansible. Peut contenir des tasks, des handlers, des templates, des fichiers et des variables.

Organisation d’un rôle

├── defaults 
│   └── main.yml --> variables par défaut (aisément redéfinissables)
├── files        --> fichiers statiques 
├── handlers 
│   └── main.yml --> handlers 
├── meta 
│   └── main.yml --> fiche d'info et dépendances 
├── tasks 
│   └── main.yml --> tâches (appels de modules) 
├── templates    --> templates Jinja2 
├── tests 
│   ├── inventory 
│   └── test.yml 
└── vars
    └── main.yml --> variables redéfinissables uniquement par option en ligne de commande

Playbook#

Liste d’objets Play. Un Play est une liste de rôles et/ou de tasks à appliquer sur un groupe de machines cibles.

Exemple de fichier playbook contenant 2 plays

---
- hosts: web_servers
  become: yes
  tasks:
    - service: 
        name: sshd
        state: stopped

- hosts: web_servers
  become: yes
  tasks:
    - service: 
        name: sshd
        state: started

Collection#

Unité de réutilisation de code Ansible. Peut contenir des rôles, des playbooks et des plugins.

Organisation d’une collection

├── docs/
├── galaxy.yml
├── meta/
│   └── runtime.yml
├── plugins/
│   ├── modules/
│   │   └── module1.py
│   ├── inventory/
│   └── .../
├── README.md
├── roles/
│   ├── role1/
│   ├── role2/
│   └── .../
├── playbooks/
│   ├── files/
│   ├── vars/
│   ├── templates/
│   └── tasks/
└── tests/