#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