Inventaire Ansible

La portée d’un jeu (“play”) au sein du livre de jeu, le “playbook”, est limitée aux groupes d’hôtes définis dans l’inventaire (”inventory”).

La page de documentation sur l’inventaire est certainement à consulter : Introduction à l’inventaire Ansible.

Une inventaire peut être une collection d’hôtes définis dans un fichier plat ou un script dynamique (qui interroge un CMDB par exemple) qui génère une liste de périphériques à utiliser dans “playbook”. Il est peut être statique, soit défini d’avance ; il peut se créer dynamiquement ou encore être mis à jour dynamiquement.

Voici des fournisseurs supportés par un inventaire dynamique : BSD Jails, DigitalOcean, Google Compute Engine, Linode, OpenShift, OpenStack, Ovirt, SpaceWalk, Scaleway, Vagrant (à ne pas confondre avec le “provisioner” dans Vagrant, qui est préféré), Zabbix, …

Un livre de jeu précise toujours ses cibles en remplissant le paramètre hosts. Un inventaire identifie les différentes cibles des livres de jeu.

Le fichier d’inventaire par défaut est précisé dans la configuration d’Ansible.

Il prend aussi bien le format INI que YAML, mais aussi en CSV (on le trouvera couramment en format INI). Les sections entre crochets identifient des groupes d’hôtes.

mail.example.com

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

Tous les hôtes et tous les groupes font partie du groupe all :

all:
  hosts:
    mail.example.com:
  children:
    webservers:
      hosts:
        foo.example.com:
        bar.example.com:
    dbservers:
      hosts:
        one.example.com:
        two.example.com:
        three.example.com:

1. Groupes imbriqués

[paris]
www01
www02

[lyon]
www03
www04

[benelux]
www05
www06

[webservers]
www[01-50]

[france:children]
paris
lyon

[europe:children]
france
benelux

2. Variables d’inventaire sur les hôtes

  • ansible_host
  • ansible_port

Vous pouvez associer des variables aux hôtes :

web ansible_port=22 ansible_host=192.168.122.50

Vous pouvez simplifier votre inventaire avec des motifs :

[webservers]
www[01:50].example.com

Un autre exemple dans lequel on spécifie le type de connexion et l’utilisateur ssh :

[targets]

localhost ansible_connection=local
other1.example.com ansible_connection=ssh ansible_ssh_user=user
other2.example.com ansible_connection=ssh ansible_ssh_user=user

3. Variables d’inventaire sur les groupes

  • ansible_connection
  • ansible_ssh_user et ansible_ssh_pass
  • ansible_become et ansible_become_method
[webservers]
app1
app2

[dbservers]
db

[all:vars]
ansible_connection=ssh
ansible_ssh_user=root
ansible_ssh_pass=testtest

ou encore :

[debian]
app[01-02]

[rhel]
app[03-04]

[ubuntu]
app[05-06]

[webservers]
app[01-06]

[others:children]
debian
rhel

[ubuntu:vars]
ansible_ssh_user=user
ansible_ssh_pass=testtest
ansible_become=true

[others:vars]
ansible_ssh_user=root
ansible_ssh_pass=testtest

[all:vars]
ansible_connection=ssh

4. Précédences des variables

  • Les “Group variables” s’appliquent pour tous les périphériques d’un groupe.
  • Les “Host variables” s’appliquent uniquement sur le périphériques et outrepassent les “Group variables”.

5. Organisation en fichiers de variables d’inventaire

Au lieu de placer les variables des hôtes et des groupes dans le fichier d’inventaire, il est possible de les encoder dans fichiers séparés prenant le nom de l’hôte ou du groupe dans les dossiers par défaut group_vars et host_vars.1

group_vars/
  all.yml
  webservers.yml
  dbservers.yml
host_vars/
  www01.yml
  www02.yml
  db01.yml
  db02.yml

6 Inventaire d’infrastructure réseau

Les hôtes

10.1.1.2
10.1.1.3
172.16.1.1
172.16.1.2
192.168.1.2
192.168.1.3

Les groupes

Il y a toujours un groupe par défaut appelé “all”.

[atl]
access1.atl.com ansible_host=10.1.1.2
access2.atl.com ansible_host=192.168.1.2

[core]
core1.nw.com
core2.nw.com

[access]
access1.nw.com
access2.nw.com

Les groupes qui s’imbriquent.

[DC:children]
core
access

[east-coast:children]
DC
atl

[atl]
access1.atl.com ansible_host=10.1.1.2
access2.atl.com ansible_host=192.168.1.2

[core]
core1.nw.com
core2.nw.com

[access]
access1.nw.com
access2.nw.com

Variables d’inventaire

[all:vars]
ansible_username=admin
ansible_password=pa55w0rd
snmp_ro=public123
snmp_rw=private123

[east-coast:vars]
ntp_server=10.99.99.99
anycast=169.1.1.1

[DC:children]
core
access

[east-coast:children]
DC
atl

[atl]
access1.atl.com ansible_host=10.1.1.2 snmp_ro=atl123
access2.atl.com ansible_host=192.168.1.2

[core]
core1.nw.com snmp_ro=corepub123 snmp_rw=corepri123
core2.nw.com

[access]
access1.nw.com ansible_username=localadmin
access2.nw.com

7. Appel à une inventaire

Appel à un inventaire

Hôte localhost

Un inventaire implicite existe toujours pour l’hôte spécial localhost. Pour celui-ci, il n’est donc pas nécessaire de créer un inventaire. Toutefois la variable ansible_connection sur local. Si la configuration ou l’inventaire ne le précise pas, il faudrait le faire dans le jeu.

Création d’un inventaire par défaut

echo "127.0.0.1 ansible_connection=local" > ~/ansible_hosts
export ANSIBLE_INVENTORY=~/ansible_hosts

8. Gestion avancées

  • Variable dynamiques d’inventaire (dépendant du contexte d’exécution)
  • Limiter l’exécution à certains hôtes
  • Passer des variables sur la commande
  • Vebosité
  • Ajout dynamique à l’inventaire : module add_host
  • Inventaires dynamiques