尝试将带有YAML和Jinja的Google部署管理器与多行变量一起使用,例如:
startup_script_passed_as_variable: |
line 1
line 2
line 3
后来:
{% if 'startup_script_passed_as_variable' in properties %}
- key: startup-script
value: {{properties['startup_script_passed_as_variable'] }}
{% endif %}
提供MANIFEST_EXPANSION_USER_ERROR
:
错误:(gcloud.deployment-manager.deployments.create)错误 操作操作-1432566282260-52e8eed22aa20-e6892512-baf7134:
MANIFEST_EXPANSION_USER_ERROR
清单扩展遇到以下错误:扫描“”中的简单键无法找到预期的':'在“”
尝试(并失败):
{% if 'startup_script' in properties %}
- key: startup-script
value: {{ startup_script_passed_as_variable }}
{% endif %}
也
{% if 'startup_script' in properties %}
- key: startup-script
value: |
{{ startup_script_passed_as_variable }}
{% endif %}
和
{% if 'startup_script' in properties %}
- key: startup-script
value: |
{{ startup_script_passed_as_variable|indent(12) }}
{% endif %}
答案 0 :(得分:3)
问题在于YAML和Jinja的结合。 Jinja转义变量但是没有像YAML作为变量传递时那样缩进它。
相关:https://github.com/saltstack/salt/issues/5480
解决方案:将多行变量作为数组传递
startup_script_passed_as_variable:
- "line 1"
- "line 2"
- "line 3"
如果您的值以#开头(GCE上的启动脚本,即#!/ bin / bash),引用很重要,因为否则会将其视为注释。
{% if 'startup_script' in properties %}
- key: startup-script
value:
{% for line in properties['startup_script'] %}
{{line}}
{% endfor %}
{% endif %}
将其放在此处,因为Google Deployment Manager没有太多Q& A材料。
答案 1 :(得分:0)
在金贾没有干净的方法。正如您自己指出的那样,因为YAML是一种对空白敏感的语言,所以很难有效地模板化。
一种可能的方法是将字符串属性拆分为一个列表,然后遍历列表。
例如,提供属性:
startup-script: |
#!/bin/bash
python -m SimpleHTTPServer 8080
您可以在Jinja模板中使用它:
{% if 'startup_script' in properties %}
- key: startup-script
value: |
{% for line in properties['startup-script'].split('\n') %}
{{ line }}
{% endfor %}
这里也是full working example。
这种方法可行,但一般情况下人们开始考虑使用python模板。因为您正在使用python中的对象模型,所以您不必处理缩进问题。例如:
'metadata': {
'items': [{
'key': 'startup-script',
'value': context.properties['startup_script']
}]
}
可以在Metadata From File示例中找到python模板的示例。