2016-03-21 71 views
2

試圖用YAML和神社使用谷歌部署管理器與一個多變量,如:谷歌部署管理:MANIFEST_EXPANSION_USER_ERROR多變量

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

ERROR: (gcloud.deployment-manager.deployments.create) Error in Operation operation-1432566282260-52e8eed22aa20-e6892512-baf7134:

MANIFEST_EXPANSION_USER_ERROR
Manifest expansion encountered the following errors: while scanning a simple key in "" could not found expected ':' in ""

試過(並失敗):

{% 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 %} 

回答

3

問題是YAML和金賈的組合。 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 %} 

把它在這裏,因爲有沒有太大的Q &用於谷歌部署管理器材料。

0

Jinja沒有乾淨的方法來做到這一點。正如你自己所指出的那樣,因爲YAML是一個對空白敏感的語言,所以很難有效地進行模板化。

一個可能的破解是將字符串屬性拆分爲列表,然後迭代列表。

例如,提供物業:

startup-script: | 
    #!/bin/bash 
    python -m SimpleHTTPServer 8080 

您可以在神社模板中使用它:

{% 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'] 
    }] 
} 

python模板的一個示例可以在Metadata From File示例中找到。

+0

想象一下,這就是我最終做的! (作爲一個數組傳遞腳本,每行一個項目) –