可以将 Ansible Automation Platform(以前称为 Ansible Tower)与 Automation Assembler 集成,以支持已部署资源的配置管理。配置集成后,可以从云模板编辑器将 Ansible Automation Platform 虚拟组件添加到新部署或现有部署中。

如果使用的是 云代理,则必须设置vSphere。

前提条件

  • 授予非管理员用户访问 Ansible Automation Platform 的适当权限。对于大多数配置,有两种适用方法。请选择最适合您配置的方法。
    • 在组织级别为用户授予清单管理员和作业模板管理员角色。
    • 为用户授予特定清单的管理员权限,以及用于置备的所有作业模板的执行角色。
  • 您必须在 Ansible Automation Platform 中配置相应的凭据和模板,以与您的部署配合使用。模板可以是作业模板或工作流模板。作业模板定义用于部署的清单和 playbook。作业模板和 playbook 之间存在 1:1 映射。Playbook 使用类似 YAML 的语法来定义与模板关联的任务。对于大多数典型部署,请使用计算机凭据进行身份验证。

    工作流模板允许用户创建序列,这些序列包含作业模板、项目同步和清单同步的任意组合,并链接在一起以便您可以作为一个单元执行。Ansible Automation Platform 工作流可视化工具可帮助用户设计工作流模板。对于大多数典型部署,可以使用计算机凭据进行身份验证。

    如果使用 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. 选择“添加新工作流”模板。
      • 选择已创建的凭据,然后定义清单。使用工作流可视化工具,设计工作流模板。

      对于工作流模板或作业模板的“限制”框,通常会选择“启动时提示”。选择此选项可确保作业模板或工作流模板针对正从 Automation Assembler 置备或取消置备的节点运行。

  • 您可以在 Ansible Tower 的“作业”选项卡上查看从 Automation Assembler 调用的作业模板或工作流模板的执行情况。

过程

  1. 选择基础架构 > 连接 > 集成,然后单击添加集成
  2. 单击 Ansible Tower。
    此时将显示 Ansible 配置页面。
  3. 输入主机名(可以是 IP 地址)以及 Ansible Automation Platform 实例的其他必填信息。
  4. 为适用的 Ansible Automation Platform 实例输入基于 UI 的身份验证用户名密码
  5. 如果需要云代理,请单击新建云代理,然后输入必填信息。通常,只有在使用 vSphere 时,才需要云代理。请参见在 Automation Assembler 中将云代理添加到 vCenter
  6. 单击验证以验证集成。
  7. 为集成键入适当的名称描述
  8. 单击添加

结果

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 将使用虚拟机的资源名称创建主机条目,但可以使用蓝图 YAML 中的 hostName 属性指定任何名称。为了与计算机进行通信,VMware Aria Automation 将为主机条目创建 ansible_host: IP Address 变量。可以覆盖默认行为,使用 FQDN 配置通信,具体方法为在 hostVariables 下指定关键字 ansible_host,并提供 FQDN 作为其值。以下 YAML 代码片段显示了如何配置主机名和 FQDN 通信的示例:

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
			

在此示例中,通过提供 FQDN 覆盖默认的 ansible_host 值。如果用户希望 Ansible Tower 使用 FQDN 连接到主机,此功能可能非常有用。

YAML 中 hostVariables 的默认值为 ansible_host:IP_address,并且 IP 地址用来与服务器通信。

如果 Ansible Automation Platform 的 YAML 计数属性大于 1,则主机名可以映射到相应虚拟机的任何属性。以下示例显示了名为 Ubuntu-VM 的虚拟机资源的映射(如果要将其地址属性映射到主机名)。

 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      

我们添加了 maxConnectionsRetriesmaxJobRetries 以处理 Ansible 相关故障。云模板接受自定义值,如果未提供值,则使用默认值。对于 maxConnectionRetries,默认值为 10,对于 maxJobRetries,默认值为 3。

注: 早期版本的 VMware Aria Automation 仅支持在云模板中使用 jobTemplate 结构定义执行作业模板。jobTemplate 现已弃用,可能会在未来版本中移除。目前,使用 jobTemplate 属性将继续正常工作。要运行工作流模板并使用其他功能,建议使用模板结构定义。

Ansible Automation Platform 集成的 Cloud Assembly 云模板包括 useDefaultLimit 属性,该属性具有 true 或 false 值,用于定义 Ansible 模板的执行位置。Ansible 模板可以是作业模板或工作流模板。如果该值设置为 true,则指定的模板将针对在 Ansible“模板”页面上的“限制”框中指定的计算机运行。如果该值设置为 false,则模板将针对已置备的计算机运行,但用户应选中 Ansible Automation Platform“模板”页面上的“启动时提示”复选框。默认情况下,此属性的值为 false。以下 YAML 示例展示了 useDefaultLimit 属性在云模板中的显示方式。

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

此外,如上例所示,可以使用 extraVars 属性指定额外变量或调查变量。此功能对于运行需要输入的模板非常有用。如果用户保留了调查变量,则您必须在云模板的 extraVars 部分中传递该变量,以避免出现错误。

具有云管理员特权的用户可以更改包含 Ansible 开源资源和 Ansible Automation Platform 资源的部署项目。该功能可作为部署级别的实施后操作使用。

要更改 Ansible 部署的项目,请从该部署的“操作”菜单中选择“更改项目”选项,如 Cloud Assembly“部署”页面上所示,然后选择目标项目并在显示的对话框上单击提交

虽然 Ansible Tower 集成不支持 groups 属性,但客户可以使用虚拟机标记和 VMware 清单插件实现等效功能,如以下文章中所述:https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html

用户必须进行两项更改才能使其正常运行:
  • 在云模板中使用 ansible_host(例如 FQDN)和 hostName
  • 在 AWX 中,启用“启动时更新”标志;即,在运行 playbook 之前,同步到新主机的 vCenter。同步将合并由 VMware Aria Automation 添加并由 VMware 清单插件导入的 FQDN 主机条目,并将主机分配给组。将使用上述同步源变量根据虚拟机标记值创建清单组。
注: 虽然 VMware 并不正式支持使用 AWX,但在本文所述的情况下,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}