我有一个剧本,有一组角色。最里面的角色有一个委派的任务,试图评估一个变量。并且在几层上遇到了未定义的问题。
角色:
deploy_app1
,可以与 play 和主机变量一起使用来部署此应用程序。deploy_service
- 为应用设置负载平衡和 IP 地址。其他应用可能会使用此角色。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 主机为例。还有其他变量。
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 能够引用这些变量?