2014-10-08 55 views
2

在部署期间需要设置ufw防火墙规则:启用对来自库存的主机组servers的访问。目标主机是anazon ec2实例,但可能放置在其他提供者处。如何知道负责客户端的外部IP地址

我想:

- name: Ufw rules 
    ufw: rule=allow from_ip={{ hostvars[item]['ansible_eth0']['ipv4']['address'] }} 
    with_items: groups['servers'] 
    notify: 
    - Restart ufw 

文件hosts

.. 
[servers] 
server1.site.com 
server2.site.com 
server3.site.com 
.. 

但主机server1.site.com,居然有host_vars:

"ansible_eth0": { 
    "active": true, 
    "device": "eth0", 
    "ipv4": { 
     "address": "10.x.x.x", 
     ... 

ip地址10.xxx,据我所知,是内部的亚马逊网络ip地址。

如果从外部EC2执行ping server1.site.com,我得到:

64 bytes from server1.site.com (46.x.x.x): icmp_seq=1 ttl=56 time=49.5 ms 
... 

执行ansible server1.site.com -m setup -i hosts | grep 46.x.x.x一无所获。

如何使用ansible从库存组中知道主机的外部ip地址? 或者如何使用库存中的主机名称设置ufw防火墙?

回答

2

我认为你最好的选择是使用@dsedivec(https://github.com/dsedivec/ansible-plugins)编写的lookup插件。

在您的手册的顶部目录中创建一个lookup_plugins/目录。 把dns.py

curl https://raw.githubusercontent.com/dsedivec/ansible-plugins/master/lookup_plugins/dns.py > lookup_plugins/dns.py 

并使用它像这样:

- name: Ufw rules 
    ufw: rule=allow from_ip={{ lookup('dns', item) }} 
    with_items: groups['servers'] 
    notify: 
    - Restart ufw 

祝你好运!

1

最简单的方法是添加连接:本地

--- 
- name: get my public IP 
    ipify_facts: api_url=http://api.ipify.org 
    connection: local 

- firewalld: rich_rule='rule family=ipv4 source address={{ ipify_public_ip }} accept' permanent=no state=enabled timeout=300 
    become: true