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 等)- 有效。
任务 bbb
和 ddd
不打印任何内容。我不明白为什么。
任务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
我的 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 等)- 有效。
任务 bbb
和 ddd
不打印任何内容。我不明白为什么。
任务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