如何知道ansible客户端的外部ip地址

时间:2014-10-08 09:02:57

标签: amazon-ec2 ansible

在部署期间需要设置ufw防火墙规则:从库存中启用主机组servers的访问权限。目标主机是anazon ec2实例,但它可能放在其他提供商处。

我试过了:

- 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.x.x.x是内部亚马逊网络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 个答案:

答案 0 :(得分:2)

我认为最好的办法是使用@dsedivec(https://github.com/dsedivec/ansible-plugins)编写的查找插件。

在您的剧本的顶层目录中创建一个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 :(得分:1)

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

---
 - 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