При простом использовании командной строки основной стратегией было бы использование кеша
помощника по учетным данным 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, но не для хранения его на сервере?
Есть ли способ установить пароль из доступного на время запуска плейбука, но не хранить его на сервере?
ansible
git [ Модуль 1159190] в настоящее время не имеет возможности указать, что пароль является эфемерным, то есть гарантировать его удаление из каталога
.git
после клонирования вышестоящего репозитория.
Вы можете "взломать" это путем вызова модуля command
после вызова модуля git
, чтобы удалить вышестоящий пульт из конфигурации репозитория, что, очевидно, удалит все секреты. Это означает, что секрет временно сохраняется на хосте во время операции извлечения -это может не подходить в зависимости от модели угрозы, над которой вы работаете.
В этих сценариях аутентификация ключа SSH выходит на первый план, согласно комментарию EEAA . Если вы можете пройти аутентификацию в своем git upstream с помощью SSH, вы можете использовать пересылку агента SSH в сеансе Ansible для передачи вашего агента SSH с управляющего хоста на целевой сервер.
Это надежный метод совместного использования учетных данных, который выживает только на время сеанса, поэтому долгосрочные риски сохранения секретов на удаленном хосте сводятся к минимуму.
В конце концов, я выбрал решение, подобное тому, которое упоминает @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 по какой-то причине завершается неудачно, следующая команда не будет быть запущенным, оставив там учетные данные. Решение было бы довольно неудобным с текущей тактикой обработки возможных сбоев, поэтому я решил пойти на этот риск.