Ansible include_vars into dictionary

时间:2017-07-24 16:23:28

标签: dictionary ansible yaml

在我的ansible playbook中,我将一个目录列表读入列表中。然后我想从每个目录中读取一个“config.yml”文件,并将它们的内容放入字典中,这样我就可以通过该字典中的目录名引用config-data。 第一部分没问题,但我不能让第二部分工作:

步骤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 }}

更新 尝试使用Konstantins方法:

  - 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)"}

2 个答案:

答案 0 :(得分:3)

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

- 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一起使用,并使用以下任务解析它,删除不必要的字段。

答案 1 :(得分:0)

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: how to construct a variable from another variable and then fetch it's value提升)。

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