使用 Ansible 构建属性文件,如果值不存在,则不应添加该属性

使用 Ansible 构建属性文件,如果值不存在,则不应添加该属性

我正在尝试使用模板在 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 %}

相关内容