问题描述
一名新手想要在Ansible中实现一个任务:他有400多台主机,需要验证这些主机与他们的Web服务器之间的5个不同端口是否开放。他想知道在Ansible中可以使用哪个模块或插件来自动化这个过程,并将结果(开放或关闭的端口)报告回Ansible服务器。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
使用Ansible的wait_for
模块
在这种情况下,可以使用Ansible的wait_for
模块来检查特定的TCP端口是否开放。由于所有端口应该已经开放,我们可以使用最小数量的重试次数,足以覆盖网络问题:
- name: 检查所有端口是否可以从当前主机访问
wait_for:
host: mywebserver.com
port: "{{ item }}"
state: started # 端口应该开放
delay: 0 # 第一次检查前不等待(秒)
timeout: 3 # 超时后停止检查(秒)
ignore_errors: yes
with_items:
- 443
- 80
- 80443
默认情况下,Ansible会每秒钟检查一次(在Ansible 2.3中可以使用sleep
属性进行配置),因此每个端口会检查3次。在你的400多台主机清单中运行这个任务,Ansible会并行检查所有主机是否可以在这些端口上访问mywebserver.com
。
通过ignore_errors: yes
,任何错误都会以红色标记,但不会停止执行。开放的端口会在输出中报告为ok
项,关闭的端口会报告为failed
(你需要在ansible-playbook
上使用-vv
标志来查看这个输出)。
调整输出
如果你希望获得更具体的成功和失败情况输出,代码必须更加复杂,需要添加第二个任务:
wait_for
任务必须注册一个变量。- 第二个任务根据成功/失败条件使用
debug
产生输出(例如,使用Jinja2的条件表达式)。 - 然后,需要将这两个任务放在一个include文件中(没有任何
with_items
循环),并编写一个主要的playbook任务,使用include
…with_items
来调用包含文件,每个端口调用一次。
其他方法
除了上述方法外,还可以使用shell
命令与nc
(netcat)来实现相同的目标:
- hosts: all
tasks:
- shell: nc -z -w 1 -G 1 my.hostname.com {{ item }} || echo "Port {{ item }} is closed"
with_items:
- 80
- 443
- 8443
总结
以上介绍了在Ansible中实现检查开放端口的两种方法:使用wait_for
模块和使用shell
命令与nc
。根据你的需要选择其中一种方法来自动化检查,并获得所需的结果报告。记得根据你的实际情况调整配置和参数。
注意:不同版本的Ansible可能会有一些差异,请根据你的Ansible版本和需要进行适当的调整。
注:
该解决方案旨在提供对问题的解决方案,具体的操作步骤可能会受到Ansible版本、系统环境和网络设置等因素的影响。在实际操作中,请确保根据你的需求和环境进行适当的调整和测试。