我需要使用一个角色来获取更多价值。对于角色中的每个任务,我都会注册一个变量:checkdeps(此角色中的所有任务都相同-在运行期间,它始终至少具有一个值/输出-我需要这样,因为路径不同“/ opt / play / apps / default-ace”,“default-device”等),最后我进行回显以查看checkdeps.stdout的输出。

在下面,我放置了一项将输出ok的任务,而将有意跳过的一项任务。
如果我在剧本中使用参数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是否注册了“正在跳过:[...]”?如果不满足条件,为什么要更改其值?

最佳答案

ansible存储“ ansible任务执行的日志”,而不是“已执行命令的输出”。该日志是dict,键之一是stdout,其中包含在stdout(命令输出)上打印的已执行命令的所有内容。

  tasks:
    - debug: msg='one'
      register: o1
      when: True
    - debug: msg='two'
      register: o2
      when: False
    - debug: msg='o1={{o1}}'
    - debug: msg='o2={{o2}}'

它打印以下内容。 '已跳过''已更改'是未执行任务时在“log” 中出现的两个键。
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}"
}

*“任务执行日志”一词是我发明的,用于解释而不是标准的术语。

08-25 20:10