是否可以使用with_dict模块和ansible-fact?

时间:2017-06-27 13:33:02

标签: ansible ansible-facts ansible-template

我正在尝试编写一个角色来配置keepalived集群。我希望根据目标框的IP将唯一信息传递到模板中。

在这种情况下:服务器A为192.168.1.140,服务器B为192.182.1.141,VIP为192.168.1.142

字典看起来像这样:

---
  192.168.1.140:
    peer: 192.168.1.141
    priority: 110
    vip: 192.168.1.142

  192.1.168.1.141
    peer:192.168.1.140
    priority: 100
    vip: 192.168.1.142

我希望任务看起来像这样:

---
- name: keepalived template
  template:
    src: keepalived.j2
    dest: /etc/keepalived/keepalived.conf
    owner: root
    group: root
    mode: 0644
  with_dict: '{{ ansible_default_ipv4.address }}'

,模板看起来像这样:

}
vrrp_instance VI_1 {
interface    eth0
priority    {{ item.value.priority }}
...
unicast_scr {{ ansible_default_ipv4.address }}
unicast_peer {
     {{ item.value.peer }}
}
virtual_ipaddresses {
     {{ item.value.vip }} }
}

非常感谢任何见解 约翰

1 个答案:

答案 0 :(得分:0)

将您的同行详细信息分组到一些常用字典下:

---
peer_configs:
  192.168.1.140:
    peer: 192.168.1.141
    priority: 110
    vip: 192.168.1.142
  192.1.168.1.141
    peer:192.168.1.140
    priority: 100
    vip: 192.168.1.142

with_...通常用于循环播放,我不需要任何循环,所以请使用:

- name: keepalived template
  template:
    src: keepalived.j2
    dest: /etc/keepalived/keepalived.conf
    owner: root
    group: root
    mode: 0644
  vars:
    peer_config: '{{ peer_configs[ansible_default_ipv4.address] }}'

和模板:

vrrp_instance VI_1 {
interface    eth0
priority    {{ peer_config.priority }}
...
unicast_scr {{ ansible_default_ipv4.address }}
unicast_peer {
     {{ peer_config.peer }}
}
virtual_ipaddresses {
     {{ peer_config.vip }} }
}