【问题标题】:ansible jinja template hostvars can not get ansible_hostansible jinja 模板 hostvars 无法获取 ansible_host
【发布时间】:2021-01-26 22:55:51
【问题描述】:

我正在尝试在 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': {'major': 2, 'full': '2.9.11', 'string': '2.9.11', 'minor': 9, 'revision': 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 vars 因同样的问题而失败,而其他所有的 unicode vars 都可以正常工作。

知道如何获取该变量吗?

【问题讨论】:

  • 用例是什么? ansible_host 应始终包含在 hostvars 中是否有任何实际原因?
  • 我被告知这些服务器不能在 DNS 上有条目。不是我的电话。

标签: ansible jinja2


【解决方案1】:

问:hostvars 无法获取 ansible_host

答:ansible_host 不包含在 hostvars 中,如果它没有明确声明的话。 ansible_hostConnection variable。例如,它用作ssh connection plugin 的参数(参见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。


如果不需要ansible_host,即inventory_hostname 可以解决,则该问题的快速解决方案可能默认为inventory_hostname。例如

{% for host in groups['all'] %}
  server {{ host }} {{ hostvars[host]['ansible_host']|default(host) }}
{% endfor %}

【讨论】:

  • 谢谢。你是对的。其中一台主机没有定义其 ansible_host。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多