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