Samouczek: konfigurowanie dynamicznych spisów zasobów platformy Azure przy użyciu rozwiązania Ansible

Ważne

Rozwiązanie Ansible w wersji 2.8 (lub nowszej) jest wymagane do uruchomienia przykładowych podręczników w tym artykule.

Uwaga

W tym artykule odwołuje się do systemu CentOS — dystrybucji systemu Linux, która zbliża się do stanu zakończenia życia (EOL). Rozważ odpowiednie użycie i zaplanuj. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące zakończenia życia systemu CentOS.

Funkcja spisu dynamicznego rozwiązania Ansible usuwa obciążenie konserwacją plików spisu statycznego.

W tym samouczku użyjesz wtyczki dynamicznej inwentaryzacji platformy Azure, aby wypełnić spis rozwiązania Ansible.

W tym artykule omówiono sposób wykonywania następujących zadań:

  • Skonfiguruj dwie testowe maszyny wirtualne.
  • Dodawanie tagów do maszyn wirtualnych platformy Azure
  • Generowanie spisu dynamicznego
  • Używanie grup warunkowych i grup kluczy do wypełniania członkostw w grupach
  • Uruchamianie podręczników względem grup w ramach spisu dynamicznego

Wymagania wstępne

  • Subskrypcja platformy Azure: jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
  • Jednostka usługi platformy Azure: Utwórz jednostkę usługi, zanotuj następujące wartości: appId, displayName, password i tenant.

Tworzenie maszyn wirtualnych platformy Azure

  1. Zaloguj się w witrynie Azure Portal.

  2. Otwórz usługę Cloud Shell.

  3. Utwórz grupę zasobów platformy Azure do przechowywania maszyn wirtualnych na potrzeby tego samouczka.

    Ważne

    Grupa zasobów platformy Azure utworzona w tym kroku musi mieć nazwę składającą się wyłącznie z małych liter. W przeciwnym razie generowanie spisu dynamicznego nie powiedzie się.

    az group create --resource-group ansible-inventory-test-rg --location eastus
    
  4. Utwórz dwie maszyny wirtualne systemu Linux na platformie Azure przy użyciu jednej z następujących technik:

Dodawanie tagów roli aplikacji

Tagi służą do organizowania i kategoryzowania zasobów platformy Azure. Przypisanie maszyn wirtualnych platformy Azure roli aplikacji umożliwia używanie tagów jako nazw grup w ramach dynamicznego spisu platformy Azure.

Uruchom następujące polecenia, aby zaktualizować tagi maszyny wirtualnej:

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' 

Dowiedz się więcej na temat strategii tagowania platformy Azure w części Definiowanie strategii tagowania.

Generowanie spisu dynamicznego

Usługa Ansible udostępnia wtyczkę dynamicznego spisu platformy Azure.

W poniższych krokach przedstawiono sposób korzystania z wtyczki:

  1. Tworzenie spisu dynamicznego o nazwie myazure_rm.yml

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

    Kluczowy punkt:

    • Usługa Ansible używa nazwy i rozszerzenia pliku spisu, aby zidentyfikować wtyczkę spisu do użycia. Aby użyć wtyczki spisu dynamicznego platformy Azure, plik musi kończyć się azure_rm rozszerzeniem yml lub yaml.
  2. Uruchom następujące polecenie, aby wykonać zapytanie dotyczące maszyn wirtualnych w grupie zasobów:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. Po uruchomieniu polecenia zobaczysz wyniki podobne do następujących danych wyjściowych:

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

Obie maszyny wirtualne należą do ungrouped grupy, która jest elementem podrzędnym all grupy w spisie rozwiązania Ansible.

Kluczowy punkt:

  • Domyślnie wtyczka magazynu dynamicznego platformy Azure zwraca globalnie unikatowe nazwy. Jest to przyczyna dodatkowych znaków po nazwach maszyn wirtualnych. Możesz to wyłączyć, dodając plain_host_names: yes do spisu dynamicznego.

Znajdowanie hostów maszyn wirtualnych platformy Azure

Uruchom następujące polecenie, aby wyświetlić wszystkie elementy 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"
                },
                ...
            }
        }
    },
    ...
    }
}

Ściągając informacje z platformy Azure, spis dynamiczny wypełnia hostvars wartość dla każdej maszyny wirtualnej platformy Azure. Następnie hostvars należy określić członkostwo w grupie maszyn wirtualnych w spisie rozwiązania Ansible.

Przypisywanie członkostwa w grupie przy użyciu conditional_groups

Każda grupa warunkowa składa się z dwóch części. Nazwa grupy i warunek dodawania członka do grupy.

Użyj właściwości image.offer , aby utworzyć członkostwo w grupie warunkowej dla maszyny wirtualnej z systemem linux.

myazure_rm.yml Otwórz spis dynamiczny i dodaj następujący conditional_groupkod:

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"

Uruchom polecenie ansible-inventory z opcją --graph :

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

Z danych wyjściowych widać, że maszyny wirtualne nie są już skojarzone z grupą ungrouped . Zamiast tego każdy z nich został przypisany do nowej grupy utworzonej przez spis dynamiczny.

Kluczowy punkt:

  • Grupy warunkowe umożliwiają nadawanie nazw określonym grupom w spisie i wypełnianie ich przy użyciu polecenia hostvars.

Przypisywanie członkostwa w grupie przy użyciu keyed_groups

Grupy kluczy przypisują członkostwo w grupach w taki sam sposób, jak grupy warunkowe, ale w przypadku używania grupy kluczy nazwa grupy jest również dynamicznie wypełniana.

Dodaj następujące keyed_group do spisu dynamicznego 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

Uruchom polecenie ansible-inventory z opcją --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

W danych wyjściowych zobaczysz jeszcze dwie grupy _message_broker i _web_server. Używając grupy kluczy, applicationRole tag wypełnia nazwy grup i członkostwa w grupach.

Kluczowy punkt:

  • Domyślnie grupy kluczy zawierają separator. Aby usunąć separator, dodaj separator: "" pod właściwością klucza.

Uruchamianie podręczników z wzorcami nazw grup

Użyj grup utworzonych przez spis dynamiczny do docelowych podgrup.

  1. Utwórz podręcznik o nazwie win_ping.yml z następującą zawartością:

    ---
    - 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. win_ping.yml Uruchom podręcznik.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    Po wyświetleniu monitu username wprowadź wartość i password dla maszyny wirtualnej platformy Azure z systemem Windows.

    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
    

    Ważne

    Jeśli wystąpi błąd winrm or requests is not installed: No module named 'winrm', zainstaluj narzędzie pywinrm za pomocą następującego polecenia: pip install "pywinrm>=0.3.0"

  3. Utwórz drugi podręcznik o nazwie o ping.yml następującej zawartości:

    ---
    - 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. ping.yml Uruchom podręcznik.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    Po wyświetleniu monitu wprowadź wartość username i password dla maszyny wirtualnej z systemem Linux platformy 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  
    

Czyszczenie zasobów

  1. Uruchom polecenie az group delete , aby usunąć grupę zasobów. Wszystkie zasoby w grupie zasobów zostaną usunięte.

    az group delete --name <resource_group>
    
  2. Sprawdź, czy grupa zasobów została usunięta przy użyciu polecenia az group show.

    az group show --name <resource_group>
    

Następne kroki