我的Ansible角色中有一些默认变量
sysproperties:
java_awt_headless:
key: "java.awt.headless"
value: "true"
enabled: "true"
java_iccprofile_path:
key: "java.iccprofile.path"
value: "image/iccprofiles"
enabled: "true"
...
...
它们应该最终以基于jinja2模板的XML文件结尾
{% for key, value in sysproperties.items() %}
<sysproperty key="{{ value.key }}" value="{{ value.value }}" enabled="{{ value.enabled }}"/>
{% endfor %}
要更改默认值之一,我实际上希望它可以像这样简单:
---
- name: run this
hosts: myTestHost
vars:
sysproperties.java_iccprofile_path.value: "somewhere/else"
roles:
- role: myRole
但是到目前为止,我只是发现我需要做一个额外的任务,只是更改此设置
pre_tasks:
- set_fact:
sysproperties: "{{ sysproperties | combine(new_item, recursive=true) }}"
vars:
new_item: "{ 'java_iccprofile_path': { 'value': 'somewhere/else' } }"
with_dict: "{{ sysproperties }}"
所以我的问题是:有没有更简单的方法?我是否应该将默认值安排得有些不同,以便更轻松地进行更改?
[编辑] 为了更清楚我的实际问题是什么:
我将设置存储在列表/字典中,以通过模板模块将其写入XML文件。 我喜欢使用我的角色的任何人都可以轻松更改或添加设置。最佳做法是什么?我现在是通过运行pre_task来正确执行此操作的方法,还是有更好的方法来执行此操作?
答案 0 :(得分:1)
您可以做的一件事情是在调用角色时覆盖变量。您可以在剧本中做到这一点:
---
- hosts: localhost
roles:
- {role: "myRole", sysproperties.java_iccprofile_path.value: "somwhere/else"}
...
希望这会有所帮助。
更新 嗯有趣。这是我的测试设置:
myRole
+ tasks
| + main.yml
+ vars
| + main.yml
+ testrole.yml
这是myRole / tasks / main.yml的内容
---
- name: Debugging
debug: var=foo
...
这是myRole / vars / main.yml的内容
---
foo: "blah"
...
这是testrole.yml的内容
---
- hosts: localhost
roles:
- myRole
...
如果我跑步
ansible-playbook ./testrole.yml
我明白了
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [defaults : Debugging] ****************************************************
ok: [localhost] => {
"foo": "blah"
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
如果我将testrole.yml更新为以下内容:
---
- hosts: localhost
roles:
- {role: "myRole", foo: "yuck"}
...
我明白了
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [defaults : Debugging] ****************************************************
ok: [localhost] => {
"foo": "yuck"
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
所以,我尝试了字典。
myRole / vars / main.yml:
---
sysproperties:
java_something_else:
key: "path"
java_iccprofile_path:
value: "i/am/here"
...
如果我将sysproperties.java_iccprofile_path.value:“ some / where / else”放入testrole.yml,它将失败。如果我在testrole.yml中具有以下内容,则可以正常工作:
---
- hosts: localhost
roles:
- {role: "myRole", sysproperties: {java_iccprofile_path: {value: "yuck"}}}
...
上面的输出是
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [defaults : Debugging] ****************************************************
ok: [localhost] => {
"sysproperties": {
"java_iccprofile_path": {
"value": "yuck"
}
}
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
如您所见,它替换了该值,但同时删除了其他值。
我发现here,更改hash_behavior的值以合并到ansible.cfg文件中将保留旧内容,并且只会覆盖您告诉它覆盖的内容。
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [defaults : Debugging] ****************************************************
ok: [localhost] => {
"sysproperties": {
"java_iccprofile_path": {
"value": "yuck"
},
"java_something_else": {
"key": "path"
}
}
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0