ansible git pull без сохранения пароля на сервере

При простом использовании командной строки основной стратегией было бы использование кеша помощника по учетным данным git:

git config --global credential.helper cache
git config --global credential.username {{ gituser }}
git pull {{ repository1 }}
... asks password
... pulls
git pull {{ repository2 }}
... pulls
... etc.

Но если Я использую модуль ansible git, подсказки не работают (да и не практично). Единственное решение, которое я сейчас вижу, - это использовать:

- git: repo=https://{{ gituser }}:{{ gitpass }}@{{ repo_url }} dest={{ dest }}

Где я получаю gituser и gitpass с использованием vars_prompt: или из локального защищенного хранилища ansible. Однако у этого есть несомненный побочный эффект, заключающийся в том, что он сохраняет пароль в {{dest}} /. Git / config в виде обычного текста, чего я бы хотел избежать.

Есть ли способ установить пароль от ansible на время запуска playbook, но не для хранения его на сервере?

0
задан 18 April 2016 в 14:54
2 ответа

Есть ли способ установить пароль из доступного на время запуска плейбука, но не хранить его на сервере?

ansible git [ Модуль 1159190] в настоящее время не имеет возможности указать, что пароль является эфемерным, то есть гарантировать его удаление из каталога .git после клонирования вышестоящего репозитория.

Вы можете "взломать" это путем вызова модуля command после вызова модуля git , чтобы удалить вышестоящий пульт из конфигурации репозитория, что, очевидно, удалит все секреты. Это означает, что секрет временно сохраняется на хосте во время операции извлечения -это может не подходить в зависимости от модели угрозы, над которой вы работаете.


Лучший способ?

В этих сценариях аутентификация ключа SSH выходит на первый план, согласно комментарию EEAA . Если вы можете пройти аутентификацию в своем git upstream с помощью SSH, вы можете использовать пересылку агента SSH в сеансе Ansible для передачи вашего агента SSH с управляющего хоста на целевой сервер.

Это надежный метод совместного использования учетных данных, который выживает только на время сеанса, поэтому долгосрочные риски сохранения секретов на удаленном хосте сводятся к минимуму.

1
ответ дан 4 December 2019 в 16:38

В конце концов, я выбрал решение, подобное тому, которое упоминает @CosmicOssifrage. Основное отличие состоит в том, что git remote remove origin недостаточно для удаления всех секретов,поскольку пароль записан в различные файлы в .git / logs / . Итак, в конце я просто создал включаемый файл, который вызывает sed для устранения беспорядка:

- name: git password cleanup
  shell: cd {{ git_dir }}/.git ; sed -i 's/https:\/\/{{ gituser }}:{{ gitpass }}@/https:\/\/{{ gituser }}@/' config logs/HEAD logs/refs/heads/* logs/refs/remotes/*/*

Это называется примерно так:

- git: repo={{ repository }} dest=/var/www/
- include: ../../library/git_password_cleanup.yml git_dir=/var/www/

Что не удается решить, так это то, что если проверка git по какой-то причине завершается неудачно, следующая команда не будет быть запущенным, оставив там учетные данные. Решение было бы довольно неудобным с текущей тактикой обработки возможных сбоев, поэтому я решил пойти на этот риск.

0
ответ дан 4 December 2019 в 16:38

Теги

Похожие вопросы