Freigeben über


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

Von Bedeutung

Ansible 2.8 (oder höher) ist erforderlich, um die Beispiel-Playbooks in diesem Artikel auszuführen.

Das Feature "Ansible dynamic inventory " entfernt die Last, statische Bestandsdateien beizubehalten.

In diesem Lernprogramm verwenden Sie das Dynamische Inventar-Plug-In von Azure zum Auffüllen Ihres ansiblen Inventars.

In diesem Artikel erfahren Sie, wie Sie:

  • Konfigurieren Sie zwei virtuelle Testcomputer.
  • Hinzufügen von Tags zu virtuellen Azure-Computern
  • Generieren eines dynamischen Inventars
  • Verwenden von bedingten und schlüsselierten Gruppen zum Auffüllen von Gruppenmitgliedschaften
  • Playbooks für Gruppen innerhalb des dynamischen Inventars ausführen

Voraussetzungen

  • Azure-Abonnement: Wenn Sie nicht über ein Azure-Abonnement verfügen, erstellen Sie ein kostenloses Konto , bevor Sie beginnen.

Erstellen von Azure-VMs

  1. Melden Sie sich beim Azure-Portal an.

  2. Öffnen Sie Cloud Shell.

  3. Erstellen Sie eine Azure-Ressourcengruppe, um die virtuellen Computer für dieses Lernprogramm zu halten.

    Von Bedeutung

    Die azure-Ressourcengruppe, die Sie in diesem Schritt erstellen, muss einen Vollständig kleingeschriebenen Namen aufweisen. Andernfalls schlägt die Generierung des dynamischen Inventars fehl.

    az group create --resource-group ansible-inventory-test-rg --location eastus
    
  4. Erstellen Sie zwei virtuelle Linux-Computer in Azure mithilfe einer der folgenden Techniken:

    • Ansible playbook – Der Artikel " Erstellen eines einfachen virtuellen Linux-Computers in Azure mit Ansible und Erstellen eines einfachen virtuellen Windows-Computers in Azure mit Ansible veranschaulicht, wie ein virtueller Computer aus einem ansible Playbook erstellt wird.

    • Azure CLI – Stellen Sie jeden der folgenden Befehle in der 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 das <password> Kennwort.

Anwendungs-Rollentags hinzufügen

Tags werden verwendet, um Azure-Ressourcen zu organisieren und zu kategorisieren. Wenn Sie die Azure-VMs einer Anwendungsrolle zuweisen, können Sie die Tags als Gruppennamen innerhalb des dynamischen Azure-Inventars 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' 

Erfahren Sie mehr über Azure-Kategorisierungsstrategien bei Define your tagging strategy.

Generieren eines dynamischen Inventars

Ansible stellt ein Azure Dynamic Inventory Plug-In bereit.

Die folgenden Schritte führen Sie durch die Verwendung des Plug-Ins:

  1. Erstellen eines dynamischen Inventars mit dem Namen myazure_rm.yml

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

    Kernpunkt:

    • Ansible verwendet den Inventardateinamen und die Erweiterung, um zu identifizieren, welches Inventar-Plugin verwendet werden soll. Um das dynamische Azure-Inventar-Plug-In zu verwenden, muss die Datei mit azure_rm enden und eine Erweiterung von entweder yml oder yaml haben.
  2. Führen Sie den folgenden Befehl aus, um die virtuellen Computer in der Ressourcengruppe abzufragen:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. Wenn Sie den Befehl ausführen, sehen Sie Ergebnisse, die der folgenden Ausgabe ähneln:

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

Beide VMs gehören zur ungrouped Gruppe, die ein untergeordnetes Element der all Gruppe im Ansible-Bestand ist.

Schlüsselpunkt:

  • Standardmäßig gibt das dynamische Azure-Bestands-Plug-In global eindeutige Namen zurück. Aus diesem Grund können die VM-Namen zusätzliche Zeichen enthalten. Sie können dieses Verhalten deaktivieren, indem Sie plain_host_names: yes zum dynamischen Bestand hinzufügen.

Azure VM hostvars finden

Führen Sie den folgenden Befehl aus, um alle hostvars 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"
                },
                ...
            }
        }
    },
    ...
    }
}

Durch das Abrufen von Informationen aus Azure füllt das dynamische Inventar die hostvars für jede Azure-VM. Diese hostvars sollen dann die VM-Gruppenmitgliedschaften innerhalb des Ansible-Inventars bestimmen.

Zuweisen einer Gruppenmitgliedschaft mit conditional_groups

Jede bedingte Gruppe besteht aus zwei Teilen. Der Name der Gruppe und die Bedingung zum Hinzufügen eines Mitglieds zur Gruppe.

Verwenden Sie die Eigenschaft image.offer , um eine bedingte Gruppenmitgliedschaft für die linux-vm zu erstellen.

Öffnen Sie den myazure_rm.yml dynamischen Bestand, und fügen Sie Folgendes hinzu conditional_group:

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 --graph-Option aus:

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

Aus der Ausgabe können Sie sehen, dass die virtuellen Computer nicht mehr der ungrouped Gruppe zugeordnet sind. Stattdessen wird jeder virtuelle Computer einer neuen Gruppe zugewiesen, die durch den dynamischen Bestand erstellt wurde.

Schlüsselpunkt:

  • Mit bedingten Gruppen können Sie bestimmte Gruppen innerhalb Ihres Inventars benennen und mit hostvarsdiesen auffüllen.

Gruppenmitgliedschaft mit keyed_groups zuweisen

Schlüsselgruppen ordnen die Gruppenmitgliedschaft auf die gleiche Weise zu wie bedingte Gruppen, aber bei Verwendung einer Schlüsselgruppe wird der Gruppenname auch dynamisch ausgefüllt.

Fügen Sie dem dynamischen Bestand die folgenden keyed_group hinzu 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

Führen Sie ansible-inventory mit der --graph-Option 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

Aus der Ausgabe sehen Sie zwei weitere Gruppen _message_broker und _web_server. Mithilfe einer schlüsselierten Gruppe füllt das applicationRole Tag die Gruppennamen und Gruppenmitgliedschaften auf.

Schlüsselpunkt:

  • Schlüsselgruppen enthalten standardmäßig ein Trennzeichen. Um das Trennzeichen zu entfernen, fügen Sie separator: "" bei der Schlüsseleigenschaft hinzu.

Ausführen von Playbooks mit Gruppennamenmustern

Verwenden Sie die Gruppen, die vom dynamischen Inventar erstellt wurden, um auf Untergruppen abzuzielen.

  1. Erstellen Sie ein Playbook win_ping.yml mit 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 win_ping.yml Playbook aus.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    Wenn Sie dazu aufgefordert werden, geben Sie die username und 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
    

    Von Bedeutung

    Wenn sie den Fehler winrm or requests is not installed: No module named 'winrm'erhalten, installieren Sie pywinrm mit dem folgenden Befehl: 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 ping.yml Playbook aus.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    Wenn Sie dazu aufgefordert werden, geben Sie username und 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, ob die Ressourcengruppe mithilfe der az group show gelöscht wurde.

    az group show --name <resource_group>
    

Nächste Schritte