无法针对 EC2 主机运行 Ansible 剧本

无法针对 EC2 主机运行 Ansible 剧本

我正在尝试针对已配置的 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_pathansible.cfg

用于 ControlPath 套接字的路径。默认为“%(directory)s/ansible-ssh-%%h-%%p-%%r”,但是在某些主机名或路径名非常长的系统上(由长用户名或深层嵌套的主目录引起),这可能会超出文件套接字名称的字符限制(大多数平台为 108 个字符)。在这种情况下,您可能希望缩短下面的字符串。

例如:control_path = %(directory)s/%%h-%%r

答案2

我遇到了两倍的问题,因为机器加入了域并且$HOME路径很长,我的用户名也是如此,例如:/home/local.companyname.com/Smitty.Werbenjagermanjensen所以几乎任何控制套接字路径都会太长。

有两种其他方法可以解决此问题:

  1. 对于长主机名:
    • 您不需要使用通常的标志%r%h和,而是%p可以使用%C三者的哈希值。
    • 例如:dfd609b4ea05eab3927aa71b91115b29317d017d
    • 笔记:这个选项显然是 ssh 最近添加的,所以如果它不起作用,你真的应该考虑更新 ssh 和/或你的操作系统。
  2. 对于较长的前置路径:

    • 我非常喜欢我的插座,~/.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

相关内容