Recherche de site Web

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.