Ansible динамические c файлы параметров var или шаблон инвентаря с шаблонами jinja - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть цель создать файл параметров автоматизированного c dynamici c. Это воссоздать, когда некоторые изменения были добавлены. Это не обычная структура с yaml. Некоторые переменные хоста имеют дополнительные параметры. В моем случае использования мы можем добавить новый экземпляр tomcat для одного из приложений.

param.yml

db:
  env:
    proxy1:
      host1:
        tomcat1:
        tomcat2:
    proxy2: 
      host1:
        tomcat1:
          parameter_one: xxx
          parameter_two: xyz
        tomcat2:
    proxy3: 
      host1:
        tomcat1:
        tomcat2:
        tomcat3:

run ansible:

ansible-playbook playbook.yml --extra_vars "server_proxy=proxy3 server_tomcat=tomcat4 server_name=host1" 

playbook.yml Создание частей конфигурации, а затем сборка.

(...)
- template:
    src: scheme.j2
    dest: "parts/proxy_{{item}}"
  with_items:
    - {{ proxy_list }}

(..)

схема.j2

{{item| indent(2, True)}}:
{% for servername in  db.env[item] | list  %}
{{ servername | indent(4, True) }}:
{% for tomcats in db.env[item][servername] | list %}
{{ tomcats|indent(6, True) }}:
{% endfor %}
{% if server_proxy == item and server_name==servername %}
{% for tomcat in tomcat_list %}
{{tomcat|indent(6, True)}}: 
{% endfor %}
{% endif %}
{% endfor%}

Приведенная выше схема воссоздает все без дополнительных параметров.

ожидаемые результаты _newparam.yml

db:
  env:
    proxy1:
      host1:
        tomcat1:
        tomcat2:
    proxy2: 
      tomcat1:
        parameter_one: xxx
        parameter_two: xyz
      tomcat2:
    proxy3: 
      tomcat1:
      tomcat2:
      tomcat3:
      tomcat4:

Я получаю результат:

db:
  env:
    proxy1:
      host1:
        tomcat1: **without**
        tomcat2:
    proxy2: 
      tomcat1:

      tomcat2:
    proxy3: 
      tomcat1:
      tomcat2:
      tomcat3:
      tomcat4:

Я был попробуйте условное в схеме, но условное в двойном l oop для пусто

схема.j2

{{item| indent(2, True)}}:
{% for servername in  db.env[item] | list  %}
{{ servername | indent(4, True) }}:
{% for tomcats in db.env[item][servername] | list %}
{{ tomcats|indent(6, True) }}:
{% endfor %}
{% if server_proxy == item and server_name==servername %}
{% for tomcat in tomcat_list %}
{{tomcat|indent(6, True)}}:  
   {% if item == "proxy1" %}{% set additonal= db.env.proxy1.host1.tom1 | dict2items %} 
   {{additional}}{% endif %}

{% endfor %}
{% endif %}
{% endfor%}

Это просто разрешение для этого варианта использования ? Можно ли добавить нерегулярные дополнительные параметры в мой файл параметров и воссоздать его?

...