我正在尝试在 ansible 剧本中迭代主机变量,它似乎对几个主机变量工作得很好,除了我需要的:ansible_host
如果我尝试:
{% for host in groups['all'] %}
server {{ host }} {{ hostvars[host] }}
{% endfor %}
它为每个服务器输出: 服务器server2 {'ansible_verbosity':0,,'...'ansible_check_mode':False,'ansible_run_tags':[u'all'],'ansible_skip_tags':[],u'ansible_host':u'10.192.11.17', 'ansible_version':{'主要':2,'完整':'2.9.11','字符串':'2.9.11','次要':9,'修订':11}}
其中包含所有变量。
现在如果我尝试
{% for host in groups['all'] %}
server {{ host }} {{ hostvars[host]['verbosity'] }}
{% endfor %}
它会让我得到 ansible_verbosity 就好了。但我找不到获取 ansible_host 的方法
{% for host in groups['all'] %}
server {{ host }} {{ hostvars[host]['ansible_host'] }}
{% endfor %}
我认为这个问题可能与 ansible_host 是一个 unicode var ( u'ansible_host' ) 有关。我这么说是因为其他 2 个 unicode 变量因同样的问题而失败,而其他所有变量都工作得很好。
知道如何获得该变量吗?
问:“hostvars 无法获取 ansible_host”
A:如果未明确声明,ansible_host不会包含在hostvars中。 ansible_host 是一个连接变量。例如,它用作 ssh 连接插件 的参数(参见
ansible-doc -t connection ssh
)。如果 inventory_hostname 未解析,则需要它。很可能没有为任何主机显式设置 ansible_host。这就是导致问题的原因。如果未显式声明 ansible_host,则其值设置为 inventory_hostname。
例如,
shell > grep test_11 hosts
test_11
- hosts: test_11
tasks:
- debug:
var: hostvars[inventory_hostname]['ansible_host']
- debug:
var: ansible_host
给予
TASK [debug] *************************************************************
ok: [test_11] =>
hostvars[inventory_hostname]['ansible_host']: VARIABLE IS NOT DEFINED!
TASK [debug] *************************************************************
ok: [test_11] =>
ansible_host: test_11
如果您声明
ansible_host
,例如在库存中
shell > grep test_11 hosts
test_11 ansible_host=10.1.0.61
同一个剧本给出了
TASK [debug] *************************************************************
ok: [test_11] =>
hostvars[inventory_hostname]['ansible_host']: 10.1.0.61
TASK [debug] *************************************************************
ok: [test_11] =>
ansible_host: 10.1.0.61
ansible_host:要使用的目标主机的 IP/名称,而不是 inventory_hostname。
问题的快速解决方案可能是默认为
inventory_hostname
,假设 ansible_host
是不必要的,这意味着 inventory_hostname
可以解决。例如,
{% for host in groups['all'] %}
server {{ host }} {{ hostvars[host]['ansible_host'] | default(host) }}
{% endfor %}