2016-03-21 5 views
2

Попытки использовать менеджер развертывания Google с YAML и Джинджей с многострочным переменными, такими как:развертывание Google менеджер: 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

Решение: Pass переменная многострочный как массив

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 & Материал для менеджера развертывания Google.

0

В Джиндже нет чистого способа сделать это. Как вы сами указали, потому что 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'] 
    }] 
} 

Пример шаблона питона можно найти в Metadata From File примере.

+0

Нарисовано столько же, это то, что я закончил делать! (передача скрипта в виде массива, с каждой строкой - элемент) –

Смежные вопросы