您可以将 Ansible Tower 与 Cloud Assembly 集成,以支持已部署资源的配置管理。配置集成后,可以从云模板编辑器将 Ansible Tower 虚拟组件添加到新部署或现有部署中。
前提条件
- 授予非管理员用户访问 Ansible Tower 的适当权限。对于大多数配置,有两种适用方法。请选择最适合您配置的方法。
- 在组织级别为用户授予清单管理员和作业模板管理员角色。
- 为用户授予特定清单的管理员权限,以及用于置备的所有作业模板的执行角色。
-
您必须在 Ansible Tower 中配置相应的凭据和模板,以与您的部署配合使用。模板可以是作业模板或工作流模板。作业模板定义用于部署的清单和 playbook。作业模板和 playbook 之间存在 1:1 映射。Playbook 使用类似 YAML 的语法来定义与模板关联的任务。对于大多数典型部署,请使用计算机凭据进行身份验证。
工作流模板允许用户创建序列,这些序列包含作业模板、项目同步和清单同步的任意组合,并链接在一起以便您可以作为一个单元执行。Ansible Tower 工作流可视化工具可帮助用户设计工作流模板。对于大多数典型部署,可以使用计算机凭据进行身份验证。
- 登录到 Ansible Tower 并导航到“模板”部分。
- 选择“添加新作业”模板。
- 选择已创建的凭据。这些是将由 Ansible Tower 管理的计算机的凭据。每个作业模板可以有一个凭据对象。
- 对于“限制”选择,选择“启动时提示”。这可确保作业模板针对正从 Cloud Assembly 置备或取消置备的节点运行。如果未选择此选项,则在部署包含作业模板的蓝图时,将显示“未设置限制”错误。
- 选择“添加新工作流”模板。
- 选择已创建的凭据,然后定义清单。使用工作流可视化工具,设计工作流模板。
对于工作流模板或作业模板的“限制”框,通常会选择“启动时提示”。选择此选项可确保作业模板或工作流模板针对正从 Cloud Assembly 置备或取消置备的节点运行。
- 您可以在 Ansible Tower 的“作业”选项卡上查看从 Cloud Assembly 调用的作业模板或工作流模板的执行情况。
过程
结果
Ansible Tower 可在云模板中使用。
下一步做什么
将 Ansible Towe 组件添加到所需云模板。必须为在集成帐户中指定的用户指定适用的作业模板和执行权限。
- 在云模板画布页面上,选择蓝图选项菜单上“配置管理”标题下的“Ansible”,然后将 Ansible Tower 组件拖动到画布。
- 使用右侧面板配置相应的 Ansible Tower 属性,例如作业模板。
将 Ansible Tower 图标添加到云模板时,vRealize Automation 会在 Ansible Tower 中为连接的虚拟机创建主机条目。默认情况下,vRealize Automation 将使用虚拟机的资源名称创建主机条目,但可以使用蓝图 YAML 中的 hostName
属性指定任何名称。为了与计算机进行通信,vRealize 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 Tower 的 YAML 计数属性大于 1,则主机名可以映射到相应虚拟机的任何属性。以下示例显示了名为 Ubuntu-VM 的虚拟机资源的映射(如果要将其地址属性映射到主机名)。
hostname: '${resource.Ubuntu-VM.address[count.index]}'
将 Ansible Tower 组件添加到云模板时,可以指定要在云模板 YAML 中调用的作业模板。此外,还可以指定工作流模板或作业模板和工作流模板的组合。如果未指定模板类型,则默认情况下,vRealize 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
我们添加了 maxConnectionsRetries
和 maxJobRetries
以处理 Ansible 相关故障。云模板接受自定义值,如果未提供值,则使用默认值。对于 maxConnectionRetries
,默认值为 10,对于 maxJobRetries
,默认值为 3。
Ansible Tower 集成的 Cloud Assembly 云模板包括 useDefaultLimit
属性,该属性具有 true 或 false 值,用于定义 Ansible 模板的执行位置。Ansible 模板可以是作业模板或工作流模板。如果该值设置为 true,则指定的模板将针对在 Ansible“模板”页面上的“限制”框中指定的计算机运行。如果该值设置为 false,则模板将针对已置备的计算机运行,但用户应选中 Ansible Tower“模板”页面上的“启动时提示”复选框。默认情况下,此属性的值为 false。以下 YAML 示例展示了 useDefaultLimit
属性在云模板中的显示方式。
templates: provision: - name: ping aws_credentials type: job useDefaultLimit: false extraVars: '{"rubiconSurveyJob" : "checkSurvey"}'
此外,如上例所示,可以使用 extraVars
属性指定额外变量或调查变量。此功能对于运行需要输入的模板非常有用。如果用户保留了调查变量,则您必须在云模板的 extraVars
部分中传递该变量,以避免出现错误。
具有云管理员特权的用户可以更改包含 Ansible 开源资源和 Ansible Tower 资源的部署项目。该功能可作为部署级别的实施后操作使用。
要更改 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。同步将合并由 vRealize Automation 添加并由 VMware 清单插件导入的 FQDN 主机条目,并将主机分配给组。将使用上述同步源变量根据虚拟机标记值创建清单组。
有关示例实施,请参见以下云模板。
# 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}