有人可以解释为什么发生以下情况:
我试图在两个不同的任务中重用相同的变量(output
),其中只有一个任务将根据条件(bool
)运行。我不明白为什么在运行以下剧本时debug hi
任务会导致错误。
echo hello
和debug hello
按预期运行并工作,然后跳过echo hi
(也预期为bool == True
),但我不明白为什么debug hi
导致错误。我得到的错误是:
The conditional check output.stdout == hi failed. The error was: error while evaluating conditional: output 'dict object' has no attribute stdout
为什么output
变量不能在debug hi
任务中持续存在?跳过debug hi
时,好像失去了它的值。
- hosts: localhost
vars:
bool: True
tasks:
- name: echo hello
shell: echo "hello"
register: output
when: bool == True
- name: debug hello
debug:
msg: "hello"
when: output.stdout == "hello"
- name: echo hi
shell: echo "hi"
register: output
when: bool != True
- name: debug hi
debug:
msg: "hi"
when: output.stdout == "hi"
答案 0 :(得分:0)
即使任务被跳过,您仍将任务结果注册到output
。以这些非常简单的任务为例:
- command: echo Hello
register: result
when: false
- debug:
var: result
变量result
仍被创建,并且具有以下内容:
"result": {
"changed": false,
"skip_reason": "Conditional result was False",
"skipped": true
}
这仍然是非常有用的信息(即知道已跳过任务)。您将需要在游戏中考虑到这种逻辑。
答案 1 :(得分:0)
此任务:
- name: echo hi
shell: echo "hi"
register: output
when: bool != True
注册output
是否为bool
。
如果任务失败或被跳过,则仍以失败或跳过状态注册变量,避免注册变量的唯一方法是使用标签。
答案 2 :(得分:0)
您可以将最新的when:
条件替换为:
when: output.stdout is defined and output.stdout == "hi"