Описание

В документации 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 происходит следующее:

  1. Обновляем список пакетов и устанавливаем клиент OpenSSH.
  2. Запускаем ssh-agent.

    Это такая специальная служба, которая держит в памяти приватные ключи SSH и выдаёт их клиенту SSH при необходимости.

  3. Получаем от сервера список отпечатков публичных ключей.

    Этот шаг нужен для того, чтобы при подключении клиент SSH не зависал на вопросе о подключении к серверу.

Переменные SSH_USER и SSH_HOST, кстати, можно вынести в настройки проекта на уровне GitLab, а секцию variables убрать из плейбука полностью.

Приватный ключ SSH

Что же делать с приватным ключом SSH? Как получить доступ к нему?

  1. Перейдите на страницу проекта в GitLab.
  2. На панели навигации выберите Настройки → CI/CD.
  3. Разверните раздел Переменные и нажмите кнопку [ Добавить переменную ].
  4. Заполните форму:

    • Тип: Файл.
    • Ключ: название переменной, которое будет использоваться в плейбуке. Рекомендую указать здесь SSH_PRIVATE_KEY.
    • Значение: содержимое файла с приватным ключом SSH.
  5. Нажмите кнопку [ Добавить переменную ].

Вернёмся к плейбуку. Переменная у нас есть. Как теперь получить к ней доступ?

# ...
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.

Итоги

Если совсем просто, то:

  • Переменные содержат значения и используются «как есть».
  • Файлы создаются динамически, а соответствующие переменные содержат пути к ним.