序言:我意识到这个问题是Ansible。 覆盖单个字典键非常相似,但它并不相同,那里的答案都没有回答我的特定问题或适用于我的用例。
我正在尝试安装Dataverse,它提供了一个可识别的角色(https://github.com/IQSS/dataverse-ansible(。我正在将它与多个其他角色一起使用。
roles/dataverse-ansible/defaults/main.yml
中有变量,例如:
dataverse:
adminpass: admin1
allow_signups: true
glassfish:
user: payara
logformat: ulf
siteurl:
综上所述,我只想重新定义dataverse.glassfish.siteurl
.所以我试图插入我的group_vars/all
:
dataverse.glassfish.siteurl: "my_site_address"
但是,这dataverse.glassfish.siteurl
空的。
从上面的问题中,我发现我可以在我的group_vars/all
中陈述以下内容
dataverse:
glassfish:
siteurl: "my_site_address"
并在我的ansible.cfg
中陈述hash_behaviour=merge
,它有效,但这种做法似乎不受欢迎。
我的问题是:覆盖这些变量的首选方法是什么。如果可能的话,我不想更改上游角色代码,所以请不要说重新定义roles/dataverse-ansible/defaults/main.yml
在其中包含siteurl: {{user_defined_site_url}}
。
- set_fact:
dataverse: >-
{%- set _ = dataverse.glassfish.update({
"siteurl": user_defined_site_url}) -%}
{{ dataverse }}
其中set _ =
部分是因为 Ansible 显然禁用了do
动词,因此分配给任何内容是在 jinja2 模板中具有副作用的操作的唯一方法