Руководство по Microsoft Azure
Ansible включает набор модулей для взаимодействия с Azure Resource Manager, предоставляя инструменты для лёгкого создания и управления инфраструктурой в облаке Microsoft Azure.
Требования
Использование модулей Azure Resource Manager требует установки определённых модулей Azure SDK на хосте, на котором работает Ansible.
$ pip install 'ansible[azure]'
Если вы запускаете Ansible из исходного кода, вы можете установить зависимости из корневой директории репозитория Ansible.
$ pip install .[azure]
Также вы можете напрямую запустить Ansible в Azure Cloud Shell, где Ansible предварительно установлен.
Авторизация в Azure
Для использования модулей Azure Resource Manager требуется авторизация в API Azure. Вы можете выбрать одну из двух стратегий аутентификации:
- Имя пользователя/пароль Active Directory
- Учётные данные службы-принципала
Следуйте инструкциям для выбранной стратегии, а затем перейдите к Предоставление учётных данных модулям Azure для получения инструкций по фактическому использованию модулей и авторизации в API Azure.
Использование службы-принципала
Теперь есть подробный официальный учебник, описывающий создание службы-принципала.
После выполнения учебника у вас будет:
- Ваш идентификатор клиента, который находится в поле «client id» на странице «Настройка» вашего приложения в портале Azure
- Ваш секретный ключ, сгенерированный при создании приложения. После создания вы не сможете увидеть ключ. Если вы потеряли ключ, вы должны создать новый на странице «Настройка» вашего приложения.
- И, наконец, идентификатор клиента. Это UUID (например, ABCDEFGH-1234-ABCD-1234-ABCDEFGHIJKL), указывающий на AD, содержащий ваше приложение. Вы найдёте его в URL-адресе внутри портала Azure или в разделе «просмотр конечных точек» любого URL-адреса.
Использование имени пользователя/пароля Active Directory
Для создания имени пользователя/пароля Active Directory:
- Подключитесь к классическому порталу Azure с вашей учётной записью администратора
- Создайте пользователя в вашей по умолчанию AD. Не нужно активировать многофакторную аутентификацию
- Перейдите в Настройки - Администраторы
- Нажмите Добавить и введите электронный адрес нового пользователя.
- Установите флажок подписки, с которой вы хотите протестировать этого пользователя.
- Войдите в портал Azure этим новым пользователем, чтобы изменить временный пароль на новый. Вы не сможете использовать временный пароль для входа с помощью OAuth.
Предоставление учётных данных модулям Azure
Модули предлагают несколько способов предоставления ваших учётных данных. Для инструмента CI/CD, такого как Ansible Tower или Jenkins, вы, скорее всего, захотите использовать переменные окружения. Для разработки на локальном компьютере вы можете хранить свои учётные данные в файле в домашней директории. И, конечно же, вы всегда можете передать учётные данные как параметры задаче внутри playbook. Порядок приоритета: параметры, затем переменные окружения и, наконец, файл, расположенный в домашней директории.
Использование переменных окружения
Чтобы передать учётные данные службы-принципала через переменные окружения, определите следующие переменные:
- AZURE_CLIENT_ID
- AZURE_SECRET
- AZURE_SUBSCRIPTION_ID
- AZURE_TENANT
Чтобы передать имя пользователя/пароль Active Directory через переменные окружения, определите следующие переменные:
- AZURE_AD_USER
- AZURE_PASSWORD
Чтобы передать имя пользователя/пароль Active Directory в ADFS через переменные окружения, определите следующие переменные:
- AZURE_AD_USER
- AZURE_PASSWORD
- AZURE_CLIENT_ID
- AZURE_TENANT
- AZURE_ADFS_AUTHORITY_URL
«AZURE_ADFS_AUTHORITY_URL» необязательно. Она необходима только в том случае, если у вас есть собственный ADFS-сервис, например, https://yourdomain.com/adfs.
Хранение в файле
При работе в среде разработки может потребоваться хранить учётные данные в файле. Модули будут искать учётные данные в $HOME/.azure/credentials. Этот файл имеет стиль ini. Он будет выглядеть следующим образом:
[default] subscription_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx client_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx secret=xxxxxxxxxxxxxxxxx tenant=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Примечание
Если ваши секретные значения содержат символы, не входящие в ASCII, вы должны кодировать их с помощью URL, чтобы избежать ошибок входа.
В файле учётных данных можно хранить несколько наборов учётных данных, создав несколько разделов. Каждый раздел считается профилем. Модули автоматически ищут профиль [default]. Определите AZURE_PROFILE в переменных окружения или передайте параметр profile для указания конкретного профиля.
Передача как параметров
Если вы хотите передать учётные данные как параметры задаче, используйте следующие параметры для службы-принципала:
- client_id
- secret
- subscription_id
- tenant
Или передайте следующие параметры для имени пользователя/пароля Active Directory:
- ad_user
- password
Или передайте следующие параметры для имени пользователя/пароля ADFS:
- ad_user
- password
- client_id
- tenant
- adfs_authority_url
«adfs_authority_url» необязательно. Она необходима только в том случае, если у вас есть собственный ADFS-сервис, например, https://yourdomain.com/adfs.
Другие облачные среды
Чтобы использовать облако Azure, отличное от стандартного публичного облака (например, облако Azure China, облако Azure US Government, Azure Stack), передайте аргумент «cloud_environment» в модули, настройте его в профиле учётных данных или установите переменную окружения «AZURE_CLOUD_ENVIRONMENT». Значение может быть именем облака, как определено в Azure Python SDK (например, «AzureChinaCloud», «AzureUSGovernment»; по умолчанию «AzureCloud»), или URL-адресом обнаружения метаданных Azure (для Azure Stack).
Создание виртуальных машин
Есть два способа создания виртуальной машины, оба с использованием модуля azure_rm_virtualmachine. Мы можем либо создать хранилище, сетевой интерфейс, группу безопасности и публичный IP-адрес и передать имена этих объектов в модуль в качестве параметров, либо мы можем позволить модулю выполнить работу за нас и принять значения по умолчанию.
Создание отдельных компонентов
Доступен модуль Azure для помощи в создании хранилища, виртуальной сети, подсети, сетевого интерфейса, группы безопасности и публичного IP-адреса. Вот полный пример создания каждого из этих элементов и передачи имён в модуль azure_rm_virtualmachine в конце:
- name: Create storage account
azure_rm_storageaccount:
resource_group: Testing
name: testaccount001
account_type: Standard_LRS
- name: Create virtual network
azure_rm_virtualnetwork:
resource_group: Testing
name: testvn001
address_prefixes: "10.10.0.0/16"
- name: Add subnet
azure_rm_subnet:
resource_group: Testing
name: subnet001
address_prefix: "10.10.0.0/24"
virtual_network: testvn001
- name: Create public ip
azure_rm_publicipaddress:
resource_group: Testing
allocation_method: Static
name: publicip001
- name: Create security group that allows SSH
azure_rm_securitygroup:
resource_group: Testing
name: secgroup001
rules:
- name: SSH
protocol: Tcp
destination_port_range: 22
access: Allow
priority: 101
direction: Inbound
- name: Create NIC
azure_rm_networkinterface:
resource_group: Testing
name: testnic001
virtual_network: testvn001
subnet: subnet001
public_ip_name: publicip001
security_group: secgroup001
- name: Create virtual machine
azure_rm_virtualmachine:
resource_group: Testing
name: testvm001
vm_size: Standard_D1
storage_account: testaccount001
storage_container: testvm001
storage_blob: testvm001.vhd
admin_username: admin
admin_password: Password!
network_interfaces: testnic001
image:
offer: CentOS
publisher: OpenLogic
sku: '7.1'
version: latest
Каждый модуль Azure предлагает различные варианты параметров. Не все параметры показаны в приведенном выше примере. Обратитесь к каждому отдельному модулю для получения дополнительных подробностей и примеров.
Создание виртуальной машины с параметрами по умолчанию
Если вы просто хотите создать виртуальную машину без указания всех деталей, вы можете сделать это и таким образом. Единственное ограничение состоит в том, что вам понадобится виртуальная сеть с одной подсетью в вашей группе ресурсов. Предполагая, что у вас уже есть виртуальная сеть с существующей подсетью, вы можете запустить следующее для создания ВМ:
azure_rm_virtualmachine:
resource_group: Testing
name: testvm10
vm_size: Standard_D1
admin_username: chouseknecht
ssh_password_enabled: false
ssh_public_keys: "{{ ssh_keys }}"
image:
offer: CentOS
publisher: OpenLogic
sku: '7.1'
version: latest
Сценарий динамической инвентаризации
Если вы не знакомы со сценариями динамической инвентаризации Ansible, ознакомьтесь с Введением в динамическую инвентаризацию.
Сценарий инвентаризации Azure Resource Manager называется azure_rm.py. Он проходит аутентификацию в API Azure точно так же, как модули Azure, что означает, что вы либо определите те же переменные окружения, что описаны выше в разделе Использование переменных окружения, создадите файл $HOME/.azure/credentials (также описанный выше в Хранение в файле), или передадите параметры командной строки. Чтобы увидеть доступные параметры командной строки, выполните следующее:
$ ./ansible/contrib/inventory/azure_rm.py --help
Как и во всех сценариях динамической инвентаризации, скрипт может быть выполнен непосредственно, передан в качестве параметра команде ansible или передан непосредственно в ansible-playbook с помощью параметра -i. Независимо от способа выполнения, сценарий генерирует JSON, представляющий все хосты, найденные в вашей подписке Azure. Вы можете сузить этот список до хостов, найденных только в определённом наборе групп ресурсов Azure, или даже до конкретного хоста.
Для каждого хоста сценарий инвентаризации предоставляет следующие переменные хоста:
{
"ansible_host": "XXX.XXX.XXX.XXX",
"computer_name": "computer_name2",
"fqdn": null,
"id": "/subscriptions/subscription-id/resourceGroups/galaxy-production/providers/Microsoft.Compute/virtualMachines/object-name",
"image": {
"offer": "CentOS",
"publisher": "OpenLogic",
"sku": "7.1",
"version": "latest"
},
"location": "westus",
"mac_address": "00-00-5E-00-53-FE",
"name": "object-name",
"network_interface": "interface-name",
"network_interface_id": "/subscriptions/subscription-id/resourceGroups/galaxy-production/providers/Microsoft.Network/networkInterfaces/object-name1",
"network_security_group": null,
"network_security_group_id": null,
"os_disk": {
"name": "object-name",
"operating_system_type": "Linux"
},
"plan": null,
"powerstate": "running",
"private_ip": "172.26.3.6",
"private_ip_alloc_method": "Static",
"provisioning_state": "Succeeded",
"public_ip": "XXX.XXX.XXX.XXX",
"public_ip_alloc_method": "Static",
"public_ip_id": "/subscriptions/subscription-id/resourceGroups/galaxy-production/providers/Microsoft.Network/publicIPAddresses/object-name",
"public_ip_name": "object-name",
"resource_group": "galaxy-production",
"security_group": "object-name",
"security_group_id": "/subscriptions/subscription-id/resourceGroups/galaxy-production/providers/Microsoft.Network/networkSecurityGroups/object-name",
"tags": {
"db": "mysql"
},
"type": "Microsoft.Compute/virtualMachines",
"virtual_machine_size": "Standard_DS4"
}
Группы хостов
По умолчанию хосты сгруппированы по:
- azure (все хосты)
- названию расположения
- названию группы ресурсов
- названию группы безопасности
- ключу тега
- значению ключа тега
- тип операционной системы диска (Windows/Linux)
Вы можете контролировать группировку и выбор хостов, определив переменные окружения или создав файл azure_rm.ini в текущей рабочей директории.
ПРИМЕЧАНИЕ: Файл .ini будет иметь приоритет над переменными окружения.
ПРИМЕЧАНИЕ: Имя файла .ini — это имя файла сценария инвентаризации (т. е. ‘azure_rm’) с расширением ‘.ini’. Это позволяет копировать, переименовывать и настраивать сценарий инвентаризации и иметь соответствующие файлы .ini в одной директории.
Управление группировкой с помощью следующих переменных, определённых в окружении:
- AZURE_GROUP_BY_RESOURCE_GROUP=yes
- AZURE_GROUP_BY_LOCATION=yes
- AZURE_GROUP_BY_SECURITY_GROUP=yes
- AZURE_GROUP_BY_TAG=yes
- AZURE_GROUP_BY_OS_FAMILY=yes
Выберите хосты в определённых группах ресурсов, назначив список, разделённый запятыми, для:
- AZURE_RESOURCE_GROUPS=resource_group_a,resource_group_b
Выберите хосты для определённого ключа тега, назначив список ключей тегов, разделённых запятыми, для:
- AZURE_TAGS=key1,key2,key3
Выберите хосты для определённых расположений, назначив список расположений, разделённых запятыми, для:
- AZURE_LOCATIONS=eastus,eastus2,westus
Или выберите хосты для определённых пар ключ-значение тегов, назначив список пар ключ-значение тегов, разделённых запятыми, для:
- AZURE_TAGS=key1:value1,key2:value2
Если вам не нужен powerstate, вы можете повысить производительность, отключив извлечение powerstate:
- AZURE_INCLUDE_POWERSTATE=no
Образец файла azure_rm.ini прилагается вместе со сценарием инвентаризации в contrib/inventory. Файл .ini будет содержать следующее:
[azure] # Control which resource groups are included. By default all resources groups are included. # Set resource_groups to a comma separated list of resource groups names. #resource_groups= # Control which tags are included. Set tags to a comma separated list of keys or key:value pairs #tags= # Control which locations are included. Set locations to a comma separated list of locations. #locations= # Include powerstate. If you don't need powerstate information, turning it off improves runtime performance. # Valid values: yes, no, true, false, True, False, 0, 1. include_powerstate=yes # Control grouping with the following boolean flags. Valid values: yes, no, true, false, True, False, 0, 1. group_by_resource_group=yes group_by_location=yes group_by_security_group=yes group_by_tag=yes group_by_os_family=yes
Примеры
Ниже приведены некоторые примеры использования сценария инвентаризации:
# Execute /bin/uname on all instances in the Testing resource group $ ansible -i azure_rm.py Testing -m shell -a "/bin/uname -a" # Execute win_ping on all Windows instances $ ansible -i azure_rm.py windows -m win_ping # Execute win_ping on all Windows instances $ ansible -i azure_rm.py winux -m ping # Use the inventory script to print instance specific information $ ./ansible/contrib/inventory/azure_rm.py --host my_instance_host_name --resource-groups=Testing --pretty # Use the inventory script with ansible-playbook $ ansible-playbook -i ./ansible/contrib/inventory/azure_rm.py test_playbook.yml
Вот простой игровой сценарий для проверки скрипта инвентаризации Azure:
- name: Test the inventory script
hosts: azure
connection: local
gather_facts: no
tasks:
- debug: msg="{{ inventory_hostname }} has powerstate {{ powerstate }}"
Вы можете выполнить игровой сценарий примерно так:
$ ansible-playbook -i ./ansible/contrib/inventory/azure_rm.py test_azure_inventory.yml
Отключение проверки сертификатов на конечных точках Azure
При наличии прокси-сервера HTTPS или при использовании Azure Stack может потребоваться отключить проверку сертификатов для конечных точек Azure в модулях Azure. Это не рекомендуется с точки зрения безопасности, но может быть необходимо, если хранилище системных сертификатов не может быть изменено для включения необходимого сертификата CA. Проверку сертификатов можно настроить, задав значение «cert_validation_mode» в профиле учетных данных, через переменную среды «AZURE_CERT_VALIDATION_MODE» или передав аргумент «cert_validation_mode» любому модулю Azure. Значение по умолчанию — «validate»; установка значения на «ignore» предотвратит всю проверку сертификатов. Аргумент модуля имеет приоритет над значением профиля учетных данных, которое имеет приоритет над значением переменной среды.
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.8/scenario_guides/guide_azure.html