Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 使用Ansible的SSH代理转发_Git_Ssh_Ansible_Ssh Agent - Fatal编程技术网

Git 使用Ansible的SSH代理转发

Git 使用Ansible的SSH代理转发,git,ssh,ansible,ssh-agent,Git,Ssh,Ansible,Ssh Agent,我将Ansible 1.5.3和Git与ssh代理转发()一起使用。我可以登录到使用Ansible管理的服务器,并测试我与git的连接是否正确配置: ubuntu@test:~$ ssh -T git@github.com Hi gituser! You've successfully authenticated, but GitHub does not provide shell access. 我还可以使用这个帐户克隆和更新我的一个repo,这样我的git配置看起来很好,并且在我直接通过s

我将Ansible 1.5.3和Git与ssh代理转发()一起使用。我可以登录到使用Ansible管理的服务器,并测试我与git的连接是否正确配置:

ubuntu@test:~$ ssh -T git@github.com
Hi gituser! You've successfully authenticated, but GitHub does not provide shell access.
我还可以使用这个帐户克隆和更新我的一个repo,这样我的git配置看起来很好,并且在我直接通过ssh登录到服务器时使用ssh转发

问题是:当我使用Ansible命令模块尝试上面所示的相同测试时。它以“权限被拒绝”的形式失败。Ansible输出的一部分(带有详细日志记录)如下所示:

failed: [xxx.xxxxx.com] => {"changed": true, "cmd": ["ssh", "-T", "git@github.com"], "delta": "0:00:00.585481", "end": "2014-06-09 14:11:37.410907", "rc": 255, "start": "2014-06-09 14:11:36.825426"}
stderr: Permission denied (publickey).
以下是运行此命令的简单剧本:

- hosts: webservers
  sudo: yes
  remote_user: ubuntu

  tasks:

  - name: Test that git ssh connection is working.
    command: ssh -T git@github.com
问题是:当我通过ssh手动登录并运行命令时,为什么一切都正常工作,但当同一个命令通过Ansible作为同一个用户运行时却失败了


如果没有人比我抢先一步,我会很快发布答案。尽管我正在使用git来演示这个问题,但它可能会出现在任何依赖于ssh代理转发的模块上。Ansible并不特定,但我怀疑很多人会在这种情况下首先遇到问题。

从剧本中删除这一行可以解决问题:

sudo: yes
在远程主机上运行sudo时,ssh在登录期间设置的环境变量不再可用。特别是,SSH_AUTH_SOCK“标识用于与代理通信的UNIX域套接字的路径”不再可见,因此SSH代理转发无法工作

当你不需要sudo时,避免它是解决问题的一种方法。另一种方法是通过创建sudoers文件来确保SSH_AUTH_SOCK在sudo会话期间保持不变:

/etc/sudoers:

     Defaults    env_keep += "SSH_AUTH_SOCK"

您的问题的另一个答案(我使用的是Ansible 1.9除外)可能是:

您可能需要检查您的/etc/ansible/ansible.cfg(或可以覆盖配置设置的其他三个潜在位置)是否有
transport=smart
按照建议。在上一次安装尝试期间,我的默认设置为
transport=paramiko
,阻止我的控制计算机使用OpenSSH,从而阻止代理转发。这可能是一个巨大的边缘案件,但谁知道呢?可能是你

虽然我认为我的配置没有必要,但我应该注意到其他人已经提到,您应该在同一个文件中将ssh_args设置添加
-o ForwardAgent=yes
,如下所示:

[ssh_connection]
ssh_args=-o ForwardAgent=yes

我在这里提到它只是为了完整

要扩展@j.freckle的答案,更改sudoers文件的可行方法是:

- name: Add ssh agent line to sudoers
  lineinfile: 
    dest: /etc/sudoers
    state: present
    regexp: SSH_AUTH_SOCK
    line: Defaults env_keep += "SSH_AUTH_SOCK"

这里有一些非常有用的部分答案,但是在多次讨论这个问题之后,我认为一个概述会很有帮助

首先,您需要确保从运行Ansible的客户端连接到目标计算机时启用了SSH代理转发。即使使用
transport=smart
,SSH代理转发也可能不会自动启用,具体取决于客户端的SSH配置。为了确保它是正确的,您可以更新
~/.ansible.cfg
以包含此部分:

[ssh_connection]
ssh_args=-o ControlMaster=auto -o ControlPersist=60s -o ControlPath=/tmp/ansible-ssh-%h-%p-%r -o ForwardAgent=yes
接下来,您可能必须处理这样一个事实,即
been:yes
(和
been\u user:root
)通常会禁用代理转发,因为
SSH\u AUTH\u SOCK
环境变量已重置。(人们将SSH作为root用户,这让我感到震惊,因为这使得任何有用的审计都不可能实现。)有几种方法可以解决这个问题。从Ansible 2.2开始,最简单的方法是在使用
sudo
时通过指定
-E
标志来保护(整个)环境:

become_flags: "-E"
但是,通过保留变量(如
PATH
),这可能会产生不必要的副作用。最干净的方法是只保留
SSH\u AUTH\u SOCK
,方法是将其包含在
env\u keep
中的
/etc/sudoers
文件中:

Defaults    env_keep += "SSH_AUTH_SOCK"
要使用Ansible执行此操作,请执行以下操作:

- name: enable SSH forwarding for sudo
  lineinfile:
    dest: /etc/sudoers
    insertafter: '^#?\s*Defaults\s+env_keep\b'
    line: 'Defaults    env_keep += "SSH_AUTH_SOCK"'

此playbook任务比其他一些建议的任务保守一点,因为它在任何其他默认
env_keep
设置之后(或者在文件末尾,如果找不到任何设置)添加此任务,不更改任何现有的
env_keep
设置,也不假设
SSH_AUTH_SOCK
已经存在。

设置
sudo:no
可能需要明确。如果使用SSH_AUTH_SOCK,至少要注意安全风险@systemicfrank:链接中的安全风险是针对chmod 777的,不是SSH_-AUTH_-sock这对我有用。我用:-name:enable SSH-creds-passthrough-lineinfle:dest=/etc/sudoers-regexp='^#?Defaults\Wenv_-keep[^$]'line='Defaults-env_-keep+=“SSH_-AUTH_-SOCK''自动完成了它。我必须将
SSH-args
添加到我的
ansible.cfg
中才能让SSH代理转发工作。你是唯一一个提出建议的人,真是太好了!我在OSX 10.10上运行Ansible 1.9.1,如果您指定
ssh_args
来阻止Ansible提供自己的参数,包括设置持久连接的参数。这可能导致经济大幅放缓。要添加的相关参数是
-o ControlMaster=auto-o ControlPersist=60s-o ControlPath=/tmp/ansible ssh-%h-%p-%r
。默认情况下,设置为
sudo_标志=-h-S-n
sudo_标志有时也会出现问题,并且可能会因“sudo:需要密码”而失败。在这种情况下,您需要设置
sudo_flags=-H-S
removing-n选项。我认为使用
ssh_extra_args=-o ForwardAgent=yes
可以防止减速(由qqx提到)。但是我们不需要运行ansible两次吗?一个是设置ssh-fwding,另一个是实际获取与这个env-var集的连接?听起来不错。我总是多次运行和评论剧本,将ssh放到框中并手动检查。这从来都不是一帆风顺的。为了避免多次跑步,我最后把这一步放在了一张纸条上