在Ansible中实现检查开放端口的其他选项

99次阅读
没有评论

问题描述

一名新手想要在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任务,使用includewith_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版本、系统环境和网络设置等因素的影响。在实际操作中,请确保根据你的需求和环境进行适当的调整和测试。

正文完