我有一个在 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/