Comment travailler avec des variables et des faits Ansible - Partie 8
Nous avons mentionné les variables dans cette série Ansible et juste pour vous rafraîchir un peu l'esprit. Une variable, tout comme dans de nombreux langages de programmation, est essentiellement une clé qui représente une valeur.
Qu'est-ce qui constitue un nom de variable valide ?
Un nom de variable comprend des lettres, des chiffres, des traits de soulignement ou un mélange de 2 ou de la totalité d'entre eux. Gardez toutefois à l’esprit qu’un nom de variable doit toujours commencer par une lettre et ne doit pas contenir d’espaces.
Jetons un coup d'œil à quelques exemples de noms de variables valides et inacceptables :
Exemples de noms de variables valides :
football
foot_ball
football20
foot_ball20
Exemples de noms de variables non valides :
foot ball
20
foot-ball
Discutons des types de variables :
1. Variables du manuel de jeu
Les variables Playbook sont assez simples et directes. Pour définir une variable dans un playbook, utilisez simplement le mot clé vars avant d'écrire vos variables avec indentation.
Pour accéder à la valeur de la variable, placez-la entre les doubles accolades entourées de guillemets.
Voici un exemple simple de playbook :
- hosts: all
vars:
greeting: Hello world!
tasks:
- name: Ansible Basic Variable Example
debug:
msg: "{{ greeting }}"
Dans le playbook ci-dessus, la variable greeting est remplacée par la valeur Hello world! lorsque le playbook est exécuté. Le playbook imprime simplement le message Bonjour tout le monde ! une fois exécuté.
De plus, vous pouvez avoir une liste ou un tableau de variables comme indiqué :
Le playbook ci-dessous montre une variable appelée continents. La variable contient 5 valeurs différentes – les noms des continents. Chacune de ces valeurs est facilement accessible en utilisant l'index 0 comme première variable.
L'exemple du playbook ci-dessous récupère et affiche Asie (Index 1).
- hosts: all
vars:
continents:
- Africa
- Asia
- South America
- North America
- Europe
tasks:
- name: Ansible List variable Example
debug:
msg: "{{ continents [1] }}"
La liste des variables peut être structurée de la même manière comme indiqué :
vars:
Continents: [Africa, Asia, South America, North America, Europe]
Pour lister tous les éléments de la liste, utilisez le module with_items. Cela parcourra toutes les valeurs du tableau.
- hosts: all
vars:
continents: [Africa, Asia, South America, North America, Europe]
tasks:
- name: Ansible array variables example
debug:
msg: "{{ item }}"
with_items:
- "{{ continents }}"
Un autre type de variable Ansible est la variable dictionnaire.
Les variables Dictionnaire sont également prises en charge dans le playbook. Pour définir la variable du dictionnaire, identifiez simplement la paire clé-valeur juste en dessous du nom de la variable du dictionnaire.
hosts: switch_f01
vars:
http_port: 8080
default_gateway: 10.200.50.1
vlans:
id: 10
port: 2
Dans l'exemple ci-dessus, vlans est la variable du dictionnaire tandis que id et port sont les paires clé-valeur.
hosts: switch_f01
vars:
http_port: 8080
default_gateway:
vlans:
id: 10
port: 20
tasks:
name: Configure default gateway
system_configs:
default_gateway_ip: “{{ default_gateway }}“
name: Label port on vlan 10
vlan_config:
vlan_id: “{{ vlans[‘id’] }}“
port_id: 1/1/ {{ vlans[‘port’] }}
Pour port_id, puisque nous commençons la valeur par le texte et non par la variable, les guillemets ne sont pas nécessaires pour entourer les accolades.
2. Variables spéciales
Ansible fournit une liste de variables prédéfinies qui peuvent être référencées dans les modèles et playbooks Jinja2 mais qui ne peuvent pas être modifiées ou définies par l'utilisateur.
Collectivement, la liste des variables prédéfinies Ansible est appelée Faits Ansible et celles-ci sont collectées lors de l'exécution d'un playbook.
Pour obtenir une liste de toutes les variables Ansible, utilisez le module setup dans la commande ad hoc Ansible comme indiqué ci-dessous :
ansible -m setup hostname
Cela affiche la sortie au format JSON comme indiqué :
ansible -m setup localhost
À partir du résultat, nous pouvons voir que certains des exemples de variables spéciales Ansible incluent :
ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux
Il existe de nombreuses autres variables spéciales Ansible, ce ne sont que quelques exemples.
Ces variables peuvent être utilisées dans un modèle Jinja2 comme indiqué :
<html>
<center>
<h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
<h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>
3. Variables d'inventaire
Enfin, sur la liste, nous avons les variables d'inventaire Ansible. Un inventaire est un fichier au format INI qui contient tous les hôtes à gérer par Ansible.
Dans les inventaires, vous pouvez attribuer une variable à un système hôte et l'utiliser ultérieurement dans un playbook.
[web_servers]
web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080
Ce qui précède peut être représenté dans un fichier playbook YAML comme indiqué :
---
web_servers:
web_server_1:
ansible_user=centos
http_port=80
web_server_2:
ansible_user=ubuntu
http_port=8080
Si les systèmes hôtes partagent les mêmes variables, vous pouvez définir un autre groupe dans le fichier d'inventaire pour le rendre moins lourd et éviter les répétitions inutiles.
Par exemple:
[web_servers]
web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80
Ce qui précède peut être structuré comme suit :
[web_servers]
web_server_1
web_server_2
[web_servers:vars]
ansible_user=centos
http_port=80
Et dans le fichier YAML du playbook, cela sera défini comme indiqué :
---
web_servers:
hosts:
web_server_1:
web_server_2:
vars:
ansible_user=centos
http_port=80
Faits ansibles
Lors de l'exécution de playbooks, la première tâche effectuée par Ansible est l'exécution de la tâche de configuration. Je suis presque sûr que vous avez dû tomber sur le résultat :
TASK: [Gathering facts] *********
Les faits ansibles ne sont rien d'autre que des propriétés système ou des informations sur les nœuds distants auxquels vous êtes connecté. Ces informations incluent l'architecture du système, la version du système d'exploitation, les informations sur le BIOS, l'heure et la date du système, la disponibilité du système, l'adresse IP et les informations sur le matériel, pour n'en citer que quelques-unes.
Pour obtenir des informations sur n'importe quel système, utilisez simplement le module setup comme indiqué dans la commande ci-dessous :
ansible -m setup hostname
Par exemple:
ansible -m setup database_server
Cela imprime un grand ensemble de données au format JSON, comme indiqué :
Les faits Ansible sont utiles pour aider les administrateurs système à déterminer les opérations à effectuer. Par exemple, en fonction du système d'exploitation, ils sont capables de savoir quels progiciels doivent être installés et comment ils doivent être configurés, etc.
Faits personnalisés
Saviez-vous également que vous pouvez créer vos propres faits personnalisés qui peuvent être collectés par Ansible ? Oui, vous pouvez. Alors comment procéder ? Changeons de vitesse et voyons comment.
La première étape consiste à créer un répertoire /etc/ansible/facts.d sur le nœud géré ou distant.
Dans ce répertoire, créez un ou plusieurs fichiers avec une extension .fact
. Ce ou ces fichiers renverront des données JSON lorsque le playbook est exécuté sur le nœud de contrôle Ansible, qui incluent les autres faits qu'Ansible récupère après l'exécution d'un playbook.
Voici un exemple de fichier de faits personnalisé appelé date_time.fact qui récupère la date et l'heure.
mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact
Ajoutez-y les lignes suivantes.
#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"
Enregistrez et quittez le fichier.
Attribuez maintenant les autorisations d'exécution :
chmod +x /etc/ansible/facts.d/date_time.fact
Maintenant, j'ai créé un playbook sur le nœud de contrôle Ansible appelé check_date.yml.
---
- hosts: webservers
tasks:
- name: Get custom facts
debug:
msg: The custom fact is {{ansible_local.date_time}}
Ajoutez le fichier de faits à la variable ansible_local. ansible_local stocke tous les faits personnalisés.
Exécutez maintenant le playbook et observez Ansible récupérer les informations enregistrées dans le fichier de faits :
ansible_playbook check_date.yml
Conclusion
Cela nous amène à la fin de ce didacticiel sur l'utilisation des variables et des faits Ansible.