我正在尝试在一台服务器内的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。
我实际上有两个问题:
答案 0 :(得分:1)
为什么路径不可用?
在输出中,每个项目中的files
是地图列表。因此,item.files.path
不存在,但item.files[0].path
存在。
是否可以遍历上一个任务产生的嵌套列表?
绝对可以,并且有几个选项(subelements,attribute 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