首页 > 解决方案 > 在 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,但是当我不得不只覆盖哈希中的一项时,我无法使用它。

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

标签: ansiblejinja2ansible-2.x

解决方案


  1. 你找到的方法是最简单的。编写起来很冗长,但很容易调试和修复。
  2. 如果你真的想缩小这份工作,你可以编写自己的查找插件。(https://docs.ansible.com/ansible/2.5/plugins/lookup.html)。

根据我的经验,我真的想说直接和愚蠢的方法(写冗长)对于整体可维护性要好得多。下一个人会看到一个很容易修复的哑转储(双关语),而不是一些晦涩的 python 片段。

为了让生活更轻松,您可能希望将此配置存储为一个单独的文件(包含所有 jinja 片段)并使用查找(来自 docs):

# 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)将加载和处理的模板转换为数据结构。


推荐阅读