Ansible Jinja2模板转YAML时行合并空格问题求助
解决Ansible Template渲染YAML时caData与redirectURI同行问题
问题原因
渲染后caData内容与redirectURI挤在同一行,是因为YAML的|块字面量要求块内容以换行结尾来闭合块。如果你的caData变量本身没有末尾换行,或者模板中变量输出后没有预留换行,YAML解析器会把下一行的redirectURI当作caData块的一部分,导致格式异常。
解决方案
方案1:调整模板排版,给变量输出单独换行
修改cm.yaml.j2中caData的模板片段,用Jinja2的{%- ... %}控制模板空白,同时让每个变量输出单独占一行:
caData: | {%- if platform_name == 'gitops' and network_zone is defined and network_zone != '' %} {{ vars[ platform_name + '_' + network_zone + '_' + env + '_' + dc + '_sso_caData' ] }} {%- elif network_zone is defined and network_zone != '' %} {{ vars[ network_zone + '_' + env + '_' + dc + '_sso_caData' ] }} {%- elif platform_name == 'gitops' %} {{ vars[ platform_name + '_' + env + '_' + dc + '_sso_caData' ] }} {%- else %} {{ vars[ env + '_' + dc + '_sso_caData' ] }} {%- endif %} redirectURI: {% if platform_name == 'gitops' and network_zone is defined and network_zone != '' %}https://{{ vars[ platform_name + '_' + network_zone + '_' + env + '_' + dc + '_ingress_host' ] }}{% elif network_zone is defined and network_zone != '' %}https://{{ vars[ network_zone + '_' + env + '_' + dc + '_ingress_host' ] }}{% elif platform_name == 'gitops' %}https://{{ vars[ platform_name + '_' + env + '_' + dc + '_ingress_host' ] }}{% else %}https://{{ vars[ env + '_' + dc + '_ingress_host' ] }}{% endif %}/api/dex/callback
{%- ... %}会删除模板中语句前后的多余空白,避免渲染后出现无效空行,同时变量输出单独成行,自然在末尾生成换行,和redirectURI彻底分隔开。
方案2:强制给变量输出添加换行
在每个变量输出的末尾拼接\n,确保不管变量本身是否有换行,都强制添加一个结尾换行:
caData: | {% if platform_name == 'gitops' and network_zone is defined and network_zone != '' %}{{ vars[ platform_name + '_' + network_zone + '_' + env + '_' + dc + '_sso_caData' ] + '\n' }}{% elif network_zone is defined and network_zone != '' %}{{ vars[ network_zone + '_' + env + '_' + dc + '_sso_caData' ] + '\n' }}{% elif platform_name == 'gitops' %}{{ vars[ platform_name + '_' + env + '_' + dc + '_sso_caData' ] + '\n' }}{% else %}{{ vars[ env + '_' + dc + '_sso_caData' ] + '\n' }}{% endif %} redirectURI: {% if platform_name == 'gitops' and network_zone is defined and network_zone != '' %}https://{{ vars[ platform_name + '_' + network_zone + '_' + env + '_' + dc + '_ingress_host' ] }}{% elif network_zone is defined and network_zone != '' %}https://{{ vars[ network_zone + '_' + env + '_' + dc + '_ingress_host' ] }}{% elif platform_name == 'gitops' %}https://{{ vars[ platform_name + '_' + env + '_' + dc + '_ingress_host' ] }}{% else %}https://{{ vars[ env + '_' + dc + '_ingress_host' ] }}{% endif %}/api/dex/callback
方案3:确保caData变量本身以换行结尾
如果caData变量是从文件读取的,可以在定义变量时做处理,确保末尾有换行:
# 在变量定义或lookup时添加处理逻辑 sso_caData: "{{ lookup('file', 'ca.pem') | trim + '\n' }}"
trim会去掉变量前后的多余空白,再拼接\n强制添加结尾换行,从根源避免格式异常。
内容的提问来源于stack exchange,提问作者Surendar
相关产品推荐
相关产品推荐

