0

我正在使用 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"

但没有一个奏效。谢谢您的帮助。

4

2 回答 2

1

那其实很简单。这对我有用:

- 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"
于 2019-10-12T10:15:58.227 回答
1

我认为,如果目录中有多个文件,您自己的解决方案就不会那么简单了。
因此,如果您在目录中只有一个文件,我根本不会使用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"

也许我错过了一些东西,因为这些东西是一个非常基本的功能(通过一个数组循环生成一个结果数组,因为它能够使用所有可用的函数,而不仅仅是map使用filters一些重要的东西不可用或不能使用的地方,因为 map 将输入端口作为始终过滤的第一个参数)。

于 2019-10-12T20:11:04.993 回答