Руководство по настройке динамических инвентаризаций ресурсов Azure с помощью Ansible

Внимание

Для выполнения примеров сборников схем из этой статьи требуется Ansible 2.8 (или последующей версии).

Функция динамического инвентаризации Ansible удаляет бремя хранения статических файлов инвентаризации.

В этом руководстве вы используете подключаемый модуль динамической инвентаризации Azure для заполнения инвентаризации Ansible.

Вы узнаете, как выполнять следующие задачи:

  • Настройка двух тестовых виртуальных машин.
  • Добавление тегов в виртуальные машины Azure
  • Создание динамического списка
  • Использование условных групп или групп с ключами для заполнения членства в группах
  • Запуск сборников схем для групп в рамках динамического списка инвентаризации

Необходимые компоненты

Создание виртуальных машин Azure

  1. Войдите на портал Azure.

  2. Откройте Cloud Shell.

  3. Создайте группу ресурсов Azure для хранения виртуальных машин, используемых в этом руководстве.

    Внимание

    Имя группы ресурсов Azure, создаваемой на этом этапе, должно содержать только строчные символы. В противном случае создание динамического списка завершится ошибкой.

    az group create --resource-group ansible-inventory-test-rg --location eastus
    
  4. Создайте две виртуальные машины Linux в Azure одним из следующих способов:

    • Сборник схем Ansible. В статьях о создании базовой виртуальной машины Linux в Azure с помощью Ansible, а также о создании базовой виртуальной машины Windows в Azure с помощью Ansible показано, как создать виртуальную машину из сборника схем Ansible.

    • Azure CLI. Выполните каждую из следующих команд в Cloud Shell, чтобы создать две виртуальные машины:

      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>
      

      Вместо <password> укажите свой пароль.

Добавление тегов роли приложения

Теги используются для упорядочивания и классификации ресурсов Azure. Присвоение виртуальным машинам Azure роли приложения позволяет использовать эти теги в качестве имен групп в динамическом списке инвентаризации Azure.

Выполните следующие команды для обновления тегов виртуальной машины:

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' 

Дополнительные сведения о стратегиях тегов Azure см. в статье Определение стратегии добавления тегов.

Создание динамического списка

Ansible предоставляет подключаемый модуль динамической инвентаризации для Azure.

Инструкции по использованию подключаемого модуля приведены ниже.

  1. Создайте динамический список инвентаризации с именем myazure_rm.yml

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

    Ключевой момент:

    • Ansible использует имя и расширение файла инвентаризации для определения используемого подключаемого модуля инвентаризации. Чтобы использовать подключаемый модуль динамического списка инвентаризации Azure, файл должен заканчиваться на azure_rm и иметь расширение yml или yaml.
  2. Выполните следующую команду для запроса виртуальных машин в группе ресурсов:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. Когда вы выполните команду, вы увидите результаты, аналогичные следующим:

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

Обе виртуальные машины принадлежат к группе ungrouped, которая является дочерней по отношению к группе all в данных инвентаризации Ansible.

Ключевой момент:

  • По умолчанию модуль динамического списка инвентаризации Azure возвращает глобально уникальные имена. По этой причине имена виртуальных машин могут содержать дополнительные символы. Это поведение можно отключить, добавив plain_host_names: yes в динамическую инвентаризацию.

Поиск виртуальной машины hostvars

Выполните следующую команду, чтобы просмотреть все 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"
                },
                ...
            }
        }
    },
    ...
    }
}

Получая информацию из Azure, служба динамической инвентаризации заполняет hostvars для каждой виртуальной машины Azure. Эти hostvars затем определяют членство групп виртуальной машины в службе инвентаризации Ansible.

Назначение членства в группе с помощью conditional_groups

Каждая условная группа состоит из двух частей. Имя группы и условие для добавления члена в группу.

Используйте свойство image.offer для создания условного членства в группах для linux-vm.

Откройте динамический список инвентаризации myazure_rm.yml и добавьте следующее 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"

Выполните команду ansible-inventory с помощью параметра--graph:

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

Выходные данные показывают, что виртуальные машины больше не связаны с группой ungrouped. Вместо этого каждая виртуальная машина назначается новой группе, созданной динамической инвентаризацией.

Ключевой момент:

  • Условные группы позволяют наименовать конкретные группы в службе инвентаризации и заполнять их с помощью hostvars.

Назначение членства в группе с помощью keyed_groups

Группы с ключами назначают членство в группе так же, как и условные группы, но при использовании группы с ключом, имя группы также динамически заполняется.

Добавьте следующую keyed_group в 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

Выполните команду ansible-inventory с помощью параметра--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

В выходных данных вы увидите еще две группы _message_broker и _web_server. С помощью ключевой группы applicationRole тег заполняет имена групп и членство в группах.

Ключевой момент:

  • По умолчанию группы с ключом содержат разделитель. Чтобы удалить разделитель, добавьте separator: "" в свойство ключа.

Запуск сборников схем с шаблонами имен групп

Используйте группы, созданные с помощью списка динамической инвентаризации, для назначения подгрупп.

  1. Создайте сборник схем с именем win_ping.yml и указанным ниже содержимым.

    ---
    - 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.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    При появлении запроса введите username и password для виртуальной машины Azure 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
    

    Внимание

    При возникновении ошибки winrm or requests is not installed: No module named 'winrm', установите pywinrm с помощью следующей команды: pip install "pywinrm>=0.3.0"

  3. Создайте второй сборник схем с именем ping.yml со следующим содержимым:

    ---
    - 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.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    При появлении запроса введите username и password для виртуальной машины Linux в 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  
    

Очистка ресурсов

  1. Чтобы удалить группу ресурсов, выполните команду az group delete. Все ресурсы в группе ресурсов удаляются.

    az group delete --name <resource_group>
    
  2. Убедитесь, что группа ресурсов была удалена, с помощью команды az group show.

    az group show --name <resource_group>
    

Следующие шаги