Поделиться через


Руководство по настройке динамических инвентаризаций ресурсов 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 в динамическую инвентаризацию.

Поиск переменных хоста виртуальных машин Azure

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

Откройте динамическую инвентаризацию 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

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

Добавьте следующую ключевую_группу в динамический инвентарь 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 для виртуальной машины Windows Azure.

    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>
    

Дальнейшие шаги