Руководство по настройке динамических инвентаризаций ресурсов Azure с помощью Ansible
Внимание
Для выполнения примеров сборников схем из этой статьи требуется Ansible 2.8 (или последующей версии).
Функция динамического инвентаризации Ansible удаляет бремя хранения статических файлов инвентаризации.
В этом руководстве вы используете подключаемый модуль динамической инвентаризации Azure для заполнения инвентаризации Ansible.
Вы узнаете, как выполнять следующие задачи:
- Настройка двух тестовых виртуальных машин.
- Добавление тегов в виртуальные машины Azure
- Создание динамического списка
- Использование условных групп или групп с ключами для заполнения членства в группах
- Запуск сборников схем для групп в рамках динамического списка инвентаризации
Необходимые компоненты
- Подписка Azure. Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.
- Субъект-служба Azure: создайте субъект-службу, записав следующие значения: appId, displayName, password и tenant.
Установите Ansible: выполните одно из указанных ниже действий.
- Установите и настройте Ansible на виртуальной машине Linux.
- Настройте Azure Cloud Shell и, если у вас нет доступа к виртуальной машине Linux, вы можете создать ее с помощью Ansible.
Создание виртуальных машин Azure
Войдите на портал Azure.
Откройте Cloud Shell.
Создайте группу ресурсов Azure для хранения виртуальных машин, используемых в этом руководстве.
Внимание
Имя группы ресурсов Azure, создаваемой на этом этапе, должно содержать только строчные символы. В противном случае создание динамического списка завершится ошибкой.
az group create --resource-group ansible-inventory-test-rg --location eastus
Создайте две виртуальные машины 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.
Инструкции по использованию подключаемого модуля приведены ниже.
Создайте динамический список инвентаризации с именем
myazure_rm.yml
plugin: azure_rm include_vm_resource_groups: - ansible-inventory-test-rg auth_source: auto
Ключевой момент:
- Ansible использует имя и расширение файла инвентаризации для определения используемого подключаемого модуля инвентаризации. Чтобы использовать подключаемый модуль динамического списка инвентаризации Azure, файл должен заканчиваться на
azure_rm
и иметь расширениеyml
илиyaml
.
- Ansible использует имя и расширение файла инвентаризации для определения используемого подключаемого модуля инвентаризации. Чтобы использовать подключаемый модуль динамического списка инвентаризации Azure, файл должен заканчиваться на
Выполните следующую команду для запроса виртуальных машин в группе ресурсов:
ansible-inventory -i myazure_rm.yml --graph
Когда вы выполните команду, вы увидите результаты, аналогичные следующим:
@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: ""
в свойство ключа.
Запуск сборников схем с шаблонами имен групп
Используйте группы, созданные с помощью списка динамической инвентаризации, для назначения подгрупп.
Создайте сборник схем с именем
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:
Запустите сборник схем
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"
Создайте второй сборник схем с именем
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:
Запустите сборник схем
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
Очистка ресурсов
Чтобы удалить группу ресурсов, выполните команду az group delete. Все ресурсы в группе ресурсов удаляются.
az group delete --name <resource_group>
Убедитесь, что группа ресурсов была удалена, с помощью команды az group show.
az group show --name <resource_group>