Google部署管理器:MANIFEST_EXPANSION_USER_ERROR多行变量

时间:2016-03-21 13:35:35

标签: google-compute-engine

尝试将带有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 %}

2 个答案:

答案 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模板的示例。