首页 > 解决方案 > 使用 Ansible 循环访问已注册的文件模块数据

问题描述

我已经尝试在Ansible 文档以及 Stackoverflow 和其他网站和博客上找到解决方案。我还使用了已注册数据结构的调试输出,并确认我可以在静态引用数据时访问数据。最后,我使用了嵌套循环来尝试解决这个问题。

相关的 Ansible 戏剧:

- name: Return the list of application folders
  win_find:
    paths:
    - C:\Applications\
    patterns: [ 'app*' ]
    file_type: directory
  register: app_folders

- name: Return the list of rotated log files to purge
  win_find:
    paths: 
    - "{{ item.path }}\\logs"
    patterns: applog-\d{4}-\d{2}-\d{2}\.\d{2}
    use_regex: yes
  loop: "{{ app_folders.files }}"
  register: logs_to_purge

- name: Purge rotated log files
  win_file:
    path: "{{ item.path }}"
    state: absent
  #loop: "{{ logs_to_purge.results }}"
  #with_nested: 
  #- "{{ logs_to_purge.results }}"
  #- ['files']

结果是一个dict项目列表,一些项目是普通的dict名称值对,一些项目值是dict本身,一些项目值是其他普通dict项目名称值对的列表。

我试图循环的数据可以这样表示:

"logs_to_purge": {
    results:[
                { 
                    "name": value,
                    "name2": value2,
                    "name3": {    }
                    "files": [{
                                  "filevalue1": value,
                                  "filevalue2": value,
                                  "path": value_of_interest 
                              },
                              {
                                  "filevalue1": value,
                                  "filevalue2": value,
                                  "path": value_of_interest
                              }
                            ]

                  },
                  {
                      One more like above for every "app_folders"
                      with zero or more files matches.
                  }
            ]

所以“结果”是一个字典列表。每个结果字典都包含一个字典项“文件”,其中包含一个字典列表作为值。这些字典中的每一个都包含一个“路径”项,它是感兴趣的值。

上面注释掉的“清除旋转的日志文件”Ansible Play 的最后四行是我花了很多时间无济于事的地方。

标签: ansible

解决方案


使用 json_query。下面的任务

- debug:
    var: item
  loop: "{{ logs_to_purge.results|json_query('[*].files[*].path')|flatten }}"

"item": "value_of_interest"
"item": "value_of_interest"

推荐阅读