linux Ansible -加载多个本地yml文件并合并其内容

5uzkadbs  于 2023-01-12  发布在  Linux
关注(0)|答案(2)|浏览(148)

我的host_vars文件有大约5 k行的yml代码。2所以我希望有单独的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打印文件的内容。但路径写在剧本中:-(
加载文件后,我需要合并它们。我的想法是在任务中使用类似set_fact: my_array="{{ my_array + my_array }}"with_items: "{{ find_results.files }}"。这是个好主意吗?或者我能做得多好?

lx0bsm1f

lx0bsm1f1#

例如,下面的任务可以完成这项工作

- 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
q3qa4bjr

q3qa4bjr2#

您可以使用简单的cat命令将这些文件合并到一个文件中,然后包括var文件,例如-

- raw: "cat production/split_configs/* >my_vars.yml"
    - include_vars: file=my_vars.yml name=my_vars

会给予你结果-

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

相关问题