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.
La fonctionnalité d'inventaire dynamique Ansible allège la charge liée à la gestion des fichiers d’inventaire statiques.
Dans ce tutoriel, vous allez utiliser le plug-in d’inventaire dynamique d’Azure pour remplir votre inventaire Ansible.
Dans cet article, vous apprendrez comment :
- 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 gratuit avant de commencer.
- Principal de service Azure : créez un principal de service en notant les valeurs suivantes : appId, displayName, password et tenant.
Installer Ansible. Pour cela, choisissez l’une des options suivantes :
- Installez et configurez Ansible sur une machine virtuelle Linux
- Configurez Azure Cloud Shell et, si vous n’avez pas accès à une machine virtuelle Linux, créez une machine virtuelle avec Ansible.
Créer des machines virtuelles Azure
Connectez-vous au portail Azure.
Ouvrez Cloud Shell.
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
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 Ubuntu2204 \ --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 :
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’extensionyml
ouyaml
.
- 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
Exécutez la commande suivante pour interroger les machines virtuelles dans le groupe de ressources :
ansible-inventory -i myazure_rm.yml --graph
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. Pour cette raison, les noms de machine virtuelle peuvent contenir des caractères supplémentaires. 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": "0001-com-ubuntu-server-jammy",
"publisher": "Canonical",
"sku": "22_04-lts-gen2",
"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: "'ubuntu' 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, chaque machine virtuelle est 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: "'ubuntu' 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
remplit 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.
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:
Exécutez le playbook
win_ping.yml
.ansible-playbook win_ping.yml -i myazure_rm.yml
Quand vous y êtes invité, entrez
username
etpassword
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"
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:
Exécutez le playbook
ping.yml
.ansible-playbook ping.yml -i myazure_rm.yml
Quand vous y êtes invité, entrez
username
etpassword
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
Exécutez az group delete pour supprimer le groupe de ressources. Toutes les ressources du groupe de ressources sont supprimées.
az group delete --name <resource_group>
Vérifiez que le groupe de ressources a été supprimé à l’aide de az group show.
az group show --name <resource_group>