Ansible:模拟“传递时间”模块

时间:2015-01-08 08:28:49

标签: error-handling module ansible

Ansible提供了一个failed_when模块,允许用户在其任务中指定某些失败条件,例如在stdout或stderr中找到某个字符串。

我正在尝试做相反的事情:如果在stdout或stderr中找到任何一组字符串,我希望我的任务失败。换句话说,我喜欢接近passed_when模块功能的东西。

  • 当返回码为0时,我仍然希望它正常传递。
  • 但是如果它会失败(rc!= 0)那么它应该首先检查是否出现了某些字符串。
  • 即。如果找到一些字符串,无论如何都会通过。

我的推理是这样的:

  

这项任务可以有很多原因   失败 - 但其中一些,取决于输出,我不考虑   作为当前背景下的失败。

有人知道如何实现这一目标吗?

2 个答案:

答案 0 :(得分:9)

看看这里:

Is there some Ansible equivalent to "failed_when" for success

- name: ping pong redis
  command: redis-cli ping
  register: command_result
  failed_when: 
    - "'PONG' not in command_result.stderr"
    - "command_result.rc != 0"
    如果返回代码为0并且没有' PONG'
  • 将不会失败在stderr。
  • 如果有" PONG"
  • 将不会失败在stderr。

如果任何列表为False

,则通过

答案 1 :(得分:2)

您原来的问题是这样的(使用布尔逻辑使其更容易):

  

如果在stdout或stderr

中找到一组字符串,则成功执行命令

改写你的逻辑:

如果在stdout或stderr中找不到一组字符串,

会失败。使用这个逻辑,使用failed_when很容易。这是一个片段:

---
- name: Test failed_when as succeed_if
  hosts: localhost
  connection: local
  gather_facts: no

  tasks:
    - name: "'succeed_if' set of strings in stdout"
      command: /bin/echo succeed1
      register: command_result
      failed_when: "command_result.stdout not in ['succeed1',]"

    - name: "'succeed_if' set of strings in stdout (multiple values)"
      command: /bin/echo succeed2
      register: command_result
      failed_when: "command_result.stdout not in ['succeed1', 'succeed2']"

    - name: "'succeed_if' set of strings in stderr (multiple values)"
      shell: ">&2 /bin/echo succeed2 "
      register: command_result
      failed_when: "command_result.stderr not in ['succeed1', 'succeed2']"

    - name: "'succeed_if' set of strings in stderr (multiple values) or rc != 0"
      shell: ">&2 /bin/echo succeed2; /bin/false"
      register: command_result
      failed_when: "command_result.stderr not in ['succeed1', 'succeed2'] and command_result.rc != 0"

# vim: set ts=2 sts=2 fenc=utf-8 expandtab list:

您可能正在寻找的文件是Jinja2 Expressions