我需要编写一个Ansible脚本,该脚本遍历整个清单的所有可用IPv4 / 6地址,以创建包含所有“我的”地址的防火墙脚本。
我尝试的是:
foreach ($dest in 'there2','there3') { cp there $dest }
并运行例如ansible-playbook site.yml --limit = server1,结果中仅打印一个条目,而不是全部打印
{% for hostname in groups['all'] %}
{% if hostvars[hostname]['ansible_default_ipv4']['address'] is defined %}
iptables ... {{ hostvars[hostname]['ansible_default_ipv4']['address'] }}
{% endif %}
{% if hostvars[hostname]['ansible_default_ipv6']['address'] is defined %}
ip6tables ... {{ hostvars[hostname]['ansible_default_ipv6']['address'] }}
{% endif %}
{% endfor %}
当我用一个组(不是全部)运行一个剧本时,它只包含该组的IP,但不包含“全部”,这对我来说更有意义,因为有foreach组[all]。
结果是通过任务生成的
iptables ... a.b.c.d
ip6tables .... c:d:e:f::1
我知道- name: Configure Firewall
template: src={{item.src}} dest={{item.dest}} owner={{item.owner}} group={{item.group}} mode={{item.mode}}
with_items:
- { src: "init.sh.j2", dest: "/etc/firewall/init.sh", owner: 'root', group: 'root', mode: '0750' }
是可靠的,但是它只是每个主机的一个IP,如果完全双栈IPv4 / 6是不可接受的,因为将配置两个地址中的一个。 / p>
还有另一种方法可以从所有主机获取事实吗?