繁体   English   中英

Ansible 和 git 与 SSH 密钥转发 - 有效,但有两个问题需要解决

[英]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=yesIdentityFile在远程系统上配置 ssh,以便它只使用代理中的那些特定密钥。

例如,在远程主机上的~/.ssh/config中,您可以这样写:

Host github.com
  IdentitiesOnly yes
  IdentityFile ~/my-key.pub

@larsks 对键的建议有效。 但我必须修复我正在做的两个错误:

  1. 由于没有become要使用的配置文件在root下,而不是在用户主目录下(在我的例子中是fritz )。
  2. 此时波浪号以错误的方式扩展(再次在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM