为什么我会"AnsibleUndefinedVariable: 'dict object' has no attribute 'default_ipv4'"



lhost.js2文件内容:

{% for host in groups['all'] %}
{{ hostvars[host]['ansible_facts']['default_ipv4'] }}
{% endfor %}

test.yaml

---
- name: Generate /etc/hosts/ file
hosts: ansible1
tasks:
- name: create /etc/hosts on all hosts
file:
path: /etc/hosts_test
state: touch
- name: all hosts to be added to /etc/hosts
template:
src: lhosts.j2
dest: /etc/hosts_test
                                                                                                                                                                                                                                              

错误:"AnsibleUndefinedVariable:"dict object"没有属性"default_ipv4">

TASK [all hosts to be added to /etc/hosts] *********************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ansible.errors.AnsibleUndefinedVariable: 'dict object' has no attribute 'default_ipv4'
fatal: [ansible1]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'default_ipv4'"}

这是ip rip a对目标ansible1的结果。

[mukesh@ansible1 ~]$ ip r
default via 192.168.122.1 dev enp1s0 proto static metric 100 
192.168.122.0/24 dev enp1s0 proto kernel scope link src 192.168.122.101 metric 100 
[mukesh@ansible1 ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host 
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:0f:0a:e4 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.101/24 brd 192.168.122.255 scope global noprefixroute enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe0f:ae4/64 scope link noprefixroute 
valid_lft forever preferred_lft forever
[mukesh@ansible1 ~]$ 

要解决此问题,您需要首先收集所有节点的所有事实以使其发挥作用。你的hosts.j2(模板)文件应该像这个

{% for host in groups['all'] %}
{{ hostvars[host]['ansible_facts']['default_ipv4']['address'] }} {{ hostvars[host]['ansible_facts']['fqdn'] }} {{ hostvars[host]['ansible_facts']['hostname'] }}
{% endfor %}

并且您将要作为易解析的剧本运行的YAML文件应该看起来像这个

- hosts: all
tasks:[]
- hosts: all
tasks: 
- template:
src: "/root/ansible/hosts.j2"
dest: "/etc/myhosts"

正如您所看到的,YAML代码的前两行将收集下面任务将使用的所有事实。并确保所有节点都是活动的,并且ansible ping应该为所有节点提供pong。

相关内容

最新更新