我有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
每个端口调用一次包含文件。#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
进行测试
评论
重要的是,他们需要设置主机: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