ansible jinja 模板主机变量无法获取 ansible_host

问题描述 投票:0回答:1

我正在尝试在 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 变量因同样的问题而失败,而其他所有变量都工作得很好。

知道如何获得该变量吗?

ansible jinja2
1个回答
4
投票

问: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 %}
© www.soinside.com 2019 - 2024. All rights reserved.