我对 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
。)