ansible循环遍历结果并查找文件
ansible looping through the result and finding files
我正在使用 ansible 配置 10-20 个 linux 系统。我有一组工具,我在我的库存文件中定义了版本,如:
tools:
- tool: ABC
version: 7.8
- tool: XYZ
version: 8.32.1
现在,在我的播放 yml 文件中,我想遍历它们并具有必要的安装逻辑。如:
调试工具循环
- name: Find installer files
copy:
src=
with_items:
- "{{ tools }}"
when:
tools.tool == "ABC"
就我而言,{{tools.tool}}/{{tools.version}} 有一个 tgz 文件,我需要在远程位置取消存档。你知道怎么做吗?我试过这些:
- name: Find installer files
vars:
files: {{ lookup("fileglob",'tools/{{item.tool}}/linux/{{item.version}}/*') }}
unarchive:
src: "{{ files }}"
dest: "tools/{{item.tool}}/{{item.version}}/"
with_items:
- "{{ tools }}"
when:
item.tool == "ABC"
- name: Find installer files
debug:
msg: "{{ item}}"
with_items:
- "{{ tools }}"
with_fileglob:
- "tools/{{item.tool}}/linux/{{item.version}}/*"
when:
item.toolchain == "ABC"
但是 none 有效。感谢您的帮助。
其实很简单。这对我有用:
- name: Find installer files
unarchive:
src:
"lookup('fileglob','tools/item.tool/linux/item.version/*') }}"
dest: "tools/{{item.tool}}/{{item.version}}/"
with_items:
- "{{ tools }}"
when:
item.tool == "ABC"
这不是那么简单,因为如果目录中有多个文件,您自己的解决方案就会中断,我想。
因此,如果您在目录中只有一个文件,我根本不会使用 fileglob
,而是为其定义一个固定名称,您可以生成已知工具和版本。
我也经常看到对这类事情的需求,但没有找到任何好的解决方案。只有这样丑陋的东西:
- name: example book
hosts: localhost
become: false
gather_facts: false
vars:
tools:
- tool: ABC
version: 7.8
- tool: XYZ
version: 8.32.1
tools_files: []
tasks:
- name: prepare facts
set_fact:
tools_files: "{{ tools_files + [{'tool': item.tool | string, 'version': item.version | string, 'files': lookup('fileglob', 'tools/' ~ item.tool ~ '/linux/' ~ item.version ~ '/*', wantlist=True)}] }}"
with_items:
- "{{ tools }}"
- name: action loop
debug:
msg: "{{ {'src': item[1], 'dest': 'tools/' ~ item[0].tool ~ '/' ~ item[0].version ~ '/'} }}"
with_subelements:
- "{{ tools_files }}"
- files
when:
item[0].tool == "ABC"
或
- name: example book
hosts: localhost
become: false
gather_facts: false
vars:
tools:
- tool: ABC
version: 7.8
- tool: XYZ
version: 8.32.1
tools_files: []
tasks:
- name: prepare facts
set_fact:
tools_files: "{{ tools_files + [{'tool': item.tool | string, 'version': item.version | string, 'files': lookup('fileglob', 'tools/' ~ item.tool ~ '/linux/' ~ item.version ~ '/*', wantlist=True)}] }}"
with_items:
- "{{ tools }}"
- name: action loop
debug:
msg: "{{ {'src': item[1], 'dest': 'tools/' ~ item[0].tool ~ '/' ~ item[0].version ~ '/'} }}"
with_items:
- "{{ tools_files | subelements('files') }}"
when:
item[0].tool == "ABC"
也许我错过了一些东西,因为这些东西是一个非常基本的功能(遍历一个数组生成一个结果数组 beeing 能够使用所有可用的函数,而不仅仅是 map
使用 filters
其中一些重要的事情只是不可用或无法使用,因为 map 始终将输入端口作为 filter 的第一个参数。
我正在使用 ansible 配置 10-20 个 linux 系统。我有一组工具,我在我的库存文件中定义了版本,如:
tools:
- tool: ABC
version: 7.8
- tool: XYZ
version: 8.32.1
现在,在我的播放 yml 文件中,我想遍历它们并具有必要的安装逻辑。如:
调试工具循环
- name: Find installer files
copy:
src=
with_items:
- "{{ tools }}"
when:
tools.tool == "ABC"
就我而言,{{tools.tool}}/{{tools.version}} 有一个 tgz 文件,我需要在远程位置取消存档。你知道怎么做吗?我试过这些:
- name: Find installer files
vars:
files: {{ lookup("fileglob",'tools/{{item.tool}}/linux/{{item.version}}/*') }}
unarchive:
src: "{{ files }}"
dest: "tools/{{item.tool}}/{{item.version}}/"
with_items:
- "{{ tools }}"
when:
item.tool == "ABC"
- name: Find installer files
debug:
msg: "{{ item}}"
with_items:
- "{{ tools }}"
with_fileglob:
- "tools/{{item.tool}}/linux/{{item.version}}/*"
when:
item.toolchain == "ABC"
但是 none 有效。感谢您的帮助。
其实很简单。这对我有用:
- name: Find installer files
unarchive:
src:
"lookup('fileglob','tools/item.tool/linux/item.version/*') }}"
dest: "tools/{{item.tool}}/{{item.version}}/"
with_items:
- "{{ tools }}"
when:
item.tool == "ABC"
这不是那么简单,因为如果目录中有多个文件,您自己的解决方案就会中断,我想。
因此,如果您在目录中只有一个文件,我根本不会使用 fileglob
,而是为其定义一个固定名称,您可以生成已知工具和版本。
我也经常看到对这类事情的需求,但没有找到任何好的解决方案。只有这样丑陋的东西:
- name: example book
hosts: localhost
become: false
gather_facts: false
vars:
tools:
- tool: ABC
version: 7.8
- tool: XYZ
version: 8.32.1
tools_files: []
tasks:
- name: prepare facts
set_fact:
tools_files: "{{ tools_files + [{'tool': item.tool | string, 'version': item.version | string, 'files': lookup('fileglob', 'tools/' ~ item.tool ~ '/linux/' ~ item.version ~ '/*', wantlist=True)}] }}"
with_items:
- "{{ tools }}"
- name: action loop
debug:
msg: "{{ {'src': item[1], 'dest': 'tools/' ~ item[0].tool ~ '/' ~ item[0].version ~ '/'} }}"
with_subelements:
- "{{ tools_files }}"
- files
when:
item[0].tool == "ABC"
或
- name: example book
hosts: localhost
become: false
gather_facts: false
vars:
tools:
- tool: ABC
version: 7.8
- tool: XYZ
version: 8.32.1
tools_files: []
tasks:
- name: prepare facts
set_fact:
tools_files: "{{ tools_files + [{'tool': item.tool | string, 'version': item.version | string, 'files': lookup('fileglob', 'tools/' ~ item.tool ~ '/linux/' ~ item.version ~ '/*', wantlist=True)}] }}"
with_items:
- "{{ tools }}"
- name: action loop
debug:
msg: "{{ {'src': item[1], 'dest': 'tools/' ~ item[0].tool ~ '/' ~ item[0].version ~ '/'} }}"
with_items:
- "{{ tools_files | subelements('files') }}"
when:
item[0].tool == "ABC"
也许我错过了一些东西,因为这些东西是一个非常基本的功能(遍历一个数组生成一个结果数组 beeing 能够使用所有可用的函数,而不仅仅是 map
使用 filters
其中一些重要的事情只是不可用或无法使用,因为 map 始终将输入端口作为 filter 的第一个参数。