当将ventory_host作为变量插入时,无法访问hostvars

时间:2018-12-02 23:27:04

标签: ansible ansible-facts

我有一个jinja2模板,并且试图遍历主机组,然后在模板中插入所有主机的ipv4地址。但是,尽管这样做的方式是每篇文章和文章都建议应该这样做的方式,但我却遇到了错误。

这是产生错误的模板:

{% if groups['linux-hosts'] %}
{% for item in groups['linux-hosts'] %}
define host {
    use                     generic-host-normal
    host_name               {{ item }}
    alias                   {{ item }}
    address                 {{ hostvars[item].ansible_default_ipv4.address }}
}
{% endfor %}
{% endif %}

我得到的错误是:

  

失败:[服务器](item = servers.cfg)=> {“已更改”:false,“项目”:“ servers.cfg”,“ msg”:“ AnsibleUndefinedVariable:'ansible.vars.hostvars.HostVarsVars对象'没有属性'ansible_default_ipv4'“}

如果我不在方括号中使用变量“ item”,而是从清单中指定特定主机,则Ansible能够获取ipv4地址。示例(“服务器”是我的清单中主机的名称):

{{ hostvars['server'].ansible_default_ipv4.address }}

4 个答案:

答案 0 :(得分:2)

我用类似的用例遇到了这个问题。原来我的问题是,我把主机归入了一个不是游戏目标的组。因此,收集事实并未针对该组中的所有主机。我通过针对所有需要的主机运行安装程序来解决此问题

if (count($trip_months) == 12):
    $trip_months = 'ALL YEAR';
elseif (count($trip_months) > 0):
    $temp_text = '';
    $first_month = '';
    $last_month = '';
    $previous_month = '';
    $next_month = '';
    $separator = '';
    $months = ['jan' => '', 'feb' => '', 'mar' => '', 'apr' => '', 'may' => '', 'june' => '', 'july' => '', 'aug' => '', 'sept' => '', 'oct' => '', 'nov' => '', 'dec' => ''];

    foreach ($trip_months as $trip_month):
        if ($trip_month != 'jan') $previous_month = $months[$trip_month];
        if ($trip_month != 'dec') $next_month = $months[$trip_month];

        if ($first_month == '') {
            $first_month = $trip_month;
            $last_month = $trip_month;
        } else {

        }
    endforeach;
    $trip_months = $temp_text;
endif;

注意:kube-master是k8s-cluster的子集

答案 1 :(得分:0)

这是因为您错过了剧本中的gather_facts: yes或等效的- setup:任务;除非要求,否则这些事实不会神奇地出现,默认情况下会发生,但是可以肯定地可以通过gather_facts: no

关闭

一个简单的测试将显示我的意思:

- hosts: all
  gather_facts: yes
  tasks:
  - debug: var=ansible_default_ipv4 verbosity=0

然后更改gather_facts: no并观察kaboom

答案 2 :(得分:0)

这里描述的解决方案对我有用。

在剧本顶部添加一个空白剧本,以收集所有主机的事实。 Ansible hostvars has no attribute 'ansible_nodename'

答案 3 :(得分:0)

我有同样的问题。

对我来说,问题在于我用--tags标志运行了剧本。
这导致Ansible不收集任何事实的结果!