Inventaire Ansible

Si vous poursuivez des objectifs de certification ce document y répond de manière partielle :

  • 1. Comprendre les composants de base d’Ansible
    • Inventaires
  • 3. Utiliser des inventaires statiques et dynamiques pour définir des groupes d’hôtes
  • 4. Utiliser un script d’inventaire dynamique existant
  • 7. Travailler avec des variables et des “Facts” Ansibles

1. 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”). Cela est aussi vrai pour le mode “ad-hoc”.

La page de documentation sur l’inventaire est certainement à consulter : Introduction à l’inventaire Ansible. Une lecture de la page How to build your inventory pourrait également être utile.

Aussi, la leçon 2) Inventaire de base du tutoriel interactif sur Ansible vous permet de pratiquer ce sujet. La leçon 4) Groupes et variables du tutoriel interactif sur Ansible vous permettra d’aller plus loin avec les variables d’inventaire.

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 un livre de jeu. 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:

2. Groupes imbriqués

[paris]
www01
www02

[lyon]
www03
www04

[benelux]
www05
www06

[webservers]
www[01-50]

[france:children]
paris
lyon

[europe:children]
france
benelux

3. 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

4. Variables d’inventaire sur les groupes

On appliquera volontiers des variables sur les groupes :

  • ansible_connection
  • ansible_ssh_user et ansible_ssh_pass
  • ansible_become et ansible_become_method

Par exemple, dans ce fichier d’inventaire :

[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

5. 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”.

6. 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 en format YAML.1

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

7. Inventaire d’infrastructure réseau

7.1. 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

7.2. 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

7.3. 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

8. Appel à une inventaire

8.1. Appel à un inventaire

L’option -i suivie du chemin du fichier d’inventaire est utilisée pour cette précision avec les programmes ansible et ansible-playbook.

8.2. 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.

8.3. Inventaire par défaut

La configuration du chemin d’un inventaire par défaut, ici démontrée avec la configuration d’une variable d’environnement ANSIBLE_INVENTORY :

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

On peut aussi préciser le chemin du fichier d’inventaire par défaut dans le fichier de configuration ansible.cfg avec l’entrée inventory sous la section [defaults] :

[defaults]
inventory = ~/ansible_hosts

8.4. Inventaire dynamique

Ce sujet est développé spécifiquement dans le document Inventaire dynamique Ansible

9. Notes

  • Variables dynamiques d’inventaire (dépendant du contexte d’exécution) comme hostvars, groups, group_names et inventory_hostname permettent d’accéder à des variables appartenant à d’autres hôtes.
  • Limiter l’exécution à certains hôtes (option -l, --limit)
  • Passer des variables sur la commande (option -e)
  • Ajout dynamique à l’inventaire en cours : module add_host
  • Scripts d’inventaires dynamiques