Spec-Zone.ru › Ansible 2.6

Руководство по 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 с учетной записью администратора
  • Создайте пользователя в вашей стандартной AAD. Вы НЕ должны активировать многофакторную аутентификацию
  • Перейдите в Настройки - Администраторы
  • Нажмите Добавить и введите адрес электронной почты нового пользователя.
  • Установите флажок подписки, с которой вы хотите протестировать этого пользователя.
  • Войдите в портал Azure с этим новым пользователем, чтобы изменить временный пароль на новый. Вы не сможете использовать временный пароль для входа в систему с помощью OAuth.

Предоставление учетных данных модулям Azure

Модули предлагают несколько способов предоставления учетных данных. Для инструмента CI/CD, такого как Ansible Tower или Jenkins, вы, скорее всего, захотите использовать переменные окружения. Для локального разработки вы можете хранить свои учетные данные в файле в вашем домашнем каталоге. И, конечно, вы всегда можете передавать учетные данные в качестве параметров задаче внутри плана.

Порядок приоритетов: параметры, затем переменные окружения и, наконец, файл в домашнем каталоге.

Использование переменных окружения

Для передачи учетных данных службы-принципала через окружение определите следующие переменные:

  • 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://xxx.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

Возможна загрузка нескольких наборов учетных данных в файл credentials, создав несколько разделов. Каждый раздел рассматривается как профиль. Модули автоматически ищут профиль [default]. Определите AZURE_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://xxx.com/adfs.

Другие облачные среды

Чтобы использовать облако Azure, отличное от стандартного облака (например, Azure China Cloud, Azure US Government Cloud, 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 предлагает различные параметры. Не все параметры продемонстрированы в приведенном выше примере. Для получения дополнительной информации и примеров обратитесь к документации каждого модуля.

Создание виртуальной машины с параметрами по умолчанию

Если вы просто хотите создать виртуальную машину без указания всех деталей, вы можете это сделать. Единственное ограничение состоит в том, что вам нужна виртуальная сеть с одной подсетью в вашей группе ресурсов. Предполагая, что у вас уже есть виртуальная сеть с существующей подсетью, вы можете выполнить следующее, чтобы создать VM:

azure_rm_virtualmachine:
  resource_group: Testing
  name: testvm10
  vm_size: Standard_D1
  admin_username: chouseknecht
  ssh_password: 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 Resource, или даже до одного определенного хоста.

Для каждого хоста сценарий инвентаризации предоставляет следующие переменные хоста:

{
  "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 (все хосты)
  • наименованию расположения
  • наименованию группы ресурсов
  • наименованию группы безопасности
  • ключу тега
  • значению ключа тега

Вы можете управлять группировкой и выбором хостов, определив переменные окружения или создав файл 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_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

Примеры

Вот некоторые примеры использования сценария инвентаризации:

# Execute /bin/uname on all instances in the Testing resource group
$ ansible -i azure_rm.py Testing -m shell -a "/bin/uname -a"

# 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.6/scenario_guides/guide_azure.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API