Ansible如何在清单上迭代时将寄存器的输出存储在列表中

时间:2018-12-20 06:15:45

标签: ansible ansible-2.x ansible-inventory ansible-facts ansible-template

我正在运行一个shell命令,此命令将对清单文件中列出的所有主机运行。然后,当我为调试消息检索这些值时,我使用寄存器来定义变量,我看到清单中为所有IP打印的所有主机的寄存器变量,但我想将它们存储在列表中,以便可以在模板中使用它们。我们如何实现呢?

- name: Command
    shell: hostname -f
    register: fqdn_name

1 个答案:

答案 0 :(得分:0)

对于您的特定问题,您要做的工作超出了您的需要。每次Ansible与主机发生冲突时,Ansible都会收集有关主机的一系列“事实”,并将它们存储在您的播放过程中可用的词典中。因此,将您现有的Command任务替换为以下内容,以了解我的意思:

- name: Display the Ansible FQDN fact
  debug:
    var: ansible_fqdn

运行ansible -m setup <hostname taken from inventory file>将向您显示所有收集的变量。

所有主机的变量都可以通过名为“ hostvars”的特殊字典使用,因此在模板中可以执行以下操作:

{% for host in groups.all %}
{{ hostvars[host]['ansible_fqdn'] }}
{% endfor %}

您可以将groups.all替换为groups.<some inventory groupname>,以将匹配的主机限制为特定的组。

这里可能的陷阱是,只有Ansible已经针对主机,这些事实才会被收集,因此,更复杂的剧本的一种策略是:

# This play simply connects to all your hosts and gathers facts
- hosts: all
  gather_facts: yes

# Now all subsequent plays have access to facts for all hosts
- hosts: <all or some group>
  tasks: ...