В файле шаблона Jinja, как загрузить сценарий bash для сценария запуска экземпляра

#deployment #google-cloud-platform #jinja2 #google-deployment-manager

#развертывание #google-облачная платформа #jinja2 #google-deployment-manager

Вопрос:

У нас есть шаблон container_instance_template.jinja , который определяет свойства нашего экземпляра для нашего менеджера развертывания GCP.

Для startup-script метатега у нас есть _startup-script.sh файл, который мы хотели бы загрузить. Но мы продолжаем получать ошибку загрузки шаблона.

Наш шаблон:

 resources:
- name: {{ IT_NAME }}
  type: compute.v1.instanceTemplate
  properties:
    properties:
      metadata:
        items:
        - key: gce-container-declaration
          value: |
            {{ GenerateManifest(env['name'], properties['port'],properties['dockerImage'], properties['dockerEnv'])|indent(12) }}
        - key: startup-script
          value: ????????????
  

Мы перепробовали все:

  key: startup-script
 value: |
  {{ properties['startupScript'] }}

# This one does not work, because as it's just the reference to the file, GCP doesn't pick up the contents and doesn't execute the script. As far as we understood, it should though, anyways.
  
 key: startup-script
 value: |
  {% include properties['startupScript'] %}

# This one does not work, because we get the error TemplateNotFound: ./_startup-script.sh
  

Это ошибка, которую мы получаем:

 - code: MANIFEST_EXPANSION_USER_ERROR
  location: /deployments/app/manifests/manifest-14723924
  message: |-
    Manifest expansion encountered the following errors: Exception in container_instance_template.jinja
    Traceback (most recent call last):
        return template.render(resource)
        return self.environment.handle_exception(exc_info, True)
        reraise(exc_type, exc_value, tb)
      File "<template>", line 22, in top-level template code
        raise TemplateNotFound(template)
    TemplateNotFound: ./_startup-script.sh
     Resource: container_instance_template.jinja Resource: config
  

В нашей последней попытке мы пытались создать функцию Python и импортировать ее в шаблон, но безуспешно:

 # container_instance_template.jinja
imports:
- path: helpers.py 
- path: properties['startupScript']

# And then using:

{{ include_file(properties['startupScript']) }}


# helpers.py

import jinja2

def include_file(name):
    return jinja2.Markup(loader.get_source(env, name)[0])

loader = jinja2.PackageLoader(__name__, 'templates')
env = jinja2.Environment(loader=loader)
env.globals['include_file'] = include_file
  

Мы не можем найти никаких примеров GCP, руководства, документации или чего-либо еще. Если мы встроим скрипт bash, он сработает, но тогда это хакерское решение.

Мы перепробовали все типы ссылок на файл. Он есть, другие файлы работают нормально.

Ответ №1:

Как насчет добавления сценария запуска в файл yaml, а не в jinja, как показано ниже: imports:

- путь: instance.jinja
- путь: ../startup-script.sh
имя: startup-script.sh

Ресурсы:
- имя: my-
тип экземпляра: instance.jinja
свойства:
 метаданные из файла:
сценарий запуска: startup-script.sh
зона: ZONE_TO_RUN

Ответ №2:

Вы пробовали изменить тег метаданных «startup-script» на «startup-script-url» и привязать к месту хранения Google cloud? Что-то вроде:

 resources:
- name: {{ IT_NAME }}
  type: compute.v1.instanceTemplate
  properties:
    properties:
      metadata:
        items:
        - key: gce-container-declaration
          value: |
            {{ GenerateManifest(env['name'], properties['port'],properties['dockerImage'], properties['dockerEnv'])|indent(12) }}
        - key: startup-script-url
          value: gs:project/bucket/yourscript.sh
  

Убедитесь, что вы предоставили виртуальной машине соответствующее разрешение на доступ к корзине облачного хранилища Google.

Ознакомьтесь с этой статьей Google для получения более подробной информации о других способах реализации этого.

Ответ №3:

В репозитории git из Google найдена ошибка. Эта досадная вещь стоила мне двух часов, чтобы разобраться. Правильный пример можно найти здесь:

 metadata:
  items:
  {% for key, value in properties['metadata-from-file'].iteritems() %}
  - key: {{ key }}
    value: |
      {{ imports[value]|indent(10) }}
{% endfor %}
  

Обязательно поместите следующее в свой файл config.yaml:

 imports:
- path: instance.jinja
- path: ../startup-script.sh
  name: startup-script.sh

resources:
- name: my-instance
  type: instance.jinja
  properties:
    metadata-from-file:
      startup-script: startup-script.sh
    zone: ZONE_TO_RUN