获取Ansible控制计算机IP地址的最佳方法

时间:2016-01-01 22:20:31

标签: ansible ansible-facts

我正在使用Ansible和ufw在我的服务器上设置防火墙。作为ufw规则的一部分,我想允许来自Ansible控制机器的SSH,但不允许来自其他任何地方。我的问题是 - 获取控制机器本身IP地址的最佳方法是什么,以便我可以将其纳入规则?

我知道我可以使用facts获取我正在运行Playbook的机器的IP地址,但是我没有看到任何简单的方法来自动为正在运行的机器获取它ansible。

如果可能的话,我想避免添加一个新的变量来表示它,因为如果它可以自动发现它会很好,但如果这是唯一已知的最佳方法,那么我就会这样做。

编辑:我发现this duplicate question与我的相同,但是它也没有答案,所以请稍等一下。

6 个答案:

答案 0 :(得分:6)

{{ ansible_env['SSH_CLIENT'].split() | first }}

有效,但你必须从默认用户收集关于连接变量的事实,所以eighter:

  • 在剧本级别设置«gather_facts:yes»和«成为:是»
  • 更可靠:运行«setup»任务(没有«成为:是»,在此之前«ansible_env»使用 - 更好的«pre_tasks»部分)。

如果您使用«into»运行«gather / setup»,您将在以后获得«一个或多个未定义的变量:'dict object'没有属性'SSH_CLIENT'»(这是因为suseted«setup»只能捕获一组变量)。

答案 1 :(得分:2)

easiset方法是添加本地连接

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

答案 2 :(得分:1)

我刚刚破解了这个解决方案,但它确实有效。这是你要找的东西吗?

- debug var="{{hostvars[inventory_hostname]['ansible_env']['SSH_CLIENT'].split(' ')[0]}}"

答案 3 :(得分:1)

" ipify_facts"在以下情况下,不同答案中描述的方法应该有效:

  1. 您的控制主机只有一个接口,或者如果它有多个接口,并且用于到达ipify api_url的接口与到达远程主机的接口相同,并且 - 和 -
  2. 您的控制主机具有公共IP(根本不使用NAT),或者您的控制主机位于NAT内,但远程主机位于外部。
  3. 如果不满足上述任一条件(即,如果您的控制主机有多个接口和/或您的控制主机以及您的远程主机都在NAT后面并使用私有地址),那么不同(尽管如此)稍微复杂一点的方法是在Ansible中复制以下内容:

    $ ip route get 203.0.113.4
    203.0.113.4 via 172.26.232.1 dev enp0s3  src 172.26.232.125
                      cache
    $
    

    这将显示用于到达特定目的地的接口和源地址(172.26.232.125)(203.0.113.4)。

    在Ansible中实现这一点的一种方法是:

    ---
    - name: Obtain local IP address
      local_action: shell ip route get {{ inventory_hostname }} | awk '{ for (x=1;x<=NF;x++) if ($x=="src") print $(x+1) }'
      register: local_address
      changed_when: false
    
    - name: Print my local address
      debug: msg="Source address towards {{ inventory_hostname }} is {{ local_address.stdout }}"
    

    输出:

    $ ansible-playbook test.yml  -i inventory.txt
    
    PLAY [test] ********************************************************************
    
    TASK [Obtain local IP address] *************************************************
    ok: [203.0.113.4 -> localhost]
    
    TASK [Print my local address] **************************************************
    ok: [203.0.113.4] => {
        "msg": "Source address towards 203.0.113.4 is 172.26.232.125"
    }
    

    如果您有多个远程主机可通过不同的接口访问,这也应该有效。

    &#34; shell&#34;中的另一个步骤如果您的inventory_hostname是DNS主机名而不是数字IP地址,则需要执行操作。

答案 4 :(得分:0)

{{ ansible_env['SSH_CLIENT'].split()[0] }}

答案 5 :(得分:0)

{{ ansible_env['SSH_CLIENT'].split() | first }}