0070 — Типы переменных в GitLab CI/CD
Описание
В документации GitLab не очень понятно описаны различия между переменными и файлами. Рассмотрим на нескольких примерах.
Допустим, часть плейбука выглядит так:
variables:
SSH_USER: 'admin'
SSH_HOST: '192.168.0.1'
# ...
deploy_job:
stage: deploy
image: "debian:stable"
before_script:
- apt-get update && apt-get install openssh-client --yes
script:
- eval "$(ssh-agent -s)"
- mkdir -p ~/.ssh/
- ssh-keyscan $SSH_HOST >> ~/.ssh/known_hosts
Пока всё просто:
SSH_USER— имя пользователя для подключения по SSH;SSH_HOST— IP-адрес нужного сервера.
В задачах delpoy_job происходит следующее:
- Обновляем список пакетов и устанавливаем клиент OpenSSH.
-
Запускаем
ssh-agent.Это такая специальная служба, которая держит в памяти приватные ключи SSH и выдаёт их клиенту SSH при необходимости.
-
Получаем от сервера список отпечатков публичных ключей.
Этот шаг нужен для того, чтобы при подключении клиент SSH не зависал на вопросе о подключении к серверу.
Переменные SSH_USER и SSH_HOST, кстати, можно вынести в настройки проекта на уровне GitLab, а секцию variables убрать из плейбука полностью.
Приватный ключ SSH
Что же делать с приватным ключом SSH? Как получить доступ к нему?
- Перейдите на страницу проекта в GitLab.
- На панели навигации выберите Настройки → CI/CD.
- Разверните раздел Переменные и нажмите кнопку [ Добавить переменную ].
-
Заполните форму:
- Тип: Файл.
- Ключ: название переменной, которое будет использоваться в плейбуке. Рекомендую указать здесь
SSH_PRIVATE_KEY. - Значение: содержимое файла с приватным ключом SSH.
- Нажмите кнопку [ Добавить переменную ].
Вернёмся к плейбуку. Переменная у нас есть. Как теперь получить к ней доступ?
# ...
deploy_job:
stage: deploy
image: "debian:stable"
before_script:
- apt-get update && apt-get install openssh-client --yes
script:
- eval "$(ssh-agent -s)"
- mkdir -p ~/.ssh/
- ssh-keyscan $SSH_HOST >> ~/.ssh/known_hosts
- chmod 600 $SSH_PRIVATE_KEY
- ssh-add $SSH_PRIVATE_KEY
# ...
Здесь уже немного интереснее. Теперь значения переменных SSH_HOST и SSH_USER будут браться не из плейбука, а из настроек проекта на уровне GitLab.
Переменная SSH_PRIVATE_KEY типа Файл при этом хранит в себе не содержимое файла, а путь к нему. Т. е. если вы попытаетесь вывести значение переменной с помощью echo, получите что-то такое:
/home/runner/project/tmp.fi213954ds
Внутри этого файла будет нужное содержимое. Теперь достаточно настроить режим доступа к файлу так, как того требует SSH.
Итоги
Если совсем просто, то:
- Переменные содержат значения и используются «как есть».
- Файлы создаются динамически, а соответствующие переменные содержат пути к ним.