我正在尝试针对已配置的 EC2 主机运行一个简单的 Ansible playbook。当我运行 ansible-playbook 时,出现以下错误:
SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh
使用亚马逊提供的 .pem 文件,我可以通过以下方式手动 ssh 进入盒子:
ssh ubuntu@my_instance_ip
。
这是我正在运行的完整命令:
ansible-playbook --inventory-file=inventory/production --extra-vars=ansible_ssh_user=ubuntu my-playbook.yml -vvvv
这是我的库存文件(IP/DNS屏蔽):
[test]
ec2-1-1-1-1.us-west-1.compute.amazonaws.com ansible_ssh_private_key_file=~/path_to_pem_file.pem
有趣的是,如果我运行 ssh 命令,ansible-playbook 会详细地输出:
ssh -C -vvv -o ControlMaster=auto -o ControlPersist=60m -o ControlPath="/Users/me/.ansible/cp/ansible-ssh-%h-%p-%r" -o IdentityFile="/path_to_my_pem_file.pem" -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 ec2-1-1-1-1.us-west-1.compute.amazonaws.com
我得到以下信息:
debug3: muxserver_listen: temporary control path /Users/me/.ansible/cp/ansible-ssh-ec2-1-1-1-1.us-west-1.compute.amazonaws.com-22-ubuntu.8MjEBnDdRIAO8zAT
unix_listener: "/Users/me/.ansible/cp/ansible-ssh-ec2-1-1-1-1.us-west-1.compute.amazonaws.com-22-ubuntu.8MjEBnDdRIAO8zAT" too long for Unix domain socket
这个错误有效吗?如果有效,有什么办法可以让命令更短吗?谢谢!
答案1
正如评论和链接SO问题此处的相关错误消息是: 。可以通过调整参数来too long for Unix domain socket
解决此错误control_path
ansible.cfg
用于 ControlPath 套接字的路径。默认为“%(directory)s/ansible-ssh-%%h-%%p-%%r”,但是在某些主机名或路径名非常长的系统上(由长用户名或深层嵌套的主目录引起),这可能会超出文件套接字名称的字符限制(大多数平台为 108 个字符)。在这种情况下,您可能希望缩短下面的字符串。
例如:control_path = %(directory)s/%%h-%%r
答案2
我遇到了两倍的问题,因为机器加入了域并且$HOME
路径很长,我的用户名也是如此,例如:/home/local.companyname.com/Smitty.Werbenjagermanjensen
所以几乎任何控制套接字路径都会太长。
有两种其他方法可以解决此问题:
- 对于长主机名:
- 您不需要使用通常的标志
%r
、%h
和,而是%p
可以使用%C
三者的哈希值。 - 例如:
dfd609b4ea05eab3927aa71b91115b29317d017d
- 笔记:这个选项显然是 ssh 最近添加的,所以如果它不起作用,你真的应该考虑更新 ssh 和/或你的操作系统。
- 您不需要使用通常的标志
对于较长的前置路径:
我非常喜欢我的插座,
~/.ssh/sockets
以便其他人无法触摸它们。mkdir -p ~/.ssh/sockets && \ chmod 0700 ~/.ssh/sockets && \ sudo ln -s ~/.ssh/sockets /var/local/sw-ssh && \ sudo chown -h $myuser:$mydomain /var/local/sw-ssh
将您的 Ansible 设置
control_path
为/var/local/sw-ssh/%%C
通过这两个,我的套接字路径从:/home/local.companyname.com/Smitty.Werbenjagermanjensen/.ssh/sockets/Smitty.Werbenjagermanjensen@foobar.dev.application.companyname.com-22
到:/var/local/sw-ssh/dfd609b4ea05eab3927aa71b91115b29317d017d
笔记:这些都是完全有效的 ssh 客户端配置,可以添加到您的~/.ssh/config
配置中,这样您就可以全天候受益于 ssh sockety 的优点,而不仅仅是在运行 Ansible 时。
Host *
ControlMaster auto
ControlPath /var/local/sw-ssh/%C
ControlPersist 600