Ansible-无法访问嵌套列表中的项目

时间:2019-03-30 16:54:10

标签: ansible

我正在尝试在一台服务器内的chroot目录中更新/etc/apt/sources.list/etc/apt/sources.list.d//opt/chroot下有3个chroot目录。

首先,我检查该目录是否存在,然后获取所有chroot名称,检查Debian的版本(更新wheezy,因此主要版本== 7),最后-查找所有相关文件。

下一步将是遍历它们,但是由于某些原因,我无法访问已注册变量中的所有项目。例如,对于nginx主机,我有3个文件,对于mysql-2个文件,ftp-1个文件。

这是我的剧本,最后一步失败了,原因是:未定义变量

- name: ROOT check if /opt/chroot exists
  tags:
    - fix_wheezy
    - chrootonly
  stat:
    path: /opt/chroot
  register: chrootpath

- name: ROOT get chroot names
  tags:
    - fix_wheezy
    - chrootonly
  shell: 'ls /opt/chroot | grep -v disable'
  register: chroots
  when: chrootpath.stat.exists == True

- name: ROOT get chroot versions
  tags:
    - fix_wheezy
    - chrootonly
  shell: 'chroot /opt/chroot/{{ item }} cut -d. -f1 /etc/debian_version'
  register: chroot_versions
  with_items: "{{ chroots.stdout_lines | default(omit) }}"

- name: CHROOT find list files for upgrade
  tags:
    - fix_wheezy
    - chrootonly
  find:
    paths: '/opt/chroot/{{ item.item }}/etc/apt'
    recurse: yes
    patterns: '*.list'
  register: find_chroot_list
    # var: item.stdout
  with_items: '{{ chroot_versions.results }}'
  when: chroots is defined and chrootpath.stat.exists == True and chroots.stdout.strip() != '' and item.stdout == '7'

- name: CHROOT check what was registered
  tags:
    - fix_wheezy
    - chrootonly
  debug:
    var: item.files.path
  with_items: 
    - '{{ find_chroot_list.results }}'

我附上了最终任务的完整日志:CHROOT check what was registered

我实际上有两个问题:

  • 是否可以遍历上一个任务生成的嵌套列表?
  • 为什么路径不可用?

1 个答案:

答案 0 :(得分:1)

  

为什么路径不可用?

在输出中,每个项目中的files是地图列表。因此,item.files.path不存在,但item.files[0].path存在。

  

是否可以遍历上一个任务产生的嵌套列表?

绝对可以,并且有几个选项(subelementsattribute extraction ...)。在您的特定情况下,我会选择json_query。以下示例将返回您要查找的内容

- name: CHROOT check what was registered
  debug:
    var: item.path
  loop: "{{ find_chroot_list.results | json_query('[].files[]') }}"

请注意,json_query需要pip install jmespath