当简单地使用命令行时,主要策略是使用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.
但是,如果我使用不可靠的git模块,则提示不起作用(也不实际)。 我目前看到的唯一解决scheme是使用:
- git: repo=https://{{ gituser }}:{{ gitpass }}@{{ repo_url }} dest={{ dest }}
在哪里使用vars_prompt:获得gituser和gitpass ,或者来自安全的本地安全存储。 但是,这具有非破坏性的副作用,它以明文forms将密码存储在{{ dest }}/.git/config /。git {{ dest }}/.git/config中,我想避免这种情况。
有没有办法在剧本运行的时候设置密码,而不是将其存储在服务器上?
有没有办法在剧本运行的时候设置密码,而不是将其存储在服务器上?
当前没有办法指定密码是短暂的,也就是说,确保在克隆上游存储库之后,将其从.git目录中删除。
你可以通过在调用git模块之后调用command模块来“破解”这个模块,以从存储库configuration中删除上游远程服务器,这显然会消除任何秘密。 这确实意味着在提取操作期间将秘密临时存储在主机上 – 这可能不适合,具体取决于您正在使用的威胁模型。
根据EEAA的评论 ,这些场景是SSH密钥authentication的 首要位置 。 如果您可以使用SSH对git上游进行身份validation,则可以在您的Ansible会话中使用SSH代理转发,将SSH代理从控制主机传递到目标服务器。
这是一种稳健的凭证共享方法,只在会话期间存活,所以远程主机上留下的秘密的长期风险被最小化。
最后,我使用了类似于@CosmicOssifrage的解决scheme。 主要区别在于, git remote remove origin不足以清除所有秘密,因为密码被写入到.git/logs/各种文件中。 所以最后我创build了一个调用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由于某种原因失败,那么下一个命令将不会运行,从而将凭据留在那里。 目前的解决办法是非常尴尬的,因此我决定采取这种风险。