与基于字典的默认变量一起使用

时间:2018-12-11 11:30:03

标签: ansible jinja2 ansible-template

我的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来正确执行此操作的方法,还是有更好的方法来执行此操作?

1 个答案:

答案 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