我有一个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 }}
答案 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不收集任何事实的结果!