Ansible - 如何在任务实际失败时将其标记为成功

Ansible - 如何在任务实际失败时将其标记为成功

我们正在使用一些管道来使用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

对于如此重要​​的检查,用恶意的失败消息来责怪用户可能是合适的。

相关内容