Ansible - 即使条件不满足也会改变它的值

时间:2015-03-30 06:30:28

标签: conditional-statements ansible ansible-playbook role

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

下面我将一个输出正确的任务和一个有意将被跳过的任务。 如果我在playbook中使用参数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'

我修改了没有stdout的最后一行:

shell: "echo \"OK - {{ dep }} Dependencies {{ checkdeps }}\""

并且它运行没有错误但输出错误:

stdout:
OK - APK_PARSER Dependencies {u'skipped': True, u'changed': False}

变量checkdeps注册了“跳过:[...]”吗?如果条件不满足,为什么要改变它的价值呢?

2 个答案:

答案 0 :(得分:3)

ansible存储“ ansible task execution ”的日志,而不是“输出的命令输出”。此日志是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}"
}

*术语“任务执行日志”由我发明,用于解释而非安全标准术语。

答案 1 :(得分:1)

或者只是告诉ansible如果使用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\""