如何在不破坏数组的情况下覆盖ansible数组中的键值

how can I override a key value in ansible arrays without destroying the array

我正在寻找一种方法来覆盖数组中的特定键而不覆盖整个数组。

示例:

剧本:

---
- hosts: hostgroup
  vars:
    program:
      name: customname
      option1: customoption

库存:

program:
  name: groupname
  option2: group

Defaults/main

program:
  name: defaultname
  option1: default
  option2: default
  option3: default

我希望这些值可以这样覆盖:

program:
  name: customname
  option1: customoption
  option2: group
  option3: default

然而,我的实际值是:

program:
  name: customname
  option1: customoption

来源https://gist.github.com/JakeDEvans/ed13514e6d3614c3381a

这在 Ansible 1.9.4 中是不可能的,但在 2.0 中是可能的,因为变量变成了哈希。

要组合哈希值,请使用过滤器组合: http://docs.ansible.com/ansible/playbooks_filters.html

{{ program|combine(program_inventory|combine(program_playbook)) }}

我假设 defaults_main.yml 确实是角色默认变量文件(例如 roles/role_name/defaults/main.yml),而 "actual values" 是您在角色中看到的内容。

另一种选择是在您的播放定义中模板化程序结构。例如你会:

- hosts: hostgroup
  vars:
    program:
      name: customname
      option1: customoption
      option2: "{{ program_inv.option2 | default('some_value') }}"
      option3: "{{ program_role.option3 | default('other_value') }}"
  roles:
  .......

其中 program_inv 在 host_var 或 group_var 文件中定义,而 program_role 在 role_name/defaults/main.yml 中定义。这样你至少可以 运行 你的角色在一个字典中具有期望值。

编辑:添加了一些默认值,但正如您所指出的......仍然很乱