在 Ansible 中更改列表值
Changing list value in Ansible
我的库存结构非常复杂。对于我的特定安装,我只想覆盖一些值。例如,我有结构:
---
System:
atr1: 47
config:
- nodes:
- logger:
id: 'all'
svr: 'IEW'
- Database:
constr: 'login/pass@db'
atr2: 'some value'
我想覆盖记录器的严重性,即添加统计信息
svr:'IEWS'。我想在 --extra-vars 参数中提供覆盖。
在ansible.cfg -> hash_behaviour = 合并
我不想使用类似 - svr: "{{ svr_custom | default('IEW') }}" 这样的东西,因为那里参数太多,这样很难写出整个清单。
我阅读了 combine filter,但我无法使用它,因为我不得不只覆盖哈希中的一项。
我怎样才能实现我的目标?
- 你找到的方法是最简单的。写起来很冗长,但很容易调试和修复。
- 如果您真的想要缩小这项工作,您可以编写自己的查找插件。 (https://docs.ansible.com/ansible/2.5/plugins/lookup.html).
根据我的经验,我真的想说直接和愚蠢的方法(写冗长)对于整体可维护性要好得多。下一个人会看到一个很容易修复的愚蠢转储(双关语),而不是一些晦涩难懂的 python 片段。
为了让生活更轻松,您可能希望将此配置存储为一个单独的文件(包含所有 jinja 片段)并使用查找(直接来自文档):
# Since 2.4, you can pass in variables during evaluation
- debug: msg="{{ lookup('template', './some_template.j2', template_vars=dict(x=42)) }} is evaluated with x=42"
此外,您可以使用Jinja的|from_yaml
(或from_json
)将加载和处理的模板转换为数据结构。
I read about combine filter, but I can't use it, when I had to override only one item in hash.
这是为什么?在 --extra-vars 中定义的 new_svr 不会实现你想要的吗?
- set_fact:
System: "{{ System | combine({'config':[{'nodes':[{'logger':{'svr':new_svr }}]}]}, recursive=True) }}"
我的库存结构非常复杂。对于我的特定安装,我只想覆盖一些值。例如,我有结构:
---
System:
atr1: 47
config:
- nodes:
- logger:
id: 'all'
svr: 'IEW'
- Database:
constr: 'login/pass@db'
atr2: 'some value'
我想覆盖记录器的严重性,即添加统计信息 svr:'IEWS'。我想在 --extra-vars 参数中提供覆盖。
在ansible.cfg -> hash_behaviour = 合并
我不想使用类似 - svr: "{{ svr_custom | default('IEW') }}" 这样的东西,因为那里参数太多,这样很难写出整个清单。 我阅读了 combine filter,但我无法使用它,因为我不得不只覆盖哈希中的一项。
我怎样才能实现我的目标?
- 你找到的方法是最简单的。写起来很冗长,但很容易调试和修复。
- 如果您真的想要缩小这项工作,您可以编写自己的查找插件。 (https://docs.ansible.com/ansible/2.5/plugins/lookup.html).
根据我的经验,我真的想说直接和愚蠢的方法(写冗长)对于整体可维护性要好得多。下一个人会看到一个很容易修复的愚蠢转储(双关语),而不是一些晦涩难懂的 python 片段。
为了让生活更轻松,您可能希望将此配置存储为一个单独的文件(包含所有 jinja 片段)并使用查找(直接来自文档):
# Since 2.4, you can pass in variables during evaluation
- debug: msg="{{ lookup('template', './some_template.j2', template_vars=dict(x=42)) }} is evaluated with x=42"
此外,您可以使用Jinja的|from_yaml
(或from_json
)将加载和处理的模板转换为数据结构。
I read about combine filter, but I can't use it, when I had to override only one item in hash.
这是为什么?在 --extra-vars 中定义的 new_svr 不会实现你想要的吗?
- set_fact:
System: "{{ System | combine({'config':[{'nodes':[{'logger':{'svr':new_svr }}]}]}, recursive=True) }}"