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