Lernprogramm: Konfigurieren dynamischer Inventare Ihrer Azure-Ressourcen mithilfe von Ansible

Wichtig

Für die Ausführung der Beispielplaybooks in diesem Artikel ist mindestens Ansible 2.8 erforderlich.

Achtung

Dieser Artikel bezieht sich auf CentOS, eine Linux-Distribution, die sich dem End-of-Life-Status (EOL) nähert. Sie sollten Ihre Nutzung entsprechend planen. Weitere Informationen finden Sie im CentOS-Leitfaden für das Lebensende.

Das Feature "Ansible dynamic inventory" entfernt die Belastung für die Standard Beibehalten statischer Bestandsdateien.

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.

Erstellen von Azure-VMs

  1. Melden Sie sich beim Azure-Portal an.

  2. Öffnen Sie Cloud Shell.

  3. 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
    
  4. 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 CentOS85Gen2 \
      --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:

  1. 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 Erweiterung yml oder yaml verfügen, damit das Azure-Plug-In für dynamische Bestände genutzt werden kann.
  2. Führen Sie den folgenden Befehl aus, um die VMs innerhalb der Ressourcengruppe abzufragen:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. 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. Dies ist der Grund für die zusätzlichen Zeichen nach den VM-Namen. Sie können dies deaktivieren, indem Sie dem dynamischen Bestand plain_host_names: yes als Zusatz 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": "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"
                },
                ...
            }
        }
    },
    ...
    }
}

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: "'CentOS' 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 wurde 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: "'CentOS' 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. Indem eine schlüsselgebundene Gruppe verwendet wurde, 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.

  1. 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:
    
  2. 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"

  3. 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:
    
  4. 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

  1. 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>
    
  2. Überprüfen Sie mithilfe von az group show, ob die Ressourcengruppe gelöscht wurde.

    az group show --name <resource_group>
    

Nächste Schritte