Ansible 无法在 delegate_to

时间:2021-04-21 09:31:20

标签: ansible

我有一个剧本,有一组角色。最里面的角色有一个委派的任务,试图评估一个变量。并且在几层上遇到了未定义的问题。

角色:

  • 我有一个特定于应用程序的角色 deploy_app1,可以与 play 和主机变量一起使用来部署此应用程序。
  • 应用特定角色使用服务角色 deploy_service - 为应用设置负载平衡和 IP 地址。其他应用可能会使用此角色。
  • 负载平衡/服务角色使用 DNS 角色 dns_records,在需要它们的系统中创建 DNS 条目。

所以调用堆栈将是 Playbook->deploy_app1->deploy_service->dns_records

DNS 角色有一个怪癖,它需要与 WinRM 交互。所以它有delegate_to 的任务。我必须从该系统的主机变量设置连接变量,例如: ansible_connection: "{{ hostvars[dns_records_winrm_host]['ansible_connection'] }}"

库存设置为:

  • host_app1_dev 运行应用部署。它有一个变量来说明哪个 winrm 主机将执行部署。 app1_dns_winrm_host,以及所有 DNS 专家。
  • Winrm 主机能够执行 AD DNS 任务。它有一个包含 winrm 和 credssp 连接变量的主机文件。

在角色中,变量被包裹在堆栈中。我以 winrm 主机为例。还有其他变量。

  • app1 获取由 host_app1_dev 中的变量设置的变量。然后将这些信息传递给子角色。
  • deploy_service 角色比 app1 更通用,适用于许多应用。因此,当包含在内时,它会获得一个名为 deploy_service_dns_winrm_host: "{{app1_dns_winrm_host}}" 的变量。
  • dns_records 角色不仅供服务使用,还提供了需要创建的记录的详细信息(多个系统、多个记录层)。这也需要知道winrm_host。因此,当服务包含它时,它的变量包括:dns_records_winrm_host: "{{ deploy_service_dns_winrm_host }}"

dns_records 角色中,它被引用:

- name: Debug that we connected to winrm host
  delegate_to: "{{dns_records_winrm_host}}"
  vars:
      ansible_connection: "{{ hostvars[dns_records_winrm_host]['ansible_connection'] }}"
      .
      .
  debug: 
    msg: This role ran remotely.

所以当我运行它时,我希望调试输出它远程运行。类似的东西:

TASK [dns_records : Debug that we connected to winrm host] ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [app1_play] => {
    "msg": "This ran remotely"
}

实际发生的事情是这样的:

TASK [dns_records : Debug that we connected to winrm host]] *****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
fatal: [app1_play]: FAILED! => {"msg": "{{ deploy_service_dns_winrm_host }}: {{ app1_dns_winrm_host }}: 'app1_dns_winrm_host' is undefined"}

我在这里错过了什么?我怎样才能让这个 delegate_to 能够引用这些变量?

0 个答案:

没有答案