Answers:
您可以使用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
这些端口。
ansible.cfg
。我们ignore_errors: yes
在这里使用,以便所有错误都标记为红色,但不会停止执行。
打开的端口报告为ok
输出中的项目,关闭的端口报告为failed
(您必须使用-vv
flag on ansible-playbook
才能看到此输出)。
如果要为成功和失败案例提供更具体的输出,则代码必须更复杂,并添加第二个任务:
wait_for
任务必须register
是变量debug
根据成功/失败条件(例如,使用Jinja2 条件表达式)产生输出with_items
循环),并编写一个主要的剧本任务,该任务使用include
... with_items
来每个端口调用一次包含文件。host: x
不是必需的。我刚刚使用Ansible 2.3.1进行了重新测试host
,wait_for
任务的属性默认为正在从清单处理的当前服务器。
hosts
属性更新了答案。
您可以使用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
我们使用工具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
host: mywebserver.com
。