在Ansible中附加到列表或向词典添加键

(与Callbacks or hooks, and reusable series of tasks, in Ansible roles相关):

有没有更好的方法来附加到列表或在Ansible中添加字典而不是(ab)使用jina2模板表达式?

我知道你可以这样做:

- name: this is a hack
  shell: echo "{% originalvar.append('x') %}New value of originalvar is {{originalvar}}"

但是真的没有这样的元任务或帮助吗?

它感觉很脆弱,似乎没有文档记录,并且依赖于关于变量如何在Ansible中工作的许多假设.

我的用例是多个角色(数据库服务器扩展),每个角色都需要为基本角色(数据库服务器)提供一些配置.它不像在db server config文件中附加一行那么简单;每个更改都适用于同一行,例如扩展名bdr和pg_stat_statements必须都出现在目标行上:

shared_preload_libaries = 'bdr, pg_stat_statements'

Ansible方式是这样做只是多次处理配置文件(每个扩展一次),使用正则表达式提取当前值,解析它,然后重写它?如果是这样,你如何在多次运行中使其幂等?

如果配置比解析更难以解决它并不像添加另一个以逗号分隔的值那么简单?想想XML配置文件.

最佳答案
您可以在变量中合并两个列表.
假设您有一个包含以下内容的group_vars文件:

---
# group_vars/all
pgsql_extensions:
  - ext1
  - ext2
  - ext3

它在模板pgsql.conf.j2中使用,如:

# {{ ansible_managed }}
pgsql_extensions={% for item in pgsql_extensions %}{{ item }}, {% endfor %}

然后,您可以将扩展名附加到测试数据库服务器,如下所示:

---
# group_vars/testing_db
append_exts:
  - ext4
  - ext5
pgsql_extensions: "{{ pgsql_extensions + append_exts }}"

在任何测试服务器中运行角色时,将添加aditional扩展.

我不确定它是否适用于字典,并且还要小​​心空格并在行尾留下悬空的逗号.

转载注明原文:在Ansible中附加到列表或向词典添加键 - 代码日志