在 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,但我无法使用它,因为我不得不只覆盖哈希中的一项。

我怎样才能实现我的目标?

  1. 你找到的方法是最简单的。写起来很冗长,但很容易调试和修复。
  2. 如果您真的想要缩小这项工作,您可以编写自己的查找插件。 (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) }}"