Ansible动态参数var文件或带有jinja模板的广告资源模板

时间:2020-04-29 05:42:42

标签: ansible jinja2

我的目标是创建自动动态参数文件。 添加一些更改后会重新创建。 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:

运行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 }}

(..)

scheme.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:

我在方案中尝试了一个条件,但是双循环中的条件为空

scheme.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%}

这是此用例的简单解决方案吗? 可以在我的参数文件中添加非常规附加参数并重新创建它吗?

0 个答案:

没有答案