Cloud Assembly 支持与 Ansible 开源配置管理集成。配置集成后,可以将 Ansible 组件添加到新部署或现有部署中。

将 Ansible 开源与 Cloud Assembly 集成时,可以将其配置为置备新计算机时按给定顺序运行一个或多个 Ansible playbook,以自动执行配置管理。可以在云模板中为部署指定所需的 playbook。

设置 Ansible 集成时,必须指定 Ansible 开源主机,以及可为管理资源定义信息的清单文件路径。此外,还必须提供用于访问 Ansible 开源实例的名称和密码。稍后,在将 Ansible 组件添加到部署时,可以更新连接以使用基于密钥的身份验证。

默认情况下,Ansible 使用 ssh 连接到物理计算机。如果使用的是在云模板中通过 osType Windows 属性指定的 Windows 计算机,则 connection_type 变量将自动设置为 winrm

最初,Ansible 集成使用集成中提供的用户/密码或用户/密钥凭据连接到 Ansible 控制计算机。连接成功后,将验证云模板中所提供 Playbook 的语法。

如果验证成功,则会在 Ansible 控制计算机中的 ~/var/tmp/vmware/provider/user_defined_script/ 下创建执行文件夹。将从此文件夹运行脚本,以将主机添加到清单,创建主机变量文件(包括设置身份验证模式以连接到主机),最后运行 Playbook。此时,云模板中提供的凭据用于从 Ansible 控制计算机连接到主机。

Ansible 集成支持不使用 IP 地址的物理机。对于在公有云(如 AWS、Azure 和 GCP)上置备的计算机,仅当计算机连接到公共网络时,才会在所创建资源的 address 属性中填充计算机的公共 IP 地址。对于未连接到公共网络的计算机,Ansible 集成将从连接到该计算机的网络查找 IP 地址。如果连接了多个网络,Ansible 集成将查找 deviceIndex(即,连接到计算机的网卡 (NIC) 的索引)为最小的网络。如果蓝图中未指定 deviceIndex 属性,则集成将使用第一个连接的网络。

有关为 Cloud Assembly 中的集成配置 Ansible 开源的更多详细信息,请参见什么是 Cloud Assembly 中的配置管理

此外,如果使用 vSphere,还必须设置云代理。

前提条件

  • Ansible 控制计算机必须使用 Ansible 版本。有关受支持版本的信息,请参见 vRealize Automation 支持列表
  • Ansible 日志详细级别必须设置为默认值零。
  • 如果适用,请确保云代理中的 cloudassembly-blueprint-agent 版本为 20 或更高版本。
  • 用户必须具有 Ansible 清单文件所在目录的读取/写入权限。此外,如果已存在清单文件,用户也必须具有该文件的读取/写入权限。
  • 如果使用的是具有 sudo 选项的非 root 用户,请确保在 sudoers 文件中设置以下内容:

    Defaults:user_name !requiretty

    username ALL=(ALL) NOPASSWD: ALL

  • 通过在 /etc/ansible/ansible.cfg~/.ansible.cfg 中设置 host_key_checking = False,确保禁用主机密钥检查。
  • 通过将以下行添加到 /etc/ansible/ansible.cfg ~/.ansible.cfg 文件,确保设置保管库密码:
    vault password_file = /path/to/password_file
    保管库密码文件包含纯文本格式的密码,仅当云模板或部署提供在 ACM 和节点之间使用的用户名和密码组合时,才会使用该密码,如以下示例中所示。
    echo 'myStr0ng9@88w0rd' > ~/.ansible_vault_password.txt
    echo 'ANSIBLE_VAULT_PASSWORD_FILE=~/.ansible_vault_password.txt' > ~/.profile        # Instead of this way, you can also set it setting 'vault_password_file=~/.ansible_vault_password.txt' in either /etc/ansible/ansible.cfg or ~/.ansible.cfg
  • 为避免在尝试运行 playbook 时出现主机密钥故障,建议您在 /etc/ansible/ansible config 中包含以下设置。
    [paramiko_connection]
    record_host_keys = False
     
    [ssh_connection]
    #ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
    ssh_args = -o UserKnownHostsFile=/dev/null                  # If you already have any options set for ssh_args, just add the additional option shown here at the end.

过程

  1. 选择基础架构 > 连接 > 集成,然后单击添加集成
  2. 单击“Ansible”。
    此时将显示 Ansible 配置页面。
  3. 输入 Ansible 开源实例的主机名、清单文件路径和其他必填信息。
  4. 如果需要云代理,请单击新建云代理,然后输入必填信息。通常,只有在使用 vSphere 时,才需要云代理。请参见在 Cloud Assembly 中将云代理添加到 vCenter Server
  5. 单击验证以检查集成。
  6. 单击添加

结果

Ansible 可与云模板一同使用。

下一步做什么

将 Ansible 组件添加到所需云模板。

  1. 在云模板画布页面上,选择云模板选项菜单上“配置管理”标题下的“Ansible”,然后将 Ansible 组件拖动到画布。
  2. 使用右侧面板配置适当的 Ansible 属性,例如,指定要运行的 playbook。

在 Ansible 中,用户可以为单个主机分配一个变量,然后在 playbook 中使用该变量。通过 Ansible 开源集成,可以在云模板中指定这些主机变量。hostVariables 属性必须采用正确的 YAML 格式(Ansible 控制计算机要求采用此格式),且此内容将放置在以下位置:

parent_directory_of_inventory_file/host_vars/host_ip_address/vra_user_host_vars.yml

Ansible 清单文件的默认位置在 Cloud Assembly 的“集成”页面中添加的 Ansible 帐户中进行定义。Ansible 集成不会在云模板中验证 hostVariable YAML 语法,但如果在格式或语法错误的情况下运行 playbook,Ansible 控制计算机将出现错误。

以下云模板 YAML 代码段显示了 hostVariables 属性的示例用法。

Cloud_Ansible_1:
    type: Cloud.Ansible
    properties:
      host: '${resource.AnsibleLinuxVM.*}'
      osType: linux
      account: ansible-CAVA
      username: ${input.username}
      password: ${input.password}
      maxConnectionRetries: 20
      groups:
        - linux_vms
      playbooks:
        provision:
          - /root/ansible-playbooks/install_web_server.yml
      hostVariables: |
        message: Hello ${env.requestedBy}
        project: ${env.projectName}
Ansible 集成要求使用以下方法之一在云模板中显示身份验证凭据:
  • Ansible 资源中的用户名和密码。
  • Ansible 资源中的用户名和 privateKeyFile。
  • Ansible 资源中的用户名和计算资源中的 privatekey,方法是将 remoteAccess 指定为 generatedPublicPrivateKey

创建 Ansible 开源集成时,必须提供登录信息,以便集成用户使用 SSH 连接到 Ansible 控制计算机。要在集成中运行 Playbook,可以在集成 YAML 代码中指定其他用户。username 属性是必需项,需要该属性才能连接到 Ansible 将在其中进行更改的虚拟机。playbookRunUsername 属性是可选项,可以提供该属性以在 Ansible 节点上执行 Playbook。playbookRunUsername 的默认值为 Ansible 端点集成用户名。

如果指定其他用户,该用户应具有对 Ansible 主机文件的写入访问权限,并且应有权创建私钥文件。

将 Ansible 开源图标添加到云模板时,vRealize Automation Cloud 会为连接的虚拟机创建主机条目。默认情况下,vRealize Automation Cloud 将使用虚拟机的资源名称创建主机条目,但可以使用蓝图 YAML 中的 hostName 属性指定任何名称。为了与计算机进行通信,vRealize Automation Cloud 将为主机条目创建 ansible_host: IP Address 变量。可以覆盖默认行为,使用 FQDN 配置通信,具体方法为在 hostVariables 下指定关键字 ansible_host,并提供 FQDN 作为其值。以下 YAML 代码片段显示了如何配置主机名和 FQDN 通信的示例:

Cloud_Ansible:
  type: Cloud Ansible
  properties:
    osType: linux
    username: ubuntu
    groups:
       - sample
    hostName: resource name
    host: name of host
    account: name of account
    hostVariables:
       ansible_host:Host FQDN
			

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

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

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

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

在云模板中,确保在集成帐户中指定的用户可以访问 Ansible Playbook 的路径。可以使用绝对路径指定 Playbook 位置,但这不是必需操作。建议使用用户主文件夹的绝对路径,这样,即使 Ansible 集成凭据随时间发生更改,路径仍保持有效。