[英]Ansible and git with SSH key forwarding - works, but with two problems to solve
我有一个 Ansible 任务,它使用 SSH 密钥转发签出 git 回购协议,并且它有效。 但是我想解决两个问题。
首先快速回顾一下我的配置:
ansible_ssh_common_args: '-o ForwardAgent=yes -o PreferredAuthentications=publickey'
在我的清单中.ssh/config
中的ForwardAgent yes
ssh-agent
正确加载了所有相关密钥(编辑以添加我最初忘记提及的这一点)
- name: Fix sudoers for git clone
tags: user
when: is_linux
lineinfile:
path: /etc/sudoers
state: present
regexp: '.*SSH_AUTH_SOCK$'
line: 'Defaults env_keep += "SSH_AUTH_SOCK"'
validate: '/usr/sbin/visudo -cf %s'
(结束编辑)
任务很简单:
- name: Clone project repositories
tags: repos
# become: true -- this breaks key forwarding
# become_user: fritz
git:
repo: 'git@bitbucket.org:{{ item.user }}/{{ item.name }}'
dest: '{{ workareas }}/{{ item.folder }}/{{ item.name }}'
accept_hostkey: yes
force: no
with_items: '{{ repositories }}'
第一个问题:它确实有效,但是当我添加become/become_user
密钥转发时不再启用:尝试安装在堡垒主机上的密钥(当然这会失败)。 这对我来说不是什么大问题:没有become
Ansible 会创建所有权错误的回购协议,但我会在以后的任务中修复它。 更重要的是了解 Ansible 的工作原理。
第二个问题更为重要。 由于多种原因,我的客户端上有大量密钥:如果没有特定配置, ssh
客户端会以不可预测的顺序提交它们,通常我会导致服务器因“ too many authentication failures
”而中止。 将密钥与主机的特定关联放入.ssh/config
中可以解决问题:
Host bitbucket.org
IdentityFile ~/.ssh/fritz@Mistral-bitbucket
但这仅在直接从客户端运行git
时有效; 使用 Ansible 它不起作用,它仍然会尝试所有的键。 目前我很幸运,并且提前提交了正确的密钥,但不能保证它会一直这样。
基本上问题是:是否可以在堡垒主机上强制执行密钥转发和.ssh/config
文件?
谢谢。
...更多的是了解 Ansible 的工作原理。
使用ssh
手动连接到您的远程主机,然后运行sudo -u root ssh-add -l
,您将看到您的代理无法访问。 这是预期的行为——像SSH_AUTH_SOCK
这样的环境变量在默认情况下不会跨越权限升级边界(这正是您使用become: true
时的情况)。
手动运行sudo
,我们可以通过显式保留SSH_AUTH_SOCK
环境变量来解决这个问题。 与前面的命令不同,这应该有效:
sudo -u root --preserve-env=SSH_AUTH_SOCK ssh-add -l
通过在 ansible.cfg 中设置become_flags
配置变量,我们可以让ansible.cfg
使用相同的选项运行sudo
:
[privilege_escalation]
become_flags = --preserve-env=SSH_AUTH_SOCK
有了这个配置,我们现在可以成功运行类似的东西:
ansible remotehost --become -a 'ssh-add -l'
基本上问题是:是否可以在堡垒主机上强制执行密钥转发和
.ssh/config
文件?
如果您将公钥复制到远程服务器,您应该能够使用IdentitiesOnly=yes
和IdentityFile
在远程系统上配置 ssh,以便它只使用代理中的那些特定密钥。
例如,在远程主机上的~/.ssh/config
中,您可以这样写:
Host github.com
IdentitiesOnly yes
IdentityFile ~/my-key.pub
@larsks 对键的建议有效。 但我必须修复我正在做的两个错误:
become
要使用的配置文件在root
下,而不是在用户主目录下(在我的例子中是fritz
)。root
下),因此必须使用到 home root 的显式路径。总结这项任务以适当的方式准备事情。
感谢@larsks。
- name: Create SSH config file for root
tags: repos
copy:
dest: '/root/.ssh/config'
content: |
Host bitbucket.org
IdentityFile /home/fritz/.ssh/fritz@{{ ansible_hostname|capitalize }}-bitbucket
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.