我正在尝试使用模板在 Ansible 中构建具有强制和可选属性的属性文件。
我希望每个本质上静态的字符串(每个可选属性名称)仅在关联属性值存在时(来自 Ansible 变量)才显示
现在,我的 ansible 模板如下所示:
# Mandatory Properties
ManProperty1={{ ManProperty1_value }}
ManProperty2={{ ManProperty2_value }}
# Optional Properties
OptProperty1={{ OptProperty1_value }}
OptProperty2={{ OptProperty2_value }}
但是应用程序本身对所有可选属性都有硬编码值,并且我只希望在关联变量存在的情况下将“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 中肯定有更好的解决方案。我发现最接近的解决方案是 ansible 过滤,但我找不到任何与显示/隐藏模板文本相关的内容。
最后说明:我确实有一个黑客式的备份解决方案 - 我取出每一行property=value
并使变量等于整个字符串。但这感觉完全没有抓住模板的要点,因为变量中存储了如此多的静态文本。
答案1
首先,这不是 Ansible 的问题,而是如何使用 Jinja2 模板语言的问题(作为严格的编程问题,应该在 StackOverflow 而不是 ServerFault 上询问)。
前往Jinja2 声明if
文档您将找到适合您情况的确切例子:
Jinja 中的语句
if
与 Pythonif
语句类似,最简单的形式是,你可以用它来测试变量是否定义、是否不为空、是否为 false。
以下是如何自定义的示例:
{% if OptProperty2_value %}OptProperty2={{ OptProperty2_value }}{% endif %}