Ansible include_vars into dictionary



在我的 ansible 剧本中,我将目录列表读入列表。然后,我想从每个目录中读取一个"config.yml"文件,并将它们的内容放入字典中,以便我可以通过该字典中的目录名称引用配置数据。 第一部分没问题,但我无法让第二部分工作:

步骤1,加载目录:

- name: Include directories
include_vars:
file: /main-config.yml
name: config

第 2 步,从目录加载配置:

- name: load deploymentset configurations
include_vars:
file: /path/{{ item }}/config.yml
name: "allconfs.{{ item }}"   ## << This is the problematic part 
with_items:
- "{{ config.dirs }}"

我尝试了不同的东西,比如"allconfs['{{ item }}'],但似乎没有一个奏效。剧本成功完成,但数据不在字典中。 我也尝试事先定义外部字典,但这也没有用。

配置文件本身非常简单:

/main-config.yml:

dirs:
- dir1
- dir2
- dir3

/path/dir1/config.yml:

some_var: "some_val"
another_var: "another val"

我希望能够像这样访问 config.yml 文件的值:

{{ allconfs.dir1.some_var }}

更新以尝试康斯坦丁斯方法:

- name: load deploymentset configurations
include_vars:
file: /repo/deploymentsets/{{ item }}/config.yml
name: "default_config"
with_items:
- "{{ config.deploymentsets }}"
register: default_configs

- name: combine configs
set_fact:
default_configs: "{{ dict(default_configs.results | json_query('[].[item, ansible_facts.default_config]')) }}"

错误信息:

fatal: [127.0.0.1]: FAILED! => {"failed": true, "msg": "Unexpected templating type error occurred on ({{ dict(default_configs.results | json_query('[].[item, ansible_facts.default_config]')) }}): <lambda>() takes exactly 0 arguments (1 given)"}

以下是我的一个项目中具有类似功能的一段代码:

- name: Load config defaults
include_vars:
file: "{{ item }}.yml"
name: "default_config"
with_items: "{{ config_files }}"
register: default_configs
tags:
- configuration
- name: Combine configs into one dict
# Здесь мы делаем словарь вида
# default_configs:
#   config_name_1: { default_config_object }
#   config_name_2: { default_config_object }
#   config_name_3: { default_config_object }
#   ...
set_fact:
default_configs: "{{ dict(default_configs.results | json_query('[].[item, ansible_facts.default_config]')) }}"
tags:
- configuration

default_config是临时加载 var 数据的虚拟变量。
诀窍是将register: default_configsinclude_vars一起使用,并通过以下任务对其进行解析,去除不必要的字段。

AFAIK 不可能创建包含多个include_vars的单个字典。 根据我的测试,它将为每个包含的目录创建单独的字典。 您可以改为执行以下操作。

从变量名称中删除allconfs.

- name: load deploymentset configurations
include_vars:
file: /path/{{ item }}/config.yml
name: "{{ item }}"
with_items:
- "{{ config.dirs }}"

然后,您可以直接使用

debug:
msg: "{{ dir1.some_var }}"
with_items: "{{ config.dirs }}"

或者,如果您需要遍历所包含目录中的所有变量,请使用这个(从 Ansible 提升:如何从另一个变量构造一个变量,然后获取它的值(。

debug:
msg: "{{ hostvars[inventory_hostname][item].some_var }}"
with_items: "{{ config.dirs }}"

最新更新