【问题标题】:Ansible when json_query is undefined当 json_query 未定义时 Ansible
【发布时间】:2017-12-12 18:48:55
【问题描述】:

我有这样的结构:

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"

【问题讨论】:

    标签: ansible yaml


    【解决方案1】:

    在阅读了一些 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 并且它不再工作了。

    【讨论】:

      【解决方案2】:
      1. 循环任务 when 在解析循环参数后应用于每次迭代。
      2. 所有变量操作都应该在内部{{...}}而不是{{...}}|default(...)完成。

      但我猜你确实想要:

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

      【讨论】:

      • 是的,错误的复制粘贴在数字 2 上。并且 skip_missing 不起作用,doc 说:“或者,您可以将第三个元素添加到子元素列表中,它包含一个标志字典。目前您可以添加'skip_missing'标志。如果设置为True,查找插件将跳过不包含给定子键的列表项。"。
      • 问题是host vars上根本没有domain_definition。
      猜你喜欢
      • 2020-05-08
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 2023-03-25
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多