有条件地运行 Ansible 任务,如果条件不满足则失败

有条件地运行 Ansible 任务,如果条件不满足则失败

我对 Ansible 还很陌生,遇到了一个问题。我想仅在满足条件时运行模块,但如果条件不满足,它应该使任务失败并向用户报告。目前我所做的是,它只会跳过它而不是使它失败。

下面是我的代码,我有要检查的条件,并且只有当 result.stdout =='valid' 时才运行,但如果其'无效',我想让任务失败。目前,如果条件不满足,它只会跳过它。

---
- name: Check Value
  become: yes
  shell: /usr/bin/python3 check.py
  args:
    chdir: "mydir/scripts/"
  register: result
  tags: data_merge

- name: Merge Data
  become: yes
  when: result.stdout == 'valid'
  local_action:
    module: some_module
    provider: "{{some_provider}}"
    role_path: "{{role_path}}"
  run_once: true
  tags: data_merge

答案1

您有三个选择:

用于failed_when使剧本在检查条件时失败。我建议向 Python 脚本添加退出代码(例如exit(255 if error else 0):),它比解析以下内容更简洁stdout

- name: Check Value
  shell: /usr/bin/python3 check.py
  args:
    chdir: "mydir/scripts/"
  register: result
  failed_when: result.rc != 0
  tags: data_merge

fail将终止应用程序并打印一条错误消息:

- name: Fail on not valid
  fail:
    msg: failed
  when: result.stdout != 'valid'

meta: end_play将默默地停止应用程序(但如果你想要反馈输出,这可能没用)

- name: Stop on not valid
  meta: end_play
  when: result.stdout != 'valid'

无论如何你都不需要when: result.stdout == 'valid'不管怎样合并数据不再。

答案2

在这种情况下,你应该明确地让自己失望。

- name: Fail when value is not valid
  fail:
    msg: "A custom message to tell the user what went wrong"
  when: result.stdout != 'valid'

您也可以直接在运行检查脚本的程序中检查结果。

- name: Check Value
  become: yes
  shell: /usr/bin/python3 check.py
  args:
    chdir: "mydir/scripts/"
  register: result
  tags: data_merge
  failed_when: "'invalid' in result.stdout"

您应该考虑在应用程序中使用退出代码来指示成功或失败,因为大多数程序已经这样做了。这比检查 stdout 上的文本更可靠。使用sys.exit()在 Python 中执行此操作。在这种情况下,检查是否失败很简单,就是当result.rc != 0

(当然,只要有可能,您就应该使用command而不是shell。)

相关内容