Ansible - 加载多个本地 yml 文件并合并它们的内容

Ansible - load multiplne local yml files and merge their content

我的 host_vars 文件有大约 5k 行 yml 代码。所以我想要单独的 yml 文件 - 每个服务一个文件。

简化示例:

user@test $ cat production/split_configs/a.example.net.yml 
my_array:
  - a.example.net
  
user@test $ cat production/split_configs/b.example.net.yml 
my_array:
  - b.example.net
  
user@test $ cat webhosts.yml 
- hosts: myservers

  pre_tasks:
    - name: merge ansible arrays
      tags: always
      delegate_to: localhost
      block:

        - name: find config files
          find:
            paths: production/configs/
            patterns: '*.yml'
          register: find_results

        - name: aaa
          debug:
            msg: "{{ find_results.files }}"

        - name: bbb
          debug:
            msg: "{{ item.path }}"
          with_items: "{{ find_results.files }}"

        - name: ccc
          debug:
            msg: "{{ lookup('file', 'production/configs/a.example.net.yml') }}"

        - name: ddd
          debug:
            msg: "{{ lookup('file', item.path) }}"
          loop: "{{ find_results.files }}"

  tasks:
    - name: eee
      debug:
        msg: "{{ my_array }}"

目标是合并两个数组的内容并在任务 eee:

中打印合并的内容
my_array:
  - a.example.net
  - b.example.net

任务 aaa 打印有关文件的信息(路径、模式、uid 等)- 有效。

任务 bbbddd 不打印任何内容。我不明白为什么。

任务ccc打印文件内容。但是路径是写在剧本中的:-(

加载文件后,我需要合并它们。我的想法是在 with_items: "{{ find_results.files }}" 的任务中使用类似 set_fact: my_array="{{ my_array + my_array }}" 的东西。这是个好主意吗?或者我能做得更好吗?

例如,下面的任务完成工作

    - include_vars:
        file: "{{ item }}"
        name: "my_prefix_{{ item|regex_replace('\W', '_') }}"
      with_fileglob: production/split_configs/*

    - set_fact:
        my_vars: "{{ my_vars|d({})|
                     combine(lookup('vars', item),
                             recursive=True,
                             list_merge='append') }}"
      loop: "{{ q('varnames', 'my_prefix_.*') }}"

给予

  my_vars:
    my_array:
    - a.example.net
    - b.example.net