ANSIBL с переменными по умолчанию на основе словаря - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть некоторые переменные по умолчанию в моей роли 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"
...
...

И они должны оказаться в файле XML на основе шаблона jinja2

{% 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 голосов
/ 11 декабря 2018

Одна из вещей, которую вы можете сделать, это переопределить переменную при вызове роли.Вы можете сделать это в своей игровой книге:

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

Как видите, он заменил значение, ноон также удалил другие значения.

Я обнаружил здесь , что изменение значения 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   
...