Ansible:从嵌套字典对象(JSON)中提取值

时间:2020-06-04 14:06:43

标签: json filter ansible

我正在将一个应用程序的现有安装Shell脚本转换为Ansible作业。我现在有步骤,我必须找到给定的文件集,然后在嵌套循环中的其他属性中将它们用于其他任务。问题是我找不到如何将查找结果转换为可用形式的方法。

步骤:

- name: Finds files to use
  find:
    paths: "{{ item }}"
    file_type: file
    use_regex: yes
    recurse: yes
    patterns:
      - ".*\\.xml$"
      - ".*\\.yml$"
      - ".*\\.hcl$"
      - ".*\\.json$"
  with_items:
    - /etc/<<some_folder>>
    - /opt/<<some_folder>>/conf
    - /opt/<<some_folder>>/x-cluster
    - /opt/<<some_folder>>/config
    - /opt/<<some_folder>>/x_worker/config
  register: "findoutput"

- name: Replace var strings
  replace:
    path: "{{ item.0.path }}"
    regexp: "{{ item.1   }}"
    replace: "{{ item.2 }}"
  with_nested:
    - "{{ findoutput | **<<insert_magic>>** | list }}"
    - "{{ replace_values | dictsort }}"

这种方法一直失败,因为我从一个搜索迭代中接收到5个值的列表,这些值嵌套了所有找到的文件,但我还没有找到访问此方法的方法。

我将很高兴为您提供帮助或指出正确的方向。

1 个答案:

答案 0 :(得分:1)

在执行查找任务之后,将find的输出展平并仅获取path的值,如下所示:

- set_fact: 
    formatted_result: "{{ findoutput.results | json_query('[*].files[*].path') | list | flatten }}"

然后在下一个任务中使用formatted_result列表替换字符串。