Ansible Automation Platform, ранее называемую Ansible Tower, можно интегрировать с Automation Assembler для управления конфигурацией развернутых ресурсов. После настройки интеграции виртуальные компоненты Ansible Automation Platform можно добавлять в новые или существующие развертывания в редакторе облачных шаблонов.

Необходимые условия

  • Предоставьте пользователям, не являющимся администраторами, соответствующие разрешения на доступ к Ansible Automation Platform. Существует два варианта, которые можно использовать в большинстве конфигураций. Выберите наиболее подходящий для своей конфигурации.
    • Предоставьте пользователям роли «Администратор иерархии» и «Администратор шаблонов заданий» на уровне организации.
    • Предоставьте пользователям права администратора на определенную иерархию и роль «Выполнение» для всех шаблонов заданий, используемых для предоставления ресурсов.
  • Для использования с развертываниями в Ansible Automation Platform необходимо настроить соответствующие учетные данные и шаблоны. Можно использовать шаблоны заданий или рабочих процессов. Шаблоны заданий определяют иерархию и сценарий, используемые для развертывания. Задания и сценарии сопоставляются один к одному. Для определения задач, связанных с шаблоном, в сценариях используется синтаксис, похожий на YAML. В большинстве типовых развертываний для проверки подлинности используйте учетные данные компьютера.

    Шаблоны рабочих процессов позволяют пользователям создавать последовательности, состоящие из любой комбинации шаблонов заданий, результатов синхронизации проекта и синхронизации иерархии, которые связаны друг с другом, что позволяет выполнять их единым блоком. Благодаря средству Ansible Automation Platform Workflow Visualizer пользователи могут проектировать шаблоны рабочих процессов. В большинстве типовых развертываний для проверки подлинности можно использовать учетные данные компьютера.

    При работе с Ansible Automation Platform на контроллере Ansible Controller необходимо определить среду выполнения для удовлетворения зависимостей ansible-runner. Дополнительные сведения о средах выполнения и образах контейнеров см. в документации по Ansible. В частности, см. https://docs.ansible.com/automation-controller/4.2.0/html/userguide/execution_environments.html.

    1. Войдите в Ansible Automation Platform и перейдите в раздел «Шаблоны».
    2. Выберите «Добавить новый шаблон задания».
      • Выберите созданные вами учетные данные. Это учетные данные машины, для управления которыми будет использоваться Ansible Automation Platform. Для каждого шаблона задания может существовать один объект учетных данных.
      • Для выбора ограничения выберите «Запрос при запуске». Это гарантирует, что шаблон задания будет выполняться для узла, процесс подготовки или отмены подготовки которого выполняется из Automation Assembler. Если этот параметр не выбран, то при развертывании схемы элементов, содержащей шаблон задания, будет выводиться сообщение об ошибке «Ограничение не установлено».
    3. Выберите «Добавить новый шаблон рабочего процесса».
      • Выберите созданные ранее учетные данные, а затем определите иерархию. С помощью Workflow Visualizer спроектируйте шаблон рабочего процесса.

      В поле «Ограничение» для шаблонов рабочих процессов или заданий обычно можно выбрать вариант «Запрос при запуске». В этом случае шаблон рабочих процессов или заданий будет выполняться для узла, процесс подготовки или отмены подготовки которого выполняется в Automation Assembler.

  • Выполнение шаблонов заданий или шаблонов рабочих процессов, вызываемых из Automation Assembler, можно просматривать на вкладке «Задания Ansible Tower».

Процедура

  1. Выберите пункт Инфраструктура > Подключения > Интеграции и нажмите Добавить интеграцию.
  2. Нажмите Ansible Tower.
    Отобразится страница настройки Ansible.
  3. Введите имя узла, которое может быть IP-адресом, и другую необходимую информацию для экземпляра Ansible Automation Platform.
  4. Введите имя пользователя и пароль, применяемые для проверки подлинности с помощью пользовательского интерфейса, для соответствующего экземпляра Ansible Automation Platform.
  5. Нажмите Проверить, чтобы проверить интеграцию.
  6. Введите соответствующее имя и описание для интеграции.
  7. Нажмите кнопку Добавить.

Результаты

Приложение Ansible Tower доступно для использования в облачных шаблонах.

Дальнейшие действия

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

  1. На странице холста облачного шаблона выберите Ansible в разделе «Управление конфигурацией» в меню параметров схемы элементов и перетащите компонент Ansible Automation Platform на холст.
  2. На панели справа можно настроить соответствующие свойства Ansible Automation Platform, например шаблоны заданий.

При добавлении плитки Ansible Automation Platform облачный шаблон VMware Aria Automation создает запись об узле для подключенной виртуальной машины в Ansible Automation Platform. По умолчанию VMware Aria Automation будет использовать имя ресурса виртуальной машины для создания записи об узле, но с помощью свойства hostName в коде YAML схемы элементов можно указать любое имя. Для обеспечения связи с компьютером служба VMware Aria Automation создаст переменную узла ansible_host: IP Address для записи об узле. Поведение по умолчанию можно переопределить и настроить вариант связи с использованием полного доменного имени, указав ключевое слово ansible_host в разделе hostVariables и введя полное доменное имя в качестве его значения. В следующем фрагменте кода YAML приведен пример настройки связи с использованием имени узла и полного доменного имени.

Cloud_Ansible_Tower_1:
	type: Cloud Ansible Tower
	properties:
		host: name of host
		account: name of account
		hostName: resource name
		hostVariables:
			ansible_host:Host FQDN
			

В этом примере выполняется переопределение значения ansible_host по умолчанию путем указания полного доменного имени. Это может быть полезно для пользователей, которые хотят, чтобы служба Ansible Tower подключалась к компьютеру узла с помощью полного доменного имени.

Значением по умолчанию для параметра hostVariables в коде YAML будет ansible_host:IP_address, а IP-адрес используется для связи с сервером.

Если свойство count в YAML для Ansible Automation Platform имеет значение больше 1, имя узла можно сопоставить с любым из соответствующих свойств виртуальной машины. В следующем примере показано сопоставление для ресурса виртуальной машины с именем Ubuntu-VM, если нужно сопоставить ее свойство address с именем узла.

 hostname: '${resource.Ubuntu-VM.address[count.index]}' 

При добавлении компонента Ansible Automation Platform в облачный шаблон в коде YAML этого шаблона можно указать шаблон задания, который будет вызываться. Также можно указать шаблоны рабочих процессов или комбинацию шаблонов заданий и шаблонов рабочих процессов. Если тип шаблона не указан, VMware Aria Automation по умолчанию предполагает, что вы вызываете шаблон задания.

В следующем фрагменте кода YAML приведен пример вызова комбинации шаблонов задания и рабочего процесса в облачном шаблоне Ansible Tower.

Cloud_Ansible_1:
type: Cloud.Ansible.Tower
  properties:
    host: ‘${resource.CentOS_Machine.*}’
    account:
    maxConnectionRetries: 2
    maxJobRetries: 2
    templates:
      provision:
        - name: My workflow
          type: workflow
        - name: My job template      

Для обработки ошибок, связанных с Ansible, мы добавили параметры maxConnectionsRetries и maxJobRetries. Облачный шаблон принимает настраиваемое значение. Если значение не указано, шаблон будет использовать значение по умолчанию. Значение по умолчанию для maxConnectionRetries — 10, а значение по умолчанию для maxJobRetries — 3.

Примечание: Предыдущие версии службы VMware Aria Automation поддерживали выполнение шаблонов заданий только с помощью схемы jobTemplate в облачном шаблоне. Теперь схема jobTemplate признана устаревшей и, возможно, будет удалена в будущих выпусках. В текущем выпуске свойство jobTemplate работает как раньше. Для запуска шаблонов рабочих процессов и использования дополнительных функций рекомендуется применять схему шаблонов.

Облачные шаблоны Cloud Assembly для интеграций Ansible Automation Platform содержат свойство useDefaultLimit со значением «истина» или «ложь», которое позволяет определить, где выполняются шаблоны Ansible. Шаблоны Ansible могут быть шаблонами заданий или шаблонами рабочих процессов. Если задано значение «истина», указанные шаблоны будут запускаться для компьютера, указанного в поле «Ограничение» на странице «Шаблоны Ansible». Если задано значение «ложь», шаблоны запускаются для подготовленной машины, но пользователи должны установить флажок «Запрос при запуске» на странице «Шаблоны Ansible Automation Platform». По умолчанию это свойство имеет значение «ложь». В следующем примере кода YAML показано, как свойство useDefaultLimit отображается в облачных шаблонах.

templates:
  provision:
    - name: ping aws_credentials
      type: job
      useDefaultLimit: false
      extraVars: '{"rubiconSurveyJob" : "checkSurvey"}'

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

Пользователи с правами администратора облачных систем могут изменять проекты развертывания с ресурсами Ansible Open Source и Ansible Automation Platform. Эта возможность доступна как действие по регулярному обслуживанию на уровне развертывания.

Чтобы изменить проект для развертывания Ansible, выберите пункт «Изменить проект» в меню «Действия» соответствующего развертывания, как показано на странице «Развертывания Cloud Assembly». В открывшемся диалоговом окне выберите нужный проект и нажмите Отправить.

Хотя интеграция Ansible Tower не поддерживает свойство групп, клиенты могут реализовать эквивалентные функции с помощью тегов ВМ и подключаемого модуля иерархии VMware, как описано в статье https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html.

Чтобы это работало, пользователям нужно внести два изменения:
  • Используйте в облачном шаблоне ansible_host (например, полное доменное имя) и hostName.
  • В AWX включите флаг обновления при запуске; это означает, что перед запуском сценария новые узлы будут синхронизироваться с vCenter. При синхронизации записи узлов полного доменного имени, добавленные VMware Aria Automation и импортированные подключаемым модулем иерархии VMware, будут объединены и узлы будут назначены группам. Группы иерархии создаются на основе значений тегов ВМ с использованием указанных выше переменных источника синхронизации.
Примечание: Хотя VMware формально не поддерживает использование AWX, данный инструмент будет функционировать в ситуации, описанной в этом документе.

Пример реализации см. в следующем облачном шаблоне.

# Created by Quickstart wizard.
name: RHEL 8
version: 0.0.1
formatVersion: 1
inputs:
  image:
    type: string
    description: Select an OS Version
    default: RHEL 8 Base
    enum:
      - RHEL 8 Base
      - RHEL 7 Base
  AWX:
    type: string
    description: Choose AWX Environment
    enum:
      - LabAWX
      - FA/CC-AWX
  envrionmnetTag:
    type: string
    description: Choose VM Environment
    enum:
      - cel
      - mag
      - wdr
  purposeTag:
    type: string
    description: Choose Server Purpose
    default: ''
    enum:
      - ''
      - mariadb
      - oracle
  authGroupTag:
    type: string
    description: Choose Authentication Group
    default: ''
    enum:
      - ''
      - dbo_linux
      - oracle
      - postgres
  hostname:
    type: string
    description: Desired hostname
    default: changeme
  cpuCount:
    type: integer
    description: Number of virtual processors
    default: 1
  totalMemoryMB:
    type: integer
    description: Machine virtual memory size in Megabytes
    default: 1024
  disk1Size:
    type: integer
    description: A SIZE of 0 will disable the disk and it will not be provisioned.
    default: 0
  disk2Size:
    type: integer
    description: A SIZE of 0 will disable the disk and it will not be provisioned.
    default: 0
  neededip:
    type: string
    description: Enter an available IP Address
    title: Needed-IP-Address
  vlan:
    type: string
    description: Enter in needed vlan
    title: Enter VLAN ID example "vl500"
resources:
  Cloud_Ansible_Tower_1:
    type: Cloud.Ansible.Tower
    metadata:
      layoutPosition:
        - 0
        - 0
    properties:
      host: ${resource.Cloud_vSphere_Machine_1.*}
      account: ${input.AWX}
      hostName: ${input.hostname}
      hostVariables:
        ansible_host: ${input.hostname}.dcl.wdpr.disney.com
      templates:
        provision:
          - name: Linux-Role
  Cloud_vSphere_Machine_1:
    type: Cloud.vSphere.Machine
    metadata:
      layoutPosition:
        - 0
        - 1
    properties:
      image: ${input.image}
      Infoblox.IPAM.Network.dnsSuffix: dcl.wdpr.disney.com
      Infoblox.IPAM.Network.dnsView: Internal
      customizationSpec: Rhel7Base
      name: ${input.hostname}
      cpuCount: ${input.cpuCount}
      totalMemoryMB: ${input.totalMemoryMB}
      attachedDisks: ${map_to_object(resource.Cloud_Volume_1[*].id + resource.Cloud_Volume_2[*].id, "source")}
      networks:
        - network: ${resource.Cloud_vSphere_Network_1.id}
          assignment: static
          address: ${input.neededip}
      tags:
        - key: Server-Team
          value: ${input.envrionmnetTag}
        - key: Server-Team
          value: ${input.purposeTag}
        - key: Server-Team
          value: ${input.authGroupTag}
  Cloud_Volume_1:
    type: Cloud.Volume
    metadata:
      layoutPosition:
        - 0
        - 2
    properties:
      count: '${input.disk1Size == 0 ? 0 : 1 }'
      capacityGb: ${input.disk1Size}
  Cloud_Volume_2:
    type: Cloud.Volume
    metadata:
      layoutPosition:
        - 0
        - 3
    properties:
      count: '${input.disk2Size == 0 ? 0 : 1}'
      capacityGb: ${input.disk2Size}
  Cloud_vSphere_Network_1:
    type: Cloud.vSphere.Network
    metadata:
      layoutPosition:
        - 1
        - 0
    properties:
      networkType: existing
      constraints:
        - tag: ${input.vlan}