Tutoriel : Tutoriel : Configurer des inventaires dynamiques de ressources Azure avec Ansible

Important

Ansible 2.8 (ou version ultérieure) est nécessaire pour exécuter les exemples de playbooks dans cet article.

Les inventaires dynamiques Ansible permettent d’alléger la charge liée à la gestion des fichiers d’inventaire statiques en extrayant les informations depuis diverses sources.

Dans ce tutoriel, vous allez utiliser le plug-in d’inventaire dynamique d’Azure pour remplir votre inventaire Ansible.

Dans ce tutoriel, Ansible est utilisé pour :

  • Configurer deux machines virtuelles de test
  • Ajouter des étiquettes aux machines virtuelles Azure
  • Générer un inventaire dynamique
  • Utiliser des groupes conditionnels et à clé pour remplir les appartenances aux groupes
  • Exécuter des playbooks sur les groupes présents dans l’inventaire dynamique

Prérequis

  • Abonnement Azure : si vous n’avez pas d’abonnement Azure, créez un compte Azure gratuit avant de commencer.

Créer des machines virtuelles Azure

  1. Connectez-vous au portail Azure.

  2. Ouvrez Cloud Shell.

  3. Créez un groupe de ressources Azure pour héberger les machines virtuelles utilisées dans ce didacticiel.

    Important

    Le groupe de ressources Azure que vous créez dans cette étape doit avoir un nom entièrement en minuscules. Sinon, la génération de l’inventaire dynamique échouera.

    az group create --resource-group ansible-inventory-test-rg --location eastus
    
  4. Créez deux machines virtuelles de Linux sur Azure en utilisant l’une des méthodes suivantes :

    • Playbook Ansible - L’article Créer une machine virtuelle Linux de base dans Azure avec Ansible et Créer une machine virtuelle Windows de base dans Azure avec Ansible montre comment créer une machine virtuelle à partir d’un playbook Ansible.

    • Azure CLI : émettez toutes les commandes suivantes dans Cloud Shell pour créer les deux machines virtuelles :

      az vm create \
      --resource-group ansible-inventory-test-rg \
      --name win-vm \
      --image MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest \
      --admin-username azureuser \
      --admin-password <password>
      
      az vm create \
      --resource-group ansible-inventory-test-rg \
      --name linux-vm \
      --image OpenLogic:CentOS:7.7:latest \
      --admin-username azureuser \
      --admin-password <password>
      

      Remplacez <password> par votre mot de passe.

Ajouter des étiquettes de rôle d’application

Les étiquettes sont utilisées pour organiser et catégoriser les ressources Azure. L’affectation d’un rôle d’application aux machines virtuelles Azure vous permet d’utiliser les étiquettes en tant que noms de groupes dans l’inventaire dynamique Azure.

Exécutez les commandes suivantes pour mettre à jour les étiquettes de machine virtuelle :

az vm update \
--resource-group ansible-inventory-test-rg \
--name linux-vm \
--set tags.applicationRole='message-broker' 

az vm update \
--resource-group ansible-inventory-test-rg \
--name win-vm \
--set tags.applicationRole='web-server' 

Découvrez plus en détail les stratégies d’étiquetage Azure dans Définir votre stratégie d’étiquetage.

Générer un inventaire dynamique

Ansible fournit un plug-in d’inventaire dynamique Azure,

qui s’utilise ainsi :

  1. Créez un inventaire dynamique nommé myazure_rm.yml

    plugin: azure_rm
    include_vm_resource_groups:
      - ansible-inventory-test-rg
    auth_source: auto
    

    Point clé :

    • Ansible utilise le nom et l’extension du fichier d’inventaire pour identifier le plug-in d’inventaire à utiliser. Pour utiliser le plug-in d’inventaire dynamique Azure, le fichier doit finir par azure_rm et avoir l’extension yml ou yaml.
  2. Exécutez la commande suivante pour interroger les machines virtuelles dans le groupe de ressources :

    ansible-inventory -i myazure_rm.yml --graph
    
  3. Quand vous exécutez la commande, vous voyez des résultats similaires à la sortie suivante :

    @all:
      |--@ungrouped:
      |  |--linux-vm_cdb4
      |  |--win-vm_3211
    

Les deux machines virtuelles appartiennent au groupe ungrouped, qui est un enfant du groupe all dans l’inventaire Ansible.

Point clé :

  • Par défaut, le plug-in d’inventaire dynamique Azure retourne des noms globaux uniques. C’est la raison pour laquelle les caractères supplémentaires sont ajoutés après les noms de machines virtuelles. Vous pouvez désactiver ce comportement en ajoutant plain_host_names: yes à l’inventaire dynamique.

Rechercher des hostvars de machines virtuelles Azure

Exécutez la commande suivante pour la totalité des hostvars :

ansible-inventory -i myazure_rm.yml --list
{
    "_meta": {
        "hostvars": {
            "linux-vm_cdb4": {
                "ansible_host": "52.188.118.79",
                "availability_zone": null,
                "computer_name": "linux-vm",
                "default_inventory_hostname": "linux-vm_cdb4",
                "id": "/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/linux-vm",
                "image": {
                    "offer": "CentOS",
                    "publisher": "OpenLogic",
                    "sku": "7.7",
                    "version": "latest"
                },
                ...,
                "tags": {
                    "applicationRole": "message-broker"
                },
                ...
            },
            "win-vm_3211": {
                "ansible_host": "52.188.112.110",
                "availability_zone": null,
                "computer_name": "win-vm",
                "default_inventory_hostname": "win-vm_3211",
                "id": "/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/win-vm",
                "image": {
                    "offer": "WindowsServer",
                    "publisher": "MicrosoftWindowsServer",
                    "sku": "2019-Datacenter",
                    "version": "latest"
                },
                ...
                "tags": {
                    "applicationRole": "web-server"
                },
                ...
            }
        }
    },
    ...
    }
}

En extrayant les informations d’Azure, l’inventaire dynamique renseigne le hostvars de chaque machine virtuelle Azure. Ces hostvars doivent ensuite déterminer les appartenances aux groupes de machines virtuelles dans l’inventaire Ansible.

Affecter l’appartenance à un groupe avec conditional_groups

Chaque groupe conditionnel est constitué de deux parties. Le nom du groupe et la condition d’ajout d’un membre au groupe.

Utilisez la propriété image.offer afin de créer une appartenance conditionnelle à un groupe pour linux-vm.

Ouvrez l’inventaire dynamique myazure_rm.yml, puis ajoutez le conditional_group suivant :

plugin: azure_rm
include_vm_resource_groups:
  - ansible-inventory-test-rg
auth_source: auto
conditional_groups:
  linux: "'CentOS' in image.offer"
  windows: "'WindowsServer' in image.offer"

Exécutez ansible-inventory avec l’option --graph :

ansible-inventory -i myazure_rm.yml --graph
@all:
  |--@linux:
  |  |--linux-vm_cdb4
  |--@ungrouped:
  |--@windows:
  |  |--win-vm_3211

Dans la sortie, vous pouvez voir que les machines virtuelles ne sont plus associées au groupe ungrouped. À la place, chacune d’elle a été affectée à un nouveau groupe créé par l’inventaire dynamique.

Point clé :

  • Les groupes conditionnels vous permettent de nommer des groupes spécifiques dans votre inventaire et de les remplir à l’aide de hostvars.

Affecter l’appartenance à un groupe avec keyed_groups

Les groupes à clé affectent l’appartenance à un groupe de la même manière que les groupes conditionnels. Toutefois, quand un groupe à clé est utilisé, le nom du groupe est également rempli dynamiquement.

Ajoutez le groupe à clé suivant à l’inventaire dynamique myazure_rm.yml :

plugin: azure_rm
include_vm_resource_groups:
  - ansible-inventory-test-rg
auth_source: auto
conditional_groups:
  linux: "'CentOS' in image.offer"
  windows: "'WindowsServer' in image.offer"
keyed_groups:
 - key: tags.applicationRole

Exécutez ansible-inventory avec l’option --graph :

ansible-inventory -i myazure_rm.yml --graph
@all:
  |--@_message_broker:
  |  |--linux-vm_cdb4
  |--@_web_server:
  |  |--win-vm_3211
  |--@linux:
  |  |--linux-vm_cdb4
  |--@ungrouped:
  |--@windows:
  |  |--win-vm_3211

Dans la sortie, vous voyez deux groupes supplémentaires : _message_broker et _web_server. À l’aide d’un groupe à clé, l’étiquette applicationRole a rempli les noms de groupes et les appartenances aux groupes.

Point clé :

  • Par défaut, les groupes à clés incluent un séparateur. Pour supprimer le séparateur, ajoutez separator: "" sous la propriété de clé.

Exécuter des playbooks avec des modèles de nom de groupe

Utilisez les groupes créés par l’inventaire dynamique pour cibler des sous-groupes.

  1. Créez un playbook appelé win_ping.yml avec le contenu suivant :

    ---
    - hosts: windows
      gather_facts: false
    
      vars_prompt:
        - name: username
          prompt: "Enter local username"
          private: false
        - name: password
          prompt: "Enter password"
    
      vars:
        ansible_user: "{{ username }}"
        ansible_password: "{{ password }}"
        ansible_connection: winrm
        ansible_winrm_transport: ntlm
        ansible_winrm_server_cert_validation: ignore
    
      tasks:
        - name: run win_ping
          win_ping:
    
  2. Exécutez le playbook win_ping.yml.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    Quand vous y êtes invité, entrez username et password pour la machine virtuelle Windows sur Azure.

    Enter local username: azureuser
    Enter password:
    
    PLAY [windows] **************************************************************************************************************************************
    
    TASK [run win_ping] *********************************************************************************************************************************
    ok: [win-vm_3211]
    
    PLAY RECAP ******************************************************************************************************************************************
    win-vm_3211                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

    Important

    Si vous obtenez l’erreur winrm or requests is not installed: No module named 'winrm', installez pywinrm avec la commande suivante : pip install "pywinrm>=0.3.0"

  3. Créez un second playbook nommé ping.yml avec le contenu suivant :

    ---
    - hosts: all
      gather_facts: false
    
      vars_prompt:
        - name: username
          prompt: "Enter ssh user"
        - name: password
          prompt: "Enter password for ssh user"
    
      vars:
        ansible_user: "{{ username }}"
        ansible_password: "{{ password }}"
        ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
    
      tasks:
        - name: run ping
          ping:
    
  4. Exécutez le playbook ping.yml.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    Quand vous y êtes invité, entrez username et password pour la machine virtuelle Linux sur Azure.

    Enter ssh username: azureuser
    Enter password for ssh user:
    
    PLAY [linux] *******************************************************************************************************
    
    TASK [run ping] ****************************************************************************************************
    ok: [linux-vm_cdb4]
    
    PLAY RECAP *********************************************************************************************************
    linux-vm_cdb4              : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
    

Nettoyer les ressources

  1. Enregistrez le code suivant en tant que delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Exécutez le playbook en utilisant la commande ansible-playbook. Remplacez l’espace réservé par le nom du groupe de ressources à supprimer. Toutes les ressources du groupe de ressources seront supprimées.

    ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
    

    Points essentiels :

    • En raison de la variable register et de la section debug du playbook, les résultats s’affichent quand la commande se termine.

Étapes suivantes