我的目标是创建自动动态参数文件。 添加一些更改后会重新创建。 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%}
这是此用例的简单解决方案吗? 可以在我的参数文件中添加非常规附加参数并重新创建它吗?