我正在使用Ansible和ufw
在我的服务器上设置防火墙。作为ufw
规则的一部分,我想允许来自Ansible控制机器的SSH,但不允许来自其他任何地方。我的问题是 - 获取控制机器本身IP地址的最佳方法是什么,以便我可以将其纳入规则?
我知道我可以使用facts获取我正在运行Playbook的机器的IP地址,但是我没有看到任何简单的方法来自动为正在运行的机器获取它ansible。
如果可能的话,我想避免添加一个新的变量来表示它,因为如果它可以自动发现它会很好,但如果这是唯一已知的最佳方法,那么我就会这样做。
编辑:我发现this duplicate question与我的相同,但是它也没有答案,所以请稍等一下。
答案 0 :(得分:6)
{{ ansible_env['SSH_CLIENT'].split() | first }}
有效,但你必须从默认用户收集关于连接变量的事实,所以eighter:
如果您使用«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"在以下情况下,不同答案中描述的方法应该有效:
如果不满足上述任一条件(即,如果您的控制主机有多个接口和/或您的控制主机以及您的远程主机都在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 }}