Inventaire Ansible

Objectifs de certification

RHCE EX294 (RHEL8)

Si vous poursuivez des objectifs de certification ce document tente de répondre à ceux-ci :

  • 2. Maîtrise des composants de base d’Ansible
    • 2.1. Inventaires
  • 3. Installation et configuration d’un nœud de contrôle Ansible
    • 3.4. Créer et utiliser des inventaires statiques pour définir des groupes d’hôtes
  • 9. Utilisation des fonctions Ansible avancées
    • 9.3. Utilisation de variables et de facts Ansible

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” pour l’exécution de tâches “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.

Un 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 le format 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=ubuntu
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 direct à l’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.

Par exemple, pour désigner un inventaire directement comme une liste d’hôtes avec les binaires ansible-playbook ou ansible :

ansible -i '192.168.88.1,' -m ping all

8.2. Hôte localhost

Un inventaire implicite existe toujours pour l’hôte spécial localhost. Pour l’hôte local, la machine qui exécute Ansible, il n’est donc pas nécessaire de créer un inventaire. Toutefois, la variable ansible_connection valorisée avec local est conseillée pour une communication interne directe. Si la configuration ou l’inventaire ne le précise pas, il faudrait le faire dans le jeu.

8.3. Chemin par défaut de l’inventaire

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

9. Appel à un script d’inventaire dynamique

Developing dynamic inventory

Working with dynamic inventory

Inventory Plugins

ansible/contrib/inventory/

10. Notes à developper

  • Les 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.
  • On peut limiter l’exécution des jeux sur certains hôtes seulement (option -l, --limit).
  • On peut passer des variables sur la commande d’exécution ansible ou ansible-playbook (option -e).
  • On peut ajouter dynamiquement des hôtes à l’inventaire en cours : module add_host
  • On peut utiliser des scripts d’inventaires dynamiques.

Laisser un commentaire