我们正在使用一些管道来使用ansible构建服务器,其中一项任务是检查服务器是否在线(意味着生产服务器意外出现在库存列表中)。我们检查端口 443 并中断构建管道;这是为了确保生产或活动服务器不会被意外触及。我们尝试了下面的代码 - 目的是在端口 443 关闭时使 playbook“成功”;以便构建管道中的下一个任务可以继续进行。
- name: check server online or not
hosts: localhost
connection: local
tasks:
- name: check ESXI host connection to port 443
wait_for: host=ams-server-101 port=443 timeout=1
register: command_result
failed_when: "'Timeout' not in command_result"
- debug: var=command_result
但这并没有按预期工作。因此,我们使用了如下的解决方法(非 ansible 方式)。
shell: echo "QUIT" | nc -w 3 ams-server-101 443 > /dev/null 2>&1 && echo Pass || echo Fail
register: shell_result
failed_when: shell_result.stdout == "Pass"
任何想法 ? (也许要使用一些不同的模块)
答案1
您可以使用该fail
模块:
tasks:
- wait_for:
host: ams-server-101
port: 443
timeout: 1
register: https_port_check
ignore_errors: true
- fail:
msg: 'HTTPS port is open'
when: not https_port_check.failed
或者像帕特里克(Patrick)建议的那样非常好且简短,但没有自定义失败消息:
tasks:
- wait_for:
host: ams-server-101
port: 443
timeout: 1
register: https_port_check
failed_when: not https_port_check.failed
对于如此重要的检查,用恶意的失败消息来责怪用户可能是合适的。