如何在不破坏数组的情况下覆盖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
这在 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 中定义。这样你至少可以 运行 你的角色在一个字典中具有期望值。
编辑:添加了一些默认值,但正如您所指出的......仍然很乱
我正在寻找一种方法来覆盖数组中的特定键而不覆盖整个数组。
示例:
剧本:
---
- 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
这在 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 中定义。这样你至少可以 运行 你的角色在一个字典中具有期望值。
编辑:添加了一些默认值,但正如您所指出的......仍然很乱