Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

It is not possible to concatenate several environment variables into one value #72

Closed
shulutkov opened this issue Jan 11, 2019 · 7 comments
Labels
enhancement New feature or request P2 Low priority

Comments

@shulutkov
Copy link
Contributor

Привет.
Столкнулся с невозможностью одновременного использования нескольких переменных окружения при объявлении переменной в config.yaml. Небольшой пример:
Мы при развертывании сервиса иногда создаем более одного деплоя, registry используем как приватные так и публичные, да еще и registry приватных у нас несколько. Так же при каждом деплое у нас выбирается образ по тэгу в git. Для того, что бы не создавать множество шаблонов деплоя, мы сделали один универсальный, в цикле которого добавляем все необходимые образы. По этому все образы объявляются в config.yaml

common:
  deployments:
    service_name:
      containers:
        app:
          image: "{{ env='CI_REGISTRY' }}/service-image:{{ env='TAG' }}"
        nginx:
          image: "{{ env='CI_REGISTRY' }}/custom-nginx:configmap"

Так вот при такой записи в случае с образом nginx все ОК, в случае с контейнером app после создания манифеста имеем "{{ env='CI_REGISTRY' }}/service-image:1.0.0". Заглянул в код и понял, что в текущей реализации не получится из нескольких переменных окружения получить нужное нам имя образа.

@rvadim
Copy link
Collaborator

rvadim commented Jan 14, 2019

Привет. Спасибо за PR. Тем не менее, не до конца понятно почему нельзя объявить 3 переменные:
registry, path, tag и делать конкатенацию внутри 1го шаблона? Поясни пожалуйста.

@shulutkov
Copy link
Contributor Author

Изначально так и делали

...
  containers:
    - name: nginx
      image: nginx
      ...
    - name: app
      image: {{ registry }}/{{ path }}:{{ tag }}
      ...
...

Для большинства сервисов подобного шаблона достаточно, но в последнее время у нас начали появляться сервисы в которых по 3-5 контейнеров в одном деплое. Для каждого сервиса необходимо было писать свой шаблон, описывая все контейнеры. Из-за этого объем работы увеличивался и весь смысл шаблонизации пропадал (быстрее написать статичный манифест, собственно с чего все и начиналось).
Тогда решили заполнять контейнеры в цикле, что повлекло за собой перенос списка контейнеров в конфиг.

containers:
  {%- for name, c_opts in deploy_opts.containers.items() -%}
  - name: {{ name }}
    image: {{ c_opts.image }}
    ...
  {%- endfor %}
staging:
  deployments:
    service_name:
      containers:
        app:
          image: "{{ env='CI_REGISTRY' }}/{{ service_name }}:{{ env='APP_TAG' }}"
          ...
        nginx:
          image: nginx
          ...

И вот тут возникает проблема из-за того, что часть контейнеров находятся в других регистри и перенести переменную регистри с тэгом в шаблон становится зубодробительным с описанием множества условий. А возможности конкатенации строк из нескольких переменных окружения невозможна, что значительно бы упрощала шаблон. Ну и как писал изначально, у нас несколько приватных регистри и в зависимости от ДЦ используется конкретный, определенный в глобальной переменной CI_REGISTRY GitLab-а. И в текущей реализации количество шаблонов приближается к количеству сервисов и k8s-handle становится больше похож по функционалу на envsubst.

@shulutkov
Copy link
Contributor Author

Сейчас у нас в каждом ДЦ один и тот же образ k8s-handle, вместе с шаблонами по одному для каждого типа манифестов.

@rvadim
Copy link
Collaborator

rvadim commented Jan 14, 2019

Хорошо, я очень хочу помочь и добавить этот функционал, но помоги мне разобраться пожалуйста.
Если я сделаю вот так, это решит проблему?

staging:
  deployments:
    service_name:
      containers:
        app:
          registry: "{{ env='CI_REGISTRY' }}"
          path: service-path
          tag: "{{ env='APP_TAG' }}"
          ...
        nginx:
          image: nginx
          ...
containers:
  {%- for name, c_opts in deploy_opts.containers.items() -%}
  - name: {{ name }}
    image: "{{ c_opts.registry | defult('default-registry') }}/{{ c_ops.path }}:{{ c_ops.tag}}"
    ...
  {%- endfor %}

@shulutkov
Copy link
Contributor Author

в таком случае для контейнера nginx

containers:
  - name:
    image: /nginx:

"invalid reference format", как следствие контейнер с nginx не запустится. Можно прописывать логику с if else, но получится как я уже писал "зубодробительно".

@dekhtyarev
Copy link
Collaborator

Вышло в релизе https://github.com/2gis/k8s-handle/releases/tag/0.3.3

@rvadim
Copy link
Collaborator

rvadim commented Jan 18, 2019

@otherNoscript спасибо за PullRequest и интерес к проекту!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request P2 Low priority
Projects
None yet
Development

No branches or pull requests

3 participants