ansible渲染template时出错unicode object' has no attribute 'ansible_

最近在看《奔跑吧,ansible》,在第四章fact与变量遇到一个问题。
直接使用debug能获取到变量ansible_ens33.ipv4.address,但是按照书中的用法,在template中调用时,有如下报错,意思是,没有这个属性,还是说书中的用法有问题?{{ host_dr.ansible_ens33.ipv4.address }}

clipboard.png

hosts

[nat_director]
192.168.101.221

[nat_realserver]
rs1 ansible_ssh_host=192.168.101.222
rs2 ansible_ssh_host=192.168.101.223

playbook.yml

- name: Configure Nat Direcorty
  hosts: nat_director nat_realserver
  vars:
  tasks:
  - name: template ipvsadm conf
    template: 
      src: templates/ipvsadm.j2
      dest: /root/haha
    when: group_names[0] == "nat_director"
  - debug: var=groups.nat_director
  # - debug: var=ansible_ens33.ipv4.address

templates/ipvsadm.j2

{% for host_dr in groups.nat_director %}
-A -t {{ host_dr.ansible_ens33.ipv4.address }}:80 -s rr
{% for host_rs in groups.nat_realserver %}
-a -t {{ host_dr.ansible_ens33.ipv4.address }}:80 -r {{ host_rs.ansible_ens33.ipv4.address }}:80 -m -w 1
{% endfor %}
{% endfor %}
阅读 4.8k
1 个回答

经过验证,书上的例子确实有点问题,应该使用hostvars进行加工

{% for host_dr in groups.nat_director %}
-A -t {{ hostvars[host_dr].ansible_ens33.ipv4.address }}:80 -s rr
    {% for host_rs in groups.nat_realserver %}
-a -t {{ hostvars[host_dr].ansible_ens33.ipv4.address }}:80 -r {{ hostvars[host_rs].ansible_ens33.ipv4.address }}:80 -m -w 1
    {% endfor %}
{% endfor %}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进