Ansible:其他选项可用于打开端口的telnet检查?


15

我是Ansible的新手。这是我的任务...

我有400多台主机,我需要验证从它们的一端到我们的Web服务器是否打开了5个不同的端口。

我可以单独登录并运行:

telnet mywebserver.com 443
telnet mywebserver.com 80
telnet mywebserver.com 8443

..等等..

可以在Ansible中使用什么模块或插件,以便使它自动化,并让其将结果(无论是打开还是关闭的端口)报告回我的Ansible服务器?

Answers:


28

您可以使用Ansible wait_for模块来检查特定的TCP端口是否打开。

因为在这种情况下,所有端口都应该已经打开,所以我们可以使用最小号。重试次数,足以覆盖网络问题:

- name: Check all port numbers are accessible from current host
  wait_for:
    host: mywebserver.com
    port: "{{ item }}"
    state: started         # Port should be open
    delay: 0               # No wait before first check (sec)
    timeout: 3             # Stop checking after timeout (sec)
  ignore_errors: yes
  with_items:
    - 443
    - 80
    - 80443

默认情况下,Ansible每秒检查一次(可在Ansible 2.3中使用该sleep属性进行配置),因此每个端口将检查3次。

在包含400多个主机的清单中,在剧本中运行该脚本-Ansible会并行检查所有主机都可以到达mywebserver.com这些端口。

我们ignore_errors: yes在这里使用,以便所有错误都标记为红色,但不会停止执行。

打开的端口报告为ok输出中的项目,关闭的端口报告为failed(您必须使用-vvflag on ansible-playbook才能看到此输出)。

微调输出

如果要为成功和失败案例提供更具体的输出,则代码必须更复杂,并添加第二个任务:

  • wait_for任务必须register是变量
  • 第二个任务debug根据成功/失败条件(例如,使用Jinja2 条件表达式)产生输出
  • 那么您需要将这两个任务都放入一个包含文件中(没有任何with_items循环),并编写一个主要的剧本任务,该任务使用include... with_items来每个端口调用一次包含文件。

重要的是,他们需要设置host: mywebserver.com
莫妮卡·塞利奥(Monica Cellio)的抵制SE,

@XiongChiamiov- host: x不是必需的。我刚刚使用Ansible 2.3.1进行了重新测试hostwait_for任务的属性默认为正在从清单处理的当前服务器。
RichVel

恰恰是,这就是OP需要覆盖它的原因:他们正在测试从所有服务器到另一个Web服务器的连接性(重新阅读问题)。
莫妮卡·切里奥(Monica Cellio)的抵制SE,

2
好点,用hosts属性更新了答案。
RichVel

谢谢!这对我有效,并且给了我足够的工作空间。
AWhitaker

2

AFAIK没有为此目的内置的模块,但是您可以使用shell+ nc

---
- hosts: all
  tasks:
    - shell: nc -z -w 1 -G 1 my.hostname.com {{ item }} || echo "Port {{ item }} is closed"
      with_items: [80,443,8443]

2
谢谢,这也可行,但是我选择了第一个建议,因为它可以让我进一步自定义剧本。
AWhitaker

什么是-G 1在手册页我找不到它?
lonix

0

您可以使用wait_for模块

文档中引用的示例:

- name: Wait 300 seconds for port 8000 of any IP to close active connections, don't start checking for 10 seconds
  wait_for:
    host: 0.0.0.0
    port: 8000
    delay: 10
    state: drained

请尝试正确格式化您的帖子,StackExchange网络上的所有站点都允许相同的减价,有关格式化的文档位于此处
Tensibai

3
顺便说一句,我也无法看到这个答案添加的内容已经不在RichVel答案中了
Tensibai '18

0

我们使用工具dda-serverspec(https://github.com/DomainDrivenArchitecture/dda-serverspec-crate)完成此类任务。您可以定义您的期望

{:netcat [{:host "mywebserver.com" :port "443"} {:host "telnet mywebserver.com" :port "80"} {:host "telnet mywebserver.com" :port "8443"}]}

并针对localhost或ssh远程测试这些期望。对于远程测试,您必须定义一个目标:

{:existing [{:node-name "test-vm1"
:node-ip "35.157.19.218"}
{:node-name "test-vm2" :node-ip "18.194.113.138"}] :provisioning-user {:login "ubuntu"}}

您可以通过以下方式进行测试 java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.