我试图build立一个属性文件与强制性和可选属性Ansible与模板。
我希望每个基本上静态的string(每个可选的属性名称)只有在相关的属性值存在时才会显示(来自Ansiblevariables)
现在,我的模板看起来像这样:
# Mandatory Properties ManProperty1={{ ManProperty1_value }} ManProperty2={{ ManProperty2_value }} # Optional Properties OptProperty1={{ OptProperty1_value }} OptProperty2={{ OptProperty2_value }}
但是,应用程序本身已经为所有可选属性设置了硬编码值,而且如果存在相关的variables,我只希望将“property = value”行从模板写入到属性文件中。
所以继续上面的模板,如果我设置为环境X(group_vars)
ManProperty1_value = myManValue1 ManProperty2_value = myManValue2 OptProperty1_value = myOptValue1
但不要设置
OptProperty2_value
我想要的模板输出到部署的文件是:
# Mandatory Properties ManProperty1=myManValue1 ManProperty2=myManValue2 # Optional Properties OptProperty1=myOptValue1
Ansible对此必须有一个更好的解决scheme。 我发现最接近的是有效的过滤,但是我找不到与显示/隐藏模板文本相关的任何内容。
最后说明:我确实有一个黑客式的备份解决scheme – 我取每行property=value ,并使variables等于整个string。 但是,这感觉就像完全没有存储在variables中的静态文本的模板一样。
首先,这不是一个Ansible问题,如何使用Jinja2模板语言(作为一个严格的编程问题,应该在StackOverflow而不是ServerFault上询问)。
前往Jinja2文档if语句 ,你会发现一个确切的例子为您的情况:
Jinja中的
if语句与Pythonif语句相似。 用最简单的forms,你可以用它来testing一个variables是否被定义,而不是空的而不是假的。
下面是一个应该如何定制的例子:
{% if OptProperty2_value %}OptProperty2={{ OptProperty2_value }}{% endif %}