Introduction
Les variables hostvars d'Ansible sont des variables essentielles qui stockent des informations sur chaque hôte géré dans votre infrastructure. Ces variables vous permettent de créer des flux d'automatisation dynamiques et flexibles qui s'adaptent à différents serveurs et environnements.
Dans ce laboratoire pratique, vous apprendrez à travailler avec les variables hostvars d'Ansible à partir de zéro. Vous configurerez un inventaire simple, accéderez aux variables hostvars dans les playbooks, les utiliserez dans les modèles (templates) et explorerez des cas d'utilisation pratiques. À la fin de ce laboratoire, vous comprendrez comment exploiter les variables hostvars pour rendre votre automatisation Ansible plus puissante et adaptable.
Configuration de l'environnement du laboratoire
Avant de plonger dans les variables hostvars d'Ansible, nous devons configurer notre environnement de travail. Dans cette étape, nous allons installer Ansible, créer une structure de répertoire de projet et préparer notre fichier d'inventaire.
Installation d'Ansible
Commençons par installer Ansible sur notre système :
sudo apt update
sudo apt install -y ansible
Après l'installation, vérifiez qu'Ansible est correctement installé :
ansible --version
Vous devriez voir une sortie similaire à celle-ci :
ansible [core 2.12.x]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.x (default, Mar 15 2023, 11:42:32) [GCC 11.3.0]
jinja version = 3.0.3
libyaml = True
Création de la structure du projet
Maintenant, créons une structure de répertoire appropriée pour notre projet Ansible :
mkdir -p ~/project/ansible_hostvars/inventory
mkdir -p ~/project/ansible_hostvars/group_vars
mkdir -p ~/project/ansible_hostvars/playbooks
mkdir -p ~/project/ansible_hostvars/templates
cd ~/project/ansible_hostvars
Création d'un fichier d'inventaire
Ansible utilise des fichiers d'inventaire pour définir les hôtes et les groupes qu'il va gérer. Créons un fichier d'inventaire simple avec quelques hôtes exemples :
cat > ~/project/ansible_hostvars/inventory/hosts << 'EOF'
[webservers]
web01 ansible_host=192.168.1.10 http_port=80 max_connections=100
web02 ansible_host=192.168.1.11 http_port=8080 max_connections=200
[dbservers]
db01 ansible_host=192.168.1.20 db_port=3306 backup_dir=/var/backups
db02 ansible_host=192.168.1.21 db_port=5432 backup_dir=/opt/backups
[all:vars]
ansible_connection=local
ansible_user=labex
environment=development
EOF
Dans ce fichier d'inventaire :
- Nous avons défini deux groupes :
webserversetdbservers - Chaque hôte possède des variables spécifiques comme
http_portoudb_port - Nous avons défini des variables globales pour tous les hôtes sous
[all:vars] - Nous utilisons
ansible_connection=localcar il s'agit d'un environnement de laboratoire
Créons également un fichier ansible.cfg simple dans notre répertoire de projet :
cat > ~/project/ansible_hostvars/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
EOF
Maintenant, vérifions notre inventaire :
cd ~/project/ansible_hostvars
ansible-inventory --list
Vous devriez voir une sortie JSON affichant tous les hôtes et leurs variables dans votre inventaire.
Félicitations ! Vous avez configuré avec succès votre environnement Ansible et créé un inventaire avec des variables d'hôte. Dans la prochaine étape, nous explorerons comment accéder à ces variables en utilisant hostvars.
Exploration des variables hostvars d'Ansible
Maintenant que notre environnement est configuré, explorons les variables hostvars d'Ansible et apprenons comment y accéder dans les playbooks.
Comprendre les variables hostvars
Dans Ansible, hostvars est une variable spéciale qui contient des informations sur tous les hôtes de votre inventaire. C'est un dictionnaire où les clés sont les noms d'hôtes et les valeurs sont des dictionnaires contenant toutes les variables définies pour chaque hôte.
Créons un playbook simple pour explorer les variables hostvars :
cat > ~/project/ansible_hostvars/playbooks/explore_hostvars.yml << 'EOF'
---
- name: Explore hostvars
hosts: all
gather_facts: no
tasks:
- name: Display host variables for the current host
debug:
msg: "Host: {{ inventory_hostname }} has the following variables: {{ hostvars[inventory_hostname] }}"
- name: Display a specific variable for the current host
debug:
msg: "Host {{ inventory_hostname }} has environment: {{ hostvars[inventory_hostname]['environment'] }}"
EOF
Maintenant, exécutons ce playbook :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/explore_hostvars.yml
Vous devriez voir une sortie avec les variables de chaque hôte. La première tâche affiche toutes les variables pour chaque hôte, tandis que la seconde tâche affiche une variable spécifique.
Création d'un playbook de variables spécifiques à l'hôte
Créons un autre playbook qui démontre comment accéder à différents types de variables spécifiques à l'hôte :
cat > ~/project/ansible_hostvars/playbooks/host_specific_vars.yml << 'EOF'
---
- name: Working with host-specific variables
hosts: all
gather_facts: no
tasks:
- name: Display web server information
debug:
msg: "Web server {{ inventory_hostname }} running on port {{ hostvars[inventory_hostname]['http_port'] | default('N/A') }}"
when: inventory_hostname in groups['webservers']
- name: Display database server information
debug:
msg: "Database server {{ inventory_hostname }} running on port {{ hostvars[inventory_hostname]['db_port'] | default('N/A') }}"
when: inventory_hostname in groups['dbservers']
EOF
Exécutez ce playbook :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/host_specific_vars.yml
Vous devriez voir une sortie qui affiche des informations différentes pour les serveurs web et les serveurs de base de données, en fonction de leurs variables respectives.
Accès aux variables d'autres hôtes
L'une des fonctionnalités puissantes de hostvars est que vous pouvez accéder aux variables de n'importe quel hôte de votre inventaire. Créons un playbook qui démontre cela :
cat > ~/project/ansible_hostvars/playbooks/cross_host_vars.yml << 'EOF'
---
- name: Access variables from other hosts
hosts: web01
gather_facts: no
tasks:
- name: Display information about web01 and db01
debug:
msg: |
Web server: {{ inventory_hostname }}
Web server port: {{ hostvars[inventory_hostname]['http_port'] }}
Database server: db01
Database port: {{ hostvars['db01']['db_port'] }}
Backup directory: {{ hostvars['db01']['backup_dir'] }}
EOF
Exécutez ce playbook :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/cross_host_vars.yml
Vous devriez voir une sortie qui affiche des informations provenant à la fois de web01 et de db01, même si le playbook ne s'exécute que sur web01.
Cela démontre comment hostvars vous donne accès aux variables de tous les hôtes de votre inventaire, vous permettant de créer des relations et des dépendances complexes entre les hôtes dans votre automatisation.
Utilisation des variables hostvars dans les templates
Les templates sont l'une des fonctionnalités les plus puissantes d'Ansible, et elles deviennent encore plus puissantes lorsqu'elles sont combinées avec les variables hostvars. Dans cette étape, nous allons apprendre à utiliser les variables hostvars dans les templates Jinja2 pour créer des fichiers de configuration dynamiques.
Introduction aux templates Jinja2
Ansible utilise le moteur de templating Jinja2 pour générer du contenu dynamique. Les templates vous permettent de créer des fichiers de configuration qui s'adaptent à différents hôtes et scénarios.
Créons un template de configuration de serveur web simple :
mkdir -p ~/project/ansible_hostvars/templates
cat > ~/project/ansible_hostvars/templates/nginx.conf.j2 << 'EOF'
## Server configuration for {{ inventory_hostname }}
## Generated by Ansible
server {
listen {{ hostvars[inventory_hostname]['http_port'] | default(80) }};
server_name {{ inventory_hostname }};
root /var/www/html;
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
## Max connections: {{ hostvars[inventory_hostname]['max_connections'] | default(50) }}
location / {
index index.html index.htm;
}
}
EOF
Maintenant, créons un template de configuration de base de données :
cat > ~/project/ansible_hostvars/templates/db.conf.j2 << 'EOF'
## Database configuration for {{ inventory_hostname }}
## Generated by Ansible
port = {{ hostvars[inventory_hostname]['db_port'] }}
backup_directory = {{ hostvars[inventory_hostname]['backup_dir'] }}
environment = {{ hostvars[inventory_hostname]['environment'] }}
## Database hosts in environment:
{% for host in groups['dbservers'] %}
## - {{ host }} ({{ hostvars[host]['ansible_host'] }})
{% endfor %}
EOF
Création d'un playbook pour appliquer les templates
Créons un playbook qui applique ces templates :
cat > ~/project/ansible_hostvars/playbooks/apply_templates.yml << 'EOF'
---
- name: Apply configuration templates
hosts: all
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output
state: directory
run_once: true
- name: Apply web server configuration template
template:
src: ../templates/nginx.conf.j2
dest: ~/project/ansible_hostvars/output/{{ inventory_hostname }}-nginx.conf
when: inventory_hostname in groups['webservers']
- name: Apply database configuration template
template:
src: ../templates/db.conf.j2
dest: ~/project/ansible_hostvars/output/{{ inventory_hostname }}-db.conf
when: inventory_hostname in groups['dbservers']
EOF
Maintenant, exécutons ce playbook :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/apply_templates.yml
Après avoir exécuté le playbook, vérifiez les fichiers de configuration générés :
ls -l ~/project/ansible_hostvars/output/
Vous devriez voir des fichiers de configuration générés pour chaque hôte. Examinons l'une des configurations de serveur web :
cat ~/project/ansible_hostvars/output/web01-nginx.conf
Et l'une des configurations de base de données :
cat ~/project/ansible_hostvars/output/db01-db.conf
Remarquez comment les templates utilisent les variables hostvars pour générer dynamiquement des configurations adaptées à chaque hôte.
Utilisation de boucles et de conditions dans les templates
Les templates peuvent utiliser des boucles et des conditions pour créer un contenu encore plus dynamique. Créons un template de fichier d'hôtes complet :
cat > ~/project/ansible_hostvars/templates/hosts.j2 << 'EOF'
## Hosts file generated by Ansible
127.0.0.1 localhost
## Web servers
{% for host in groups['webservers'] %}
{{ hostvars[host]['ansible_host'] }} {{ host }}
{% endfor %}
## Database servers
{% for host in groups['dbservers'] %}
{{ hostvars[host]['ansible_host'] }} {{ host }}
{% endfor %}
EOF
Ajoutons une tâche à notre playbook pour appliquer ce template :
cat > ~/project/ansible_hostvars/playbooks/hosts_template.yml << 'EOF'
---
- name: Create hosts file from template
hosts: localhost
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output
state: directory
- name: Generate hosts file
template:
src: ../templates/hosts.j2
dest: ~/project/ansible_hostvars/output/hosts
EOF
Exécutez ce playbook :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/hosts_template.yml
Vérifiez le fichier d'hôtes généré :
cat ~/project/ansible_hostvars/output/hosts
Vous devriez voir un fichier d'hôtes avec tous vos serveurs web et serveurs de base de données, généré dynamiquement à partir de votre inventaire.
Techniques avancées sur les variables hostvars
Maintenant que vous maîtrisez les bases des variables hostvars, explorons quelques techniques avancées pour travailler avec elles dans Ansible.
Utilisation des variables de groupe avec les variables hostvars
Les variables de groupe vous permettent de définir des variables qui s'appliquent à des groupes entiers d'hôtes. Créons un fichier de variables de groupe à l'emplacement correct dans notre répertoire d'inventaire :
mkdir -p ~/project/ansible_hostvars/inventory/group_vars
cat > ~/project/ansible_hostvars/inventory/group_vars/webservers.yml << 'EOF'
---
web_server_type: nginx
default_document_root: /var/www/html
enable_ssl: true
ssl_cert_path: /etc/ssl/certs
EOF
Et un autre pour les serveurs de base de données :
cat > ~/project/ansible_hostvars/inventory/group_vars/dbservers.yml << 'EOF'
---
backup_frequency: daily
backup_retention: 7
monitoring_enabled: true
alert_email: admin@example.com
EOF
Maintenant, créons un playbook qui accède à ces variables de groupe via les variables hostvars :
cat > ~/project/ansible_hostvars/playbooks/group_vars_demo.yml << 'EOF'
---
- name: Demonstrate group variables with hostvars
hosts: all
gather_facts: no
tasks:
- name: Display web server group variables
debug:
msg: |
Host: {{ inventory_hostname }}
Web Server Type: {{ hostvars[inventory_hostname]['web_server_type'] | default('N/A') }}
Document Root: {{ hostvars[inventory_hostname]['default_document_root'] | default('N/A') }}
SSL Enabled: {{ hostvars[inventory_hostname]['enable_ssl'] | default('N/A') }}
when: inventory_hostname in groups['webservers']
- name: Display database server group variables
debug:
msg: |
Host: {{ inventory_hostname }}
Backup Frequency: {{ hostvars[inventory_hostname]['backup_frequency'] | default('N/A') }}
Backup Retention: {{ hostvars[inventory_hostname]['backup_retention'] | default('N/A') }}
Monitoring Enabled: {{ hostvars[inventory_hostname]['monitoring_enabled'] | default('N/A') }}
when: inventory_hostname in groups['dbservers']
EOF
Exécutez ce playbook :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/group_vars_demo.yml
Vous devriez voir une sortie montrant comment les variables de groupe sont disponibles via les variables hostvars.
Création de rapports d'inventaire dynamiques
Créons un playbook qui génère des rapports basés sur les données d'inventaire :
cat > ~/project/ansible_hostvars/playbooks/inventory_report.yml << 'EOF'
---
- name: Generate inventory reports
hosts: localhost
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output
state: directory
- name: Generate web servers report
template:
src: ../templates/web_report.j2
dest: ~/project/ansible_hostvars/output/web_servers_report.txt
- name: Generate database servers report
template:
src: ../templates/db_report.j2
dest: ~/project/ansible_hostvars/output/db_servers_report.txt
EOF
Maintenant, créons les templates pour ces rapports :
cat > ~/project/ansible_hostvars/templates/web_report.j2 << 'EOF'
========================================
WEB SERVERS INVENTORY REPORT
========================================
{% for host in groups['webservers'] %}
HOST: {{ host }}
IP Address: {{ hostvars[host]['ansible_host'] }}
HTTP Port: {{ hostvars[host]['http_port'] }}
Max Connections: {{ hostvars[host]['max_connections'] | default('Not specified') }}
Web Server Type: {{ hostvars[host]['web_server_type'] | default('Not specified') }}
Environment: {{ hostvars[host]['environment'] }}
{% endfor %}
EOF
cat > ~/project/ansible_hostvars/templates/db_report.j2 << 'EOF'
========================================
DATABASE SERVERS INVENTORY REPORT
========================================
{% for host in groups['dbservers'] %}
HOST: {{ host }}
IP Address: {{ hostvars[host]['ansible_host'] }}
DB Port: {{ hostvars[host]['db_port'] }}
Backup Directory: {{ hostvars[host]['backup_dir'] }}
Backup Frequency: {{ hostvars[host]['backup_frequency'] | default('Not specified') }}
Backup Retention: {{ hostvars[host]['backup_retention'] | default('Not specified') }}
Environment: {{ hostvars[host]['environment'] }}
{% endfor %}
EOF
Maintenant, exécutez le playbook de rapport d'inventaire :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/inventory_report.yml
Vérifiez les rapports générés :
cat ~/project/ansible_hostvars/output/web_servers_report.txt
cat ~/project/ansible_hostvars/output/db_servers_report.txt
Ces rapports démontrent comment les variables hostvars peuvent être utilisées pour créer des rapports complets de votre infrastructure.
Gestion des variables manquantes
Lorsque vous travaillez avec les variables hostvars, il est important de gérer les cas où des variables pourraient être manquantes. Créons un playbook qui démontre un accès sécurisé aux variables :
cat > ~/project/ansible_hostvars/playbooks/safe_variable_access.yml << 'EOF'
---
- name: Demonstrate safe variable access
hosts: all
gather_facts: no
tasks:
- name: Using default filter
debug:
msg: "The value is: {{ hostvars[inventory_hostname]['nonexistent_variable'] | default('Not defined') }}"
- name: Using conditional checks
debug:
msg: >
{% if 'special_variable' in hostvars[inventory_hostname] %}
The special variable is: {{ hostvars[inventory_hostname]['special_variable'] }}
{% else %}
The special variable is not defined for this host.
{% endif %}
EOF
Exécutez ce playbook :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/safe_variable_access.yml
La sortie montre comment gérer en toute sécurité les variables manquantes en utilisant le filtre default et des vérifications conditionnelles.
Bonnes pratiques et applications concrètes
Dans cette dernière étape, nous allons explorer les bonnes pratiques pour travailler avec les variables hostvars et examiner quelques applications concrètes.
Bonnes pratiques pour l'organisation des variables
Organiser correctement vos variables est crucial pour maintenir un code Ansible propre et maintenable. Créons une structure d'inventaire plus organisée pour démontrer les bonnes pratiques :
mkdir -p ~/project/ansible_hostvars/inventory/group_vars/all
mkdir -p ~/project/ansible_hostvars/inventory/group_vars/webservers
mkdir -p ~/project/ansible_hostvars/inventory/group_vars/dbservers
mkdir -p ~/project/ansible_hostvars/inventory/host_vars
Maintenant, créons quelques fichiers de variables organisés :
cat > ~/project/ansible_hostvars/inventory/group_vars/all/common.yml << 'EOF'
---
## Variables communes pour tous les hôtes
ntp_servers:
- ntp1.example.com
- ntp2.example.com
timezone: UTC
monitoring_enabled: true
monitoring_server: monitor.example.com
EOF
cat > ~/project/ansible_hostvars/inventory/group_vars/webservers/web.yml << 'EOF'
---
## Variables spécifiques aux serveurs web
http_protocol: https
default_vhost: default.example.com
web_user: www-data
web_group: www-data
firewall_ports:
- 80
- 443
EOF
cat > ~/project/ansible_hostvars/inventory/host_vars/web01.yml << 'EOF'
---
## Variables spécifiques à l'hôte web01
server_role: primary
backup_server: web02
custom_vhosts:
- name: site1.example.com
docroot: /var/www/site1
- name: site2.example.com
docroot: /var/www/site2
EOF
Créons un playbook qui démontre l'accès à ces variables structurées :
cat > ~/project/ansible_hostvars/playbooks/structured_vars.yml << 'EOF'
---
- name: Demonstrate structured variables
hosts: localhost
gather_facts: no
tasks:
- name: Display structured variables
debug:
msg: |
Common variables:
- NTP Servers: {{ hostvars['web01']['ntp_servers'] | default([]) }}
- Timezone: {{ hostvars['web01']['timezone'] | default('Not set') }}
Web server variables:
- HTTP Protocol: {{ hostvars['web01']['http_protocol'] | default('Not set') }}
- Default VHost: {{ hostvars['web01']['default_vhost'] | default('Not set') }}
Host-specific variables for web01:
- Server Role: {{ hostvars['web01']['server_role'] | default('Not set') }}
- Backup Server: {{ hostvars['web01']['backup_server'] | default('Not set') }}
- Custom VHosts: {{ hostvars['web01']['custom_vhosts'] | default([]) }}
EOF
Exécutez ce playbook :
cd ~/project/ansible_hostvars
ANSIBLE_INVENTORY=~/project/ansible_hostvars/inventory ansible-playbook playbooks/structured_vars.yml
Note : Nous utilisons la variable d'environnement ANSIBLE_INVENTORY pour spécifier un chemin d'inventaire différent pour cet exemple.
Création d'un générateur de configuration
Créons une application pratique qui génère des fichiers de configuration pour plusieurs services :
mkdir -p ~/project/ansible_hostvars/templates/configs
Créez des fichiers de template pour différents services :
cat > ~/project/ansible_hostvars/templates/configs/apache.conf.j2 << 'EOF'
## Apache configuration for {{ inventory_hostname }}
Listen {{ hostvars[inventory_hostname]['http_port'] | default(80) }}
ServerName {{ inventory_hostname }}
DocumentRoot {{ hostvars[inventory_hostname]['default_document_root'] | default('/var/www/html') }}
MaxClients {{ hostvars[inventory_hostname]['max_connections'] | default(100) }}
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
EOF
cat > ~/project/ansible_hostvars/templates/configs/mysql.conf.j2 << 'EOF'
## MySQL configuration for {{ inventory_hostname }}
[mysqld]
port = {{ hostvars[inventory_hostname]['db_port'] | default(3306) }}
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
max_connections = {{ hostvars[inventory_hostname]['max_connections'] | default(100) }}
## Backup directory: {{ hostvars[inventory_hostname]['backup_dir'] | default('/var/backups') }}
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
EOF
cat > ~/project/ansible_hostvars/templates/configs/postgresql.conf.j2 << 'EOF'
## PostgreSQL configuration for {{ inventory_hostname }}
listen_addresses = '*'
port = {{ hostvars[inventory_hostname]['db_port'] | default(5432) }}
max_connections = {{ hostvars[inventory_hostname]['max_connections'] | default(100) }}
## Backup directory: {{ hostvars[inventory_hostname]['backup_dir'] | default('/var/backups') }}
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
EOF
Maintenant, créez un playbook pour appliquer ces templates :
cat > ~/project/ansible_hostvars/playbooks/config_generator.yml << 'EOF'
---
- name: Generate service configurations
hosts: all
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}
state: directory
- name: Generate Apache configuration for web servers
template:
src: ../templates/configs/apache.conf.j2
dest: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}/apache.conf
when: inventory_hostname in groups['webservers']
- name: Generate MySQL configuration for database servers with MySQL
template:
src: ../templates/configs/mysql.conf.j2
dest: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}/mysql.conf
when: inventory_hostname in groups['dbservers'] and hostvars[inventory_hostname]['db_port'] | string == '3306'
- name: Generate PostgreSQL configuration for database servers with PostgreSQL
template:
src: ../templates/configs/postgresql.conf.j2
dest: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}/postgresql.conf
when: inventory_hostname in groups['dbservers'] and hostvars[inventory_hostname]['db_port'] | string == '5432'
EOF
Exécutez le playbook du générateur de configuration :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/config_generator.yml
Explorez les fichiers de configuration générés :
find ~/project/ansible_hostvars/output/configs -type f | sort
Visualisez certaines des configurations générées :
cat ~/project/ansible_hostvars/output/configs/web01/apache.conf
cat ~/project/ansible_hostvars/output/configs/db01/mysql.conf
cat ~/project/ansible_hostvars/output/configs/db02/postgresql.conf
Création d'un outil de documentation d'hôtes
Enfin, créons un outil qui génère une documentation complète pour chaque hôte de notre inventaire :
cat > ~/project/ansible_hostvars/templates/host_doc.j2 << 'EOF'
## Host Documentation for {{ inventory_hostname }}
==============================================
### Basic Information
- Hostname: {{ inventory_hostname }}
- IP Address: {{ hostvars[inventory_hostname]['ansible_host'] }}
- Environment: {{ hostvars[inventory_hostname]['environment'] | default('Not specified') }}
### Role Information
{% if inventory_hostname in groups['webservers'] %}
- Role: Web Server
- HTTP Port: {{ hostvars[inventory_hostname]['http_port'] | default('Not specified') }}
- Max Connections: {{ hostvars[inventory_hostname]['max_connections'] | default('Not specified') }}
{% if 'web_server_type' in hostvars[inventory_hostname] %}
- Web Server Type: {{ hostvars[inventory_hostname]['web_server_type'] }}
{% endif %}
{% endif %}
{% if inventory_hostname in groups['dbservers'] %}
- Role: Database Server
- DB Port: {{ hostvars[inventory_hostname]['db_port'] | default('Not specified') }}
- Backup Directory: {{ hostvars[inventory_hostname]['backup_dir'] | default('Not specified') }}
{% if 'backup_frequency' in hostvars[inventory_hostname] %}
- Backup Frequency: {{ hostvars[inventory_hostname]['backup_frequency'] }}
- Backup Retention: {{ hostvars[inventory_hostname]['backup_retention'] }} days
{% endif %}
{% endif %}
### Related Hosts
{% if inventory_hostname in groups['webservers'] %}
#### Database Servers:
{% for db_host in groups['dbservers'] %}
- {{ db_host }} ({{ hostvars[db_host]['ansible_host'] }})
{% endfor %}
{% endif %}
{% if inventory_hostname in groups['dbservers'] %}
#### Web Servers:
{% for web_host in groups['webservers'] %}
- {{ web_host }} ({{ hostvars[web_host]['ansible_host'] }})
{% endfor %}
{% endif %}
EOF
Créez un playbook pour générer la documentation :
cat > ~/project/ansible_hostvars/playbooks/host_documentation.yml << 'EOF'
---
- name: Generate host documentation
hosts: all
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output/docs
state: directory
- name: Generate host documentation
template:
src: ../templates/host_doc.j2
dest: ~/project/ansible_hostvars/output/docs/{{ inventory_hostname }}.md
EOF
Exécutez le playbook de documentation :
cd ~/project/ansible_hostvars
ansible-playbook playbooks/host_documentation.yml
Visualisez la documentation générée :
ls -l ~/project/ansible_hostvars/output/docs/
cat ~/project/ansible_hostvars/output/docs/web01.md
cat ~/project/ansible_hostvars/output/docs/db01.md
Félicitations ! Vous avez maintenant terminé une exploration complète des variables hostvars d'Ansible, de leur utilisation de base à leurs applications avancées. Vous avez appris à accéder aux variables d'hôtes, à les utiliser dans des templates et à créer des outils pratiques pour gérer votre infrastructure.
Résumé
Dans ce laboratoire, vous avez exploré la puissance et la polyvalence des variables hostvars d'Ansible. Voici ce que vous avez appris :
Configuration de l'environnement : Vous avez configuré un environnement Ansible avec une structure d'inventaire incluant des hôtes, des groupes et des variables.
Exploration des variables
hostvars: Vous avez appris à accéder aux variableshostvarsdans les playbooks, y compris l'accès aux variables de l'hôte actuel et à celles d'autres hôtes de l'inventaire.Utilisation des variables
hostvarsdans les templates : Vous avez créé des templates Jinja2 qui exploitent les variableshostvarspour générer des fichiers de configuration dynamiques adaptés à chaque hôte.Techniques avancées de variables
hostvars: Vous avez exploré les variables de groupe (group_vars), les rapports d'inventaire dynamiques et les techniques pour gérer en toute sécurité les variables manquantes.Bonnes pratiques et applications concrètes : Vous avez mis en œuvre une organisation structurée des variables et créé des applications pratiques, notamment un générateur de configuration et un outil de documentation d'hôtes.
Les variables hostvars d'Ansible sont une fonctionnalité puissante qui vous permet de créer des flux d'automatisation dynamiques et adaptables. En comprenant comment travailler efficacement avec les variables hostvars, vous pouvez créer des solutions d'automatisation plus flexibles et maintenables pour votre infrastructure.
Alors que vous poursuivez votre parcours avec Ansible, n'oubliez pas que les variables hostvars ne sont qu'une partie du riche écosystème de fonctionnalités d'Ansible. Pensez à explorer d'autres fonctionnalités telles que les rôles (roles), les collections (collections) et les inventaires dynamiques pour améliorer encore vos capacités d'automatisation.


