我想使用 Ansible 在许多远程 Ubuntu 18.04 机器上管理 UFW 防火墙规则。如果防火墙规则的更改阻止我通过 SSH 重新连接到机器,这将很难修复(赶紧去数据中心,一一输入复杂的 root 密码,手动编辑防火墙配置)。有没有办法测试防火墙规则更改不会阻止我在应用更改之前重新连接?
或者,如果应用了防火墙规则并且我被锁定了,有没有办法自动恢复它们?(我可以自己备份并设置一个 cron 作业来恢复它,然后再次连接并删除该 cron 作业,但也许这样的东西已经存在?)
我想使用 Ansible 在许多远程 Ubuntu 18.04 机器上管理 UFW 防火墙规则。如果防火墙规则的更改阻止我通过 SSH 重新连接到机器,这将很难修复(赶紧去数据中心,一一输入复杂的 root 密码,手动编辑防火墙配置)。有没有办法测试防火墙规则更改不会阻止我在应用更改之前重新连接?
或者,如果应用了防火墙规则并且我被锁定了,有没有办法自动恢复它们?(我可以自己备份并设置一个 cron 作业来恢复它,然后再次连接并删除该 cron 作业,但也许这样的东西已经存在?)
未内置在 ufw 模块中。您所做的更改将在下次重新启动或防火墙重新加载时强制执行。
您可以做的是重新加载防火墙,然后测试与 SSH 端口的新连接。如果失败,请通过仍然打开的持久连接重置 ufw。
我有一个无聊的实现,称为 ansible -role-ufw。特别注意使用
wait_for
, 因为wait_for_connection
将使用持久连接而不检测故障。请注意,这只有一招。当 SSH 损坏时,您仍然需要远程控制台访问。
手动应用规则,而不保存它们,但在此之前,请在几分钟后安排重新启动或重置当前规则。所以,如果新规则会造成任何伤害,那只会是那几分钟。
这就是我最终得到的结果,扩展了John Mahowald的代码:
角色/set_firewall_rules/tasks/main.yml
角色/set_firewall_rules/meta/main.yml
角色/target_ssh_info/tasks/main.yml
请注意,
ssh -G
即使它们没有在 .ssh/config 中被覆盖,它也会返回主机名和端口,即ssh -G arbitrarystring
只返回“arbitrarystring”作为主机名和 22 作为端口。