当json_query未定义时,请回答

时间:2017-12-12 18:48:55

标签: ansible yaml

我有这样的结构:

domain_definition:
  domain:
    cluster:
         name: "cluster1"
         params: 
            - 30
    server:
         name: "server1"
         params: 
            - 30
            - 20
            - 10

我运行这个处理程序

- name: restart
  shell: ...
  async: 45 
  poll: 0 
  with_subelements:
   - "{{domain_definition|json_query('domain.*')| default([])}}"
   - params
  listen: "restart"

在某些主机中没有定义domain_definition,所以我尝试添加

  when: domain_definition is defined

但是我得到了

 "Error in jmespath.search in json_query filter plugin:\n'domain_definition' is undefined"

2 个答案:

答案 0 :(得分:0)

  1. 循环参数解析后,循环任务when将应用于每次迭代。
  2. 所有vars操作都应在内部 {{...}}而不是{{...}}|default(...)完成。
  3. 但我猜你真的想要:

    with_subelements:
      - "{{domain_definition|json_query('domain.*')}}"
      - params
      - skip_missing: yes
    

答案 1 :(得分:0)

在阅读了一些jinja2和jmspath后,我解决了这样的问题:

with_subelements:
  - "{{domain_definition| default({'domain':{}}) | json_query('domain.*')}}"
  - params

它会查找domain_definition,因为它不存在会将默认值设置为“{'domain':{}}”。然后json_query接收该值并处理它。因为它是一个空对象,它只是跳过整个任务。

我认为这是一个错误,在“with_subelements”和“when”条件下。在ansible 2.2它过去工作,我升级到2.4,它不再工作了。