Ansible hostvars 没有属性“ansible_nodename”

GMi*_*ael -1 ansible

hostvars[item]['ansible_nodename']我们有几个使用主机item别名的剧本。它通常有效。但有时不行,出现以下错误:

'dict object' has no attribute 'ansible_nodename` 
Run Code Online (Sandbox Code Playgroud)

我打印了内容hostvars,但没有看到这个属性。

我找不到文档来hostvars了解我们可以安全地使用什么ansible_nodename。所以,问题是:

  • 我可以安全地替换ansible_nodename为吗ansible_host
  • hostvars在哪里可以找到其创建内容和算法的描述?

Kon*_*rov 7

但有时不会,给出以下错误...

这可能是因为当时没有及时收集这些主机的事实。

您可能需要添加空游戏来收集剧本最顶部所有主机的事实:

- name: gather facts
  hosts: all

- name: balancer configuration
  hosts: balancer
  tasks:
    - name: generate configs
      template:
        src: conf.j2
        dest: "/conf/{{ hostvars[item]['ansible_nodename'] }}.conf"
      with_hostnames: nodes
Run Code Online (Sandbox Code Playgroud)

如果没有“收集事实”,平衡器的配置任务将因ansible_nodename未收集而失败。