Tutorial: Konfigurieren von dynamischen Beständen Ihrer Azure-Ressourcen mithilfe von Ansible
Wichtig
Für die Ausführung der Beispielplaybooks in diesem Artikel ist mindestens Ansible 2.8 erforderlich.
Das Ansible-Feature für dynamischen Bestand macht die Verwaltung von statischen Bestandsdateien überflüssig.
In diesem Tutorial verwenden Sie das Azure-Plug-In für dynamische Bestände, um Ihren Ansible-Datenbestand aufzufüllen.
In diesem Artikel werden folgende Vorgehensweisen behandelt:
- Konfigurieren von zwei virtuellen Testcomputern
- Hinzufügen von Tags zu virtuellen Azure-Computern
- Generieren eines dynamischen Bestands
- Verwenden bedingter und schlüsselgebundener Gruppen zum Auffüllen von Gruppenmitgliedschaften
- Ausführen von Playbooks für Gruppen innerhalb des dynamischen Bestands
Voraussetzungen
- Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
- Azure-Dienstprinzipal: Erstellen Sie einen Dienstprinzipal, und notieren Sie sich die folgenden Werte: appId, displayName, password und tenant.
Installieren von Ansible: Verwenden Sie eine der folgenden Optionen:
- Installieren und Konfigurieren von Ansible auf einem virtuellen Linux-Computer
- Konfigurieren Sie Azure Cloud Shell. Sollten Sie keinen Zugriff auf einen virtuellen Linux-Computer haben, können Sie mit Ansible einen virtuellen Computer erstellen.
Erstellen von Azure-VMs
Melden Sie sich beim Azure-Portal an.
Öffnen Sie Cloud Shell.
Erstellen Sie für die virtuellen Computer dieses Tutorials eine Azure-Ressourcengruppe.
Wichtig
Für die in diesem Schritt erstellte Azure-Ressourcengruppe muss ein Name angegeben werden, der ausschließlich aus Kleinbuchstaben besteht. Andernfalls tritt bei der Erstellung des dynamischen Bestands ein Fehler auf.
az group create --resource-group ansible-inventory-test-rg --location eastus
Erstellen Sie mithilfe eines der folgenden Verfahren zwei virtuelle Linux-Computer in Azure:
Ansible-Playbook: In den Artikeln Schnellstart: Erstellen eines virtuellen Linux-Computers in Azure mithilfe von Ansible und Schnellstart: Bereitstellen einer Windows-VM in Azure mit Ansible wird veranschaulicht, wie Sie über ein Ansible-Playbook einen virtuellen Computer erstellen.
Azure-Befehlszeilenschnittstelle: Führen Sie die folgenden Befehle in Cloud Shell aus, um die beiden virtuellen Computer zu erstellen:
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>
Ersetzen Sie
<password>
durch Ihr Kennwort.
Hinzufügen von Tags für Anwendungsrollen
Tags werden verwendet, um Azure-Ressourcen zu organisieren und zu kategorisieren. Indem Sie den Azure-VMs eine Anwendungsrolle zuweisen, können Sie die Tags als Gruppennamen innerhalb des dynamischen Azure-Bestands verwenden.
Führen Sie die folgenden Befehle aus, um die VM-Tags zu aktualisieren:
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'
Weitere Informationen zu den Strategien für die Nutzung von Azure-Tags finden Sie unter Definieren Ihrer Tagstrategie.
Generieren eines dynamischen Bestands
Von Ansible wird ein Azure-Plug-In für dynamische Bestände bereitgestellt.
In den folgenden Schritten wird die Nutzung des Plug-Ins beschrieben:
Erstellen eines dynamischen Bestands mit dem Namen
myazure_rm.yml
plugin: azure_rm include_vm_resource_groups: - ansible-inventory-test-rg auth_source: auto
Wichtiger Punkt:
- Ansible verwendet den Namen und die Erweiterung der Bestandsdatei, um zu ermitteln, welches Bestands-Plug-In verwendet werden soll. Die Datei muss auf
azure_rm
enden und über die Erweiterungyml
oderyaml
verfügen, damit das Azure-Plug-In für dynamische Bestände genutzt werden kann.
- Ansible verwendet den Namen und die Erweiterung der Bestandsdatei, um zu ermitteln, welches Bestands-Plug-In verwendet werden soll. Die Datei muss auf
Führen Sie den folgenden Befehl aus, um die VMs innerhalb der Ressourcengruppe abzufragen:
ansible-inventory -i myazure_rm.yml --graph
Beim Ausführen des Befehls wird in etwa die folgende Ausgabe angezeigt:
@all: |--@ungrouped: | |--linux-vm_cdb4 | |--win-vm_3211
Beide VMs gehören zur Gruppe ungrouped
, bei der es sich um eine untergeordnete Gruppe von all
im Ansible-Bestand handelt.
Wichtiger Punkt:
- Standardmäßig werden vom Azure-Plug-In für dynamische Bestände global eindeutige Namen zurückgegeben. Aus diesem Grund können die VM-Namen zusätzliche Zeichen enthalten. Sie können dieses Verhalten deaktivieren, indem Sie dem dynamischen Bestand
plain_host_names: yes
hinzufügen.
Suchen nach hostvars-Elementen für Azure-VMs
Führen Sie den folgenden Befehl aus, um alle hostvars
-Elemente anzuzeigen:
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"
},
...
}
}
},
...
}
}
Indem die Informationen aus Azure gepullt werden, werden die hostvars
-Elemente für die einzelnen Azure-VMs aus dem dynamischen Bestand aufgefüllt. Anhand dieser hostvars
werden dann die Mitgliedschaften in den VM-Gruppen innerhalb des Ansible-Bestands ermittelt.
Zuweisen der Gruppenmitgliedschaft mit bedingten Gruppen
Jede bedingte Gruppe besteht aus zwei Teilen: Dem Namen der Gruppe und der Bedingung für das Hinzufügen eines Mitglieds zur Gruppe.
Verwenden Sie die image.offer
-Eigenschaft, um eine bedingte Gruppenmitgliedschaft für linux-vm zu erstellen.
Öffnen Sie den dynamischen Bestand myazure_rm.yml
, und fügen Sie die folgende bedingte Gruppe (conditional_group
) hinzu:
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"
Führen Sie ansible-inventory
mit der Option --graph
aus:
ansible-inventory -i myazure_rm.yml --graph
@all:
|--@linux:
| |--linux-vm_cdb4
|--@ungrouped:
|--@windows:
| |--win-vm_3211
In der Ausgabe können Sie erkennen, dass die VMs nicht mehr der Gruppe ungrouped
zugeordnet sind. Stattdessen wird jede VM einer neuen Gruppe zugewiesen, die über den dynamischen Bestand erstellt wurde.
Wichtiger Punkt:
- Mit bedingten Gruppen können Sie spezifische Gruppen innerhalb Ihres Bestands benennen und mithilfe von
hostvars
auffüllen.
Zuweisen der Gruppenmitgliedschaft mit schlüsselgebundenen Gruppen
Bei schlüsselgebundenen Gruppen wird die Gruppenmitgliedschaft genauso wie bei bedingten Gruppen zugewiesen, aber darüber hinaus wird auch der Gruppenname dynamisch aufgefüllt.
Fügen Sie dem dynamischen Bestand myazure_rm.yml
die folgende schlüsselgebundene Gruppe (keyed_group) hinzu:
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
Führen Sie ansible-inventory
mit der Option --graph
aus:
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
In der Ausgabe sehen Sie zwei weitere Gruppen: _message_broker
und _web_server
. Durch Verwendung einer schlüsselgebundenen Gruppe wurden mit dem Tag applicationRole
Gruppennamen und -mitgliedschaften aufgefüllt.
Wichtiger Punkt:
- Schlüsselgebundene Gruppen enthalten standardmäßig ein Trennzeichen. Fügen Sie unter der key-Eigenschaft den Eintrag
separator: ""
hinzu, um das Trennzeichen zu entfernen.
Ausführen von Playbooks mit Gruppennamensmustern
Verwenden Sie die vom dynamischen Bestand erstellten Gruppen für die Erstellung von Untergruppen.
Erstellen Sie ein Playbook mit dem Namen
win_ping.yml
und dem folgenden Inhalt:--- - 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:
Führen Sie das Playbook
win_ping.yml
aus.ansible-playbook win_ping.yml -i myazure_rm.yml
Geben Sie bei entsprechender Aufforderung den Benutzernamen (
username
) und das Kennwort (password
) für die Azure Windows-VM ein.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
Wichtig
Falls Sie den Fehler
winrm or requests is not installed: No module named 'winrm'
erhalten, sollten Sie pywinrm mit dem folgenden Befehl installieren:pip install "pywinrm>=0.3.0"
Erstellen Sie ein zweites Playbook mit dem Namen
ping.yml
und dem folgenden Inhalt:--- - 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:
Führen Sie das Playbook
ping.yml
aus.ansible-playbook ping.yml -i myazure_rm.yml
Geben Sie bei entsprechender Aufforderung den Benutzernamen (
username
) und das Kennwort (password
) für die Azure Linux-VM ein.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
Bereinigen von Ressourcen
Führen Sie az group delete aus, um die Ressourcengruppe zu löschen. Alle Ressourcen innerhalb der Ressourcengruppe werden gelöscht.
az group delete --name <resource_group>
Überprüfen Sie mithilfe von az group show, ob die Ressourcengruppe gelöscht wurde.
az group show --name <resource_group>