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

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

我个人可以登录并运行:

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


..依此类推..

可以在Ansible中使用什么模块或插件,所以我可以自动执行此操作,并将结果(无论是打开还是关闭的端口)报告回我的Ansible服务器?

#1 楼

您可以使用Ansible wait_for模块来检查特定的TCP端口是否打开。
由于在这种情况下,所有端口都应该已经打开,因此我们可以使用最小号。重试次数,足以覆盖网络问题:
- name: Check all port numbers are accessible from the 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每秒检查一次(可使用sleep属性在Ansible 2.3中配置),因此每个端口将检查3次。 />在包含400多个主机的清单中,在剧本中运行此命令-Ansible将并行检查所有主机都可以在这些端口上达到mywebserver.com

并行性取决于ansible.cfg中的forks设置。

我们在这里使用ignore_errors: yes,以便将任何错误标记为红色,但不会停止执行。
输出中的开放端口报告为ok,封闭端口报告为failed(必须使用-vv上的ansible-playbook标志以查看此输出)。
微调输出
如果要为成功和失败情况提供更具体的输出,则代码必须更复杂,并添加第二项任务:


wait_for任务必须register一个变量
第二个任务使用基于su的debug产生输出事故/故障情况(例如使用Jinja2条件表达式)
,那么您需要将这两个任务都放在一个包含文件中(没有任何with_items循环),并编写一个主要的剧本任务,该任务使用include ... with_items每个端口调用一次包含文件。


评论


重要的是,他们需要设置主机:mywebserver.com。

–熊佳亚诺夫
17年8月5日在18:18

@XiongChiamiov-主持人:不需要x。我刚刚使用Ansible 2.3.1重新测试,并且wait_for任务的host属性默认为正在从清单处理的当前服务器。

– RichVel
17年8月6日在9:02

恰恰是,这就是OP需要覆盖它的原因:他们正在测试从所有服务器到另一个Web服务器的连接性(重新阅读问题)。

–熊佳亚诺夫
17年8月6日在15:18

好点,已使用“主机”属性更新了答案。

– RichVel
17年8月7日在6:47

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

– AWhitaker
17年8月7日在17:29

#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]


评论


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

– AWhitaker
17年8月7日在17:30

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

–lonix
19年8月27日在7:15

@Ionix根据manpages.ubuntu.com/manpages/precise/en/man1/…,它是源路由指针

– windyzboy
20-10-16在4:46

#3 楼

您可以对文档中引用的示例使用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网络上的所有站点都允许相同的减价,有关格式的文档位于此处

–滕西拜
18年7月17日在11:06

顺便说一句,我也无法看到此答案添加的内容已不在RichVel答案中

–滕西拜
18年7月17日在11:07

#4 楼

我们使用工具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
进行测试