Ansible - 即使不满足条件,变量也会改变它的值
Ansible - variable changing it's value even though the condition is not met
我有一个角色需要使用以获得更多价值。对于角色中的每个任务,我注册了一个变量:checkdeps(对于这个角色中的所有任务都是一样的 - 在 运行 期间它总是至少有一个 value/output - 我需要这样,因为路径不同的是“/opt/play/apps/default-ace”、"default-device" 等),最后我做了一个 echo 来查看 checkdeps.stdout 的输出。
下面我放了一个输出正常的任务和一个有意跳过的任务。
如果我在剧本中使用参数 dep: APK_PARSER 它的作用是:首先 checkdeps 注册输出,在第二个任务中,checkdeps 的值被替换为空值!即使由于没有匹配的 dep 参数而跳过任务。
为什么不满足条件时checkdeps的值被替换?
- name: "output ok"
shell: "cd /opt/play/apps/default-ace && play deps {{ dep }}"
register: checkdeps
when: "dep == \"APK_PARSER\""
- name: "example to skip"
shell: "cd /opt/play/apps/default-device && play deps {{ dep }}"
register: checkdeps
when: "dep == \"I\" or dep == \"II\""
- name: "echo ok if Done!"
shell: "echo \"OK - {{ dep }} Dependencies {{ checkdeps.stdout }}\""
它给我错误:
One or more undefined variables: 'dict' object has no attribute 'stdout'
我修改了没有标准输出的最后一行:
shell: "echo \"OK - {{ dep }} Dependencies {{ checkdeps }}\""
它运行没有错误但给出了错误的输出:
stdout:
OK - APK_PARSER Dependencies {u'skipped': True, u'changed': False}
变量 checkdeps 是否注册了 "skipping: [...]"?如果不满足条件,为什么它会更改它的值?
ansible 存储 "log of ansible task execution",而不是“执行命令的输出”。此日志是 dict
,其中一个键是 stdout
,其中包含打印在标准输出(命令输出)上的已执行命令的所有内容。
tasks:
- debug: msg='one'
register: o1
when: True
- debug: msg='two'
register: o2
when: False
- debug: msg='o1={{o1}}'
- debug: msg='o2={{o2}}'
它打印以下内容。 'skipped' & 'changed' 是 [=31= 中出现的两个键]任务未执行时
TASK: [debug msg='one'] *******************************************************
ok: [localhost] => {
"msg": "one"
}
TASK: [debug msg='two'] *******************************************************
skipping: [localhost]
TASK: [debug msg='o1={{o1}}'] *************************************************
ok: [localhost] => {
"msg": "o1={'msg': u'one', 'verbose_always': True, 'invocation': {'module_name': u'debug', 'module_args': u\"msg='one'\"}}"
}
TASK: [debug msg='o2={{o2}}'] *************************************************
ok: [localhost] => {
"msg": "o2={u'skipped': True, u'changed': False}"
}
* 术语 "task execution log" 是我为了解释而不是标准术语发明的。
或者如果使用 set_when_task_skipped=false
:
跳过任务,则简单地告诉 ansible 不要注册变量
- name: "example to skip"
shell: "cd /opt/play/apps/default-device && play deps {{ dep }}"
register: checkdeps set_when_task_skipped=false
when: "dep == \"I\" or dep == \"II\""
我有一个角色需要使用以获得更多价值。对于角色中的每个任务,我注册了一个变量:checkdeps(对于这个角色中的所有任务都是一样的 - 在 运行 期间它总是至少有一个 value/output - 我需要这样,因为路径不同的是“/opt/play/apps/default-ace”、"default-device" 等),最后我做了一个 echo 来查看 checkdeps.stdout 的输出。
下面我放了一个输出正常的任务和一个有意跳过的任务。 如果我在剧本中使用参数 dep: APK_PARSER 它的作用是:首先 checkdeps 注册输出,在第二个任务中,checkdeps 的值被替换为空值!即使由于没有匹配的 dep 参数而跳过任务。
为什么不满足条件时checkdeps的值被替换?
- name: "output ok"
shell: "cd /opt/play/apps/default-ace && play deps {{ dep }}"
register: checkdeps
when: "dep == \"APK_PARSER\""
- name: "example to skip"
shell: "cd /opt/play/apps/default-device && play deps {{ dep }}"
register: checkdeps
when: "dep == \"I\" or dep == \"II\""
- name: "echo ok if Done!"
shell: "echo \"OK - {{ dep }} Dependencies {{ checkdeps.stdout }}\""
它给我错误:
One or more undefined variables: 'dict' object has no attribute 'stdout'
我修改了没有标准输出的最后一行:
shell: "echo \"OK - {{ dep }} Dependencies {{ checkdeps }}\""
它运行没有错误但给出了错误的输出:
stdout:
OK - APK_PARSER Dependencies {u'skipped': True, u'changed': False}
变量 checkdeps 是否注册了 "skipping: [...]"?如果不满足条件,为什么它会更改它的值?
ansible 存储 "log of ansible task execution",而不是“执行命令的输出”。此日志是 dict
,其中一个键是 stdout
,其中包含打印在标准输出(命令输出)上的已执行命令的所有内容。
tasks:
- debug: msg='one'
register: o1
when: True
- debug: msg='two'
register: o2
when: False
- debug: msg='o1={{o1}}'
- debug: msg='o2={{o2}}'
它打印以下内容。 'skipped' & 'changed' 是 [=31= 中出现的两个键]任务未执行时
TASK: [debug msg='one'] *******************************************************
ok: [localhost] => {
"msg": "one"
}
TASK: [debug msg='two'] *******************************************************
skipping: [localhost]
TASK: [debug msg='o1={{o1}}'] *************************************************
ok: [localhost] => {
"msg": "o1={'msg': u'one', 'verbose_always': True, 'invocation': {'module_name': u'debug', 'module_args': u\"msg='one'\"}}"
}
TASK: [debug msg='o2={{o2}}'] *************************************************
ok: [localhost] => {
"msg": "o2={u'skipped': True, u'changed': False}"
}
* 术语 "task execution log" 是我为了解释而不是标准术语发明的。
或者如果使用 set_when_task_skipped=false
:
- name: "example to skip"
shell: "cd /opt/play/apps/default-device && play deps {{ dep }}"
register: checkdeps set_when_task_skipped=false
when: "dep == \"I\" or dep == \"II\""