在跳过任务时防止ansible评估变量

时间:2015-06-15 07:02:34

标签: ansible ansible-playbook

我在剧本中有条件的角色。像这样:

  - { role: some_role, when: "some_var == 'blah'" }

令人讨厌的是,即使条件是关于角色,ansible仍然决定通过角色中的每个任务并提及:

TASK: [some_role | do something] ********************************
skipping: [some_host]

为什么它需要进入角色的每个任务都超出我的范围,但那是我曾经生活过的事情。到现在。我刚刚向some_role添加了一个如下所示的任务:

- name: do something
  some_module:
    something: "{{ item.0.some_sub_attr }}"
    something_else: "{{ item.1 }}"
  with_subelements:
    - elem1
    - elem2

现在,由于一些不明智的理由,ansible正在尝试评估elem1(即使它正在跳过任务),并且因为elem1未定义,所以它错误地排除了整个事情:

fatal: [some_host] => subelements lookup expects a dictionary, got 'elem1'

我怎样才能避免这种情况发生?理想情况下,我喜欢摆脱任务的所有跳过,只是让它告诉我它跳过这个角色,但如果这是不可避免的,我至少可以做些什么来阻止它会评估正在跳过的任务的变量吗?

1 个答案:

答案 0 :(得分:1)

首先,它显示为“跳过”而非静默不执行的原因是因为(至少在Ansible 1.x中)任务执行顺序是在评估任何内容之前确定的(同样的原因,任务名称中的变量不会工作),每个主机都有自己的一组变量。仅仅因为条件导致一个主机跳过它并不意味着它可能不会被另一个主机跳过,因此,即使它们被所有主机都跳过,所有任务也会一直显示出来。 Playbook跑步者已经在很大程度上重写了2.x,并且路线图中有真正的条件包含/角色(虽然我最近没看过当前的2.0代码是否有这种情况) - 这可能会解决您的问题。

假设您想要在1.x中运行的东西 - 您是否考虑过对问题变量使用角色默认值或默认过滤器来防止它们破坏?在ansible.cfg中设置error_on_undefined_vars = False也是一件大事,但我不建议......