ansible扩展var列表而不是覆盖

标签 ansible jinja2

我有一个在 default/main.yml 中定义默认属性列表的角色

hdfs_namenode_properties:
  - { name: "dfs.permissions.superusergroup", value: "hadoop" }
  - { name: "dfs.namenode.name.dir", value: "/media/persistent0" }

但是当我在 site.yml 中定义自己的 hdfs_namenode_properties 时,默认值就会被覆盖。

- name: set up cluster master
  hosts: masters
  vars:
    hdfs_namenode: "True"
    hdfs_namenode_properties:
      - { name: 'dfs.permissions.enabled', value: 'false' }
  roles:
    - azavea.hdfs

迭代属性列表的模板是

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
{% for property in hdfs_namenode_properties -%}
  <property>
    <name>{{ property.name }}</name>
    <value>{{ property.value }}</value>
  </property>
{% endfor -%}
</configuration>

有没有办法合并两个列表?

或者换句话说,我如何访问默认值,以便我可以执行类似的操作

    hdfs_namenode_properties:
      "{{ <<default_namenode_properties>> 
          + { name: 'dfs.permissions.enabled', value: 'false' } 
      }}"

最佳答案

var 覆盖是默认的 ansible 行为。您可以通过更改 ansible.cfg 文件中的 hash_behavior=merge 来更改此行为。

来源:Ansible docs

您可以执行此操作的另一种方法是使用 default jinja2 过滤器,因此您不会在 role/yourrole/defaults 中定义默认值,而是直接在模板中执行以下操作类似于(模板文件只是一个示例,我不确定 hdfs namenode conf 的结构如何):

# file: yourrole/templates/template.j2
[hdfs_namenode]
name: {{ hdfs_namenode_properties.name | default("dfs.permissions.superusergroup") }}

这样一来,您始终必须指定 hdfs_namenode_properties,即使是一个空字典 ( hdfs_namenode_properties: {} )

关于ansible扩展var列表而不是覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36641825/

相关文章:

logging - 如何在 Ansible 中为每个剧本登录一个单独的文件

python - 如何使 flask 神社使用python列表中的变量作为神社表达式变量

javascript - 使用带有 javascript 警报的 Jinja2 for 循环

python - Jinja2:在模板内渲染模板

ssh - Ansible 无法连接到 AWS EC2 实例

bash - 如何在 Ansible 中将 shell 函数作为命令运行?

linux - ansible 通过提供 IP 地址获取接口(interface)名称

Ansible 模板和神社 {%block%}

python - 如何从 Jinja 的列表中准确获取一个元素?

Python Flask Jinja2 模板 null 错误