Ansible: menyarankan memperbarui pengaturan controlpath ketika ssh melempar 'unix domain socket "terlalu lama"' kesalahan

Dibuat pada 9 Jul 2015  ·  66Komentar  ·  Sumber: ansible/ansible

JENIS MASALAH

Ide Fitur

NAMA KOMPONEN

kontrol ssh tetap ada

VERSI YANG MUNGKIN

2.0

RINGKASAN

Saat mencoba menggunakan plugin ec2, ssh gagal dengan kesalahan ini:

SSH Error: unix_listener: "/Users/luke/.ansible/cp/ansible-ssh-ec2-255-255-255-255.compute-1.amazonaws.com-22-ubuntu.CErvOvRE5U0urCgm" too long for Unix domain socket

Berikut contoh lengkapnya:

$ ansible -vvvv -i ec2.py -u ubuntu us-east-1 -m ping
<ec2-255-255-255-255.compute-1.amazonaws.com> ESTABLISH CONNECTION FOR USER: ubuntu
<ec2-255-255-255-255.compute-1.amazonaws.com> REMOTE_MODULE ping
<ec2-255-255-255-255.compute-1.amazonaws.com> EXEC ssh -C -tt -vvv -o ControlMaster=auto -o ControlPersist=60s -o ControlPath="/Users/luke/.ansible/cp/ansible-ssh-%h-%p-%r" -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 ec2-255-255-255-255.compute-1.amazonaws.com /bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1436458336.4-21039895766180 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1436458336.4-21039895766180 && echo $HOME/.ansible/tmp/ansible-tmp-1436458336.4-21039895766180'
ec2-255-255-255-255.compute-1.amazonaws.com | FAILED => SSH Error: unix_listener: "/Users/luke/.ansible/cp/ansible-ssh-ec2-255-255-255-255.compute-1.amazonaws.com-22-ubuntu.CErvOvRE5U0urCgm" too long for Unix domain socket
    while connecting to 255.255.255.255:22
It is sometimes useful to re-run the command using -vvvv, which prints SSH debug output to help diagnose the issue.

Saya telah mengubah beberapa info sensitif di sini seperti IP dll.

affects_2.0 affects_2.3 feature

Komentar yang paling membantu

Menambahkan ini ke konfigurasi saya yang memungkinkan untuk mempersingkat jalur:

[ssh_connection]
control_path = %(directory)s/%%h-%%p-%%r

Mungkin berguna untuk memasukkannya ke dalam output kesalahan atau melakukan sesuatu yang lebih anggun daripada gagal.

Semua 66 komentar

Menambahkan ini ke konfigurasi saya yang memungkinkan untuk mempersingkat jalur:

[ssh_connection]
control_path = %(directory)s/%%h-%%p-%%r

Mungkin berguna untuk memasukkannya ke dalam output kesalahan atau melakukan sesuatu yang lebih anggun daripada gagal.

bagi saya kesalahan yang sama! Saya setuju dengan LukeHoersten dalam perbaikan ini.

Terima kasih telah menunjukkan solusi Anda @LukeHoersten

Tidak masalah. Semoga kita bisa mendapatkan perbaikan yang lebih solid di sana. Ini buruk bagi pendatang baru khususnya.

Konfigurasi yang memungkinkan memiliki saran komentar lain
control_path = %(directory)s/%%h-%%r

Tapi ya pesan bantuan akan berguna.

Saya baru saja memukul ini juga. Saya baru dan membuang banyak waktu. Terima kasih atas jawabannya! Dan saya setuju, perlu diperbaiki.

Saya juga :+1: untuk fitur ini.

Menghadapi itu hari ini. Terima kasih atas petunjuk tentang ansible.cfg !!

Mengedit control_path tidak berfungsi di Mac OSX El Capitan.

Ini berfungsi untuk saya di El Capitan:

[koneksi_ssh]
control_path = %(direktori)s/%%h-%%r

Seperti yang ditunjukkan @willotter , itu adalah salah satu pernyataan yang dikomentari di https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg

Tertarik untuk mengetahui mengapa ini menjadi masalah - sejak kapan nama path yang panjang menjadi masalah di luar Windows?

ini berfungsi untuk saya setelah memutakhirkan ke EI Capitan.

[ssh_connection]
control_path = %(directory)s/%%h-%%p-%%r

@deyvsh mengapa ini menjadi masalah - sejak kapan nama path yang panjang menjadi masalah di luar Windows?

Sejak El Capitan dirilis oleh Apple. Selain halaman dalam bahasa Cina, ini adalah satu-satunya halaman yang tampaknya merujuk perilaku baru ini di MacOS. Saya mengalami masalah yang sama ketika mencoba menggunakan mode Tramp di emacs yang memungkinkan akses transparan ke file jarak jauh melalui ssh. Kesalahan yang sama tentang nama file yang panjang untuk soket domain unix, tetapi tidak semudah penyelesaiannya seperti pada Ansible.

@cswarth Konfigurasi yang memungkinkan baru saja diteruskan ke klien ssh Anda. Anda mungkin dapat mengatur control_path di file konfigurasi ssh Anda ~/.ssh/config seperti ini:

Host *
  ControlPath /tmp/%r@%h:%p

Saya tidak memiliki Mac OS X jadi saya tidak dapat menguji ini tetapi ini akan berfungsi kecuali emacs meneruskan parameter tertentu ke SSH.

@willotter Saya harus mengadaptasi ide ini dan menambahkannya ke file ansible.cfg saya untuk membuatnya berfungsi.

[ssh_connection]
control_path = /tmp/%%h-%%p-%%r

Pembaruan 2017: sepertinya @willotter tidak ada lagi :(

@LukeHoersten Terima kasih untuk ini, perbaiki masalah untuk saya!

Akar penyebabnya adalah di

https://github.com/openssh/openssh-portable/blob/9ada37d36003a77902e90a3214981e417457cf13/misc.c#L1070

int
unix_listener(const char *path, int backlog, int unlink_first)
{
    struct sockaddr_un sunaddr;
    int saved_errno, sock;

    memset(&sunaddr, 0, sizeof(sunaddr));
    sunaddr.sun_family = AF_UNIX;
    if (strlcpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path)) >= sizeof(sunaddr.sun_path)) {
        error("%s: \"%s\" too long for Unix domain socket", __func__,
            path);
        errno = ENAMETOOLONG;
        return -1;
    }

Untuk mengetahui batasnya (sizeof(sunaddr.sun_path)), kita perlu melihat https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man4/unix.4.html

           struct sockaddr_un {
                   u_char  sun_len;
                   u_char  sun_family;
                   char    sun_path[104];
           };

Jalur dibatasi hingga 104 karakter termasuk 0 terminator.

Ini juga sedang dibahas di https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing#Manually_Establishing_Multiplexed_Connections yang juga menyarankan Anda menggunakan

Dimulai dengan 6.7, kombinasi %r@%h:%p dan variasinya dapat diganti dengan %C yang dengan sendirinya menghasilkan hash dari rangkaian %l%h%p%r.

Pada akhirnya, Anda ingin menggunakan

[ssh_connection]
control_path = %(directory)s/%%C

Juga, Anda ingin tetap keluar dari /tmp atau lokasi lain yang dapat ditulisi, dapat dibaca dunia, karena keamanan.

Lihat juga http://Pastebin.com/ugXKMFsv

@isotopp saran bagus. Saya bertanya-tanya mengapa kita tidak hanya mengubah default ke control_path = %(directory)s/%%C untuk menghindari masalah di masa mendatang.

@LukeHoersten saya pikir mungkin harus mengubah default juga. Sebenarnya, saya melakukannya

[:~] $ grep -i control ~/.ssh/config
ControlMaster auto
ControlPath ~/.ssh/_%C

Ping @bcoca - lihat analisis dan usulan perubahan di atas.

+1

karena itu tidak akan bekerja pada banyak OS/distro yang menjalankan versi openssh yang sedikit lebih lama

Usulan perubahan di http://Pastebin.com/ugXKMFsv hanya mengubah dokumen dan komentar. Akan bekerja dengan versi lama openssh, tetapi buat penunjuk ke %C lebih jelas.

Saya memiliki nama pengguna yang panjang di mesin saya (11 karakter), ini menyebabkan direktori saya melampaui batas karakter.

https://github.com/ansible/ansible/blob/devel/examples/ansible.cfg#L216 -L225

Saya menjatuhkan -%%r dan itu memecahkan masalah ini untuk saya.

Saya mengalami kesalahan ini hari ini karena alih-alih file inventaris saya, saya menyediakan file group_vars saya dan dengan senang hati mem-parsing file terenkripsi entah bagaimana dan menerima sesuatu seperti 182937891273891723981723891723987189237189237981273981 sebagai nama host. SSH juga tidak menganggap itu aneh sebelum menyadari ControlPath yang panjang. Peringatan untuk anak cucu - jalankan semuanya dengan -vvvv dan pastikan Anda menunjuk ke Host yang tepat dan semua itu.

Terima kasih untuk ini. Itu memperbaiki kesalahan yang saya miliki di OS X El Capitan.

+1
Ini baru saja menyelesaikan masalah saya di OS X El Capitan.

Bekerja untuk saya juga di OS X EL Capitan. Sekedar catatan, jika Anda telah menginstal ansible melalui brew, maka file tersebut adalah /usr/local/etc/ansible/ansible.cfg

:+1 Ini terjadi pada saya hanya mencoba melakukan ansible all -i inventory -m ping memiliki Host dengan nama host yang panjang seperti ec2-XX-XXX-XX-XX.eu-west-1.compute.amazonaws.com

Ini bekerja untuk saya di El Capitan:

Saya membuat file ansible.cfg di direktori saya saat ini dengan:

[ssh_connection]
control_path = %(directory)s/%%C

Sekarang menjalankan ansible .. tidak memberi saya kesalahan ssh.

Bekerja untuk saya juga di OS X EL Capitan. Sekedar catatan, jika Anda telah menginstal ansible melalui brew, maka file tersebut adalah /usr/local/etc/ansible/ansible.cfg

Saya El Capitan dan menginstal mungkin melalui minuman, dan itu mengabaikan file /usr/local/etc/ansible/ansible.cfg saya coba tambahkan dengan pengaturan itu.

@tleyden Itu cukup aneh, /usr/local/etc/ansible/ansible.cfg bekerja dengan baik untuk saya.

Oh, saya baru menyadari perbedaannya -- saya menginstal ansible via pip install ansible , bukan via brew

Mengapa anehnya menambahkan string seperti CErvOvRE5U0urCgm pada akhirnya? Hal-hal rusak bagi saya karena string yang tidak berguna itu.

Hanya menambahkan beberapa komentar di sini untuk memperjelas tentang tindakan apa yang dapat diambil:

  • Dokumentasi. Sepertinya pembaruan dokumen yang disarankan ada dalam inti yang ditautkan dari tiket ini tetapi tidak dalam PR sehingga tidak pernah digabungkan.
  • Penangkapan kesalahan yang lebih baik -- Jika %C digunakan dan ssh tidak mendukungnya, beri tahu orang-orang untuk menggantinya dengan %l-%h-%p. Jika jalur terlalu panjang, beri tahu orang-orang untuk mencoba %C atau cukup perpendek jalur.
  • coba deteksi apakah ssh yang kita gunakan mendukung %C dan jika ya, manfaatkan, jika tidak, jangan (mungkin ini hanya relevan sebagai default, bukan saat pengguna mengonfigurasi sesuatu di file konfigurasi mereka?) (Sudah untuk berhati-hati agar tidak membuat koneksi memakan waktu lebih lama).

Saya juga menambahkan:
%(directory)s/%%h‐%%r
Tapi jalanku masih terlalu panjang? Bagaimana saya bisa memperbaikinya:

SSH Error: unix_listener: "/Users/myfullname/.ansible/cp/ec2-xx-xx-xx-xx.eu-central-1.compute.amazonaws.com-centos.AAZFTHkT5xXXXXXX" too long for Unix domain socket
    while connecting to 52.xx.xx.xx:22

Saya melihat masalah ini dengan kemungkinan 2.1.0.0 di Ubuntu 16.04

$ ssh -V
OpenSSH_7.2p2 Ubuntu-4ubuntu1, OpenSSL 1.0.2g-fips  1 Mar 2016

Menambahkan ini ke ansible.cfg saya berhasil:

[ssh_connection]
control_path=%(directory)s/%%h-%%p-%%r

Atau, mengubah nama domain AWS yang panjang menjadi alamat IP juga memperbaikinya, bahkan tanpa perubahan ke ssh_connection.control_path di ansible.cfg.

Seperti yang dikatakan orang lain, kesalahan ini tidak terlihat saat dijalankan dengan -vvvv. Saya harus menyalin perintah di output debug dan menjalankannya langsung di terminal untuk melihat kesalahan "terlalu lama untuk soket domain Unix".

Saya juga memiliki masalah yang sama.

masalah ini sangat mengganggu, harus bolak-balik antara IP dan FQDN tergantung pada mesin yang menjalankan buku pedoman Ansible ... ada solusi nyata yang direncanakan dari sisi Ansible?

@swoodford , mungkin Anda dapat mengajukan masalah dengan distro linux Anda untuk mengubah pengaturan default. Misalnya pengelola fedora mengubah default untuk menggunakan soket kontrol yang lebih pendek. Masalah tampaknya mungkin ingin mempertahankan kompatibilitas secara default dengan distro lama. Saya tidak yakin itu masuk akal karena pengguna distro yang lebih baru seharusnya sekarang lebih banyak. Itu berarti setidaknya distro yang lebih baru tidak keberatan mengubah default selama pengemasan karena distro tahu itu cukup baru untuk bekerja dengan opsi yang lebih andal.

Saya masih berpikir mungkin harus mengubah dafault.

Sangat lucu. Kami memiliki masalah yang sama di cdist beberapa waktu lalu (dan sedang mencari bug lain yang terkait dengan ini). Batas sun_path di Unix adalah batas yang sangat, sangat lama yang menggigit kita semua pada tahun 2016.

Solusi termudah: tidak ada.
Solusi terbaik ke-2: cobalah untuk menjaga nama soket tetap pendek. Masih rusak jika home dir adalah jalan yang panjang
Solusi terbaik ke-3: simpan di suatu tempat di /tmp/short-random-path/c (hanya perlu satu karakter)

Solusi jangka panjang: Singkirkan batas sun_path atau naikkan ke default 2016 yang masuk akal (siapa pun dari grup austin/posix membaca di sini?)

Apa kepanjangan dari %(directory) ?

@isotopp

Apakah ini sintaks yang tepat (dengan awalan garis bawah) untuk memasukkan file ~/.ssh/config ?

ControlMaster auto
ControlPath ~/.ssh/_%C

Apakah ini pelarian yang memiliki arti yang sama dengan %% ganda dari file ansible.cfg? Saya mencoba mengonfigurasi keduanya dengan cara yang sama seperti saya menggunakan ssh bahkan di luar yang memungkinkan.

Bahkan setelah menambahkan control_path ke ansible.cfg saya di proyek saya, saya masih mendapatkan kesalahan ini tetapi saya kembali ke versi 2.1.3, menjalankan perintah yang sama yang melemparkan kesalahan saat menjalankan 2.2.1, dan masalah telah diselesaikan.

Masih mengalami masalah ini dengan versi: ansible 2.2.0.0

benar-benar masalah yang aneh. mungkin 2.2.0.0 di fedora 24 -> ada masalah
git head dari 2016/07/05 di OSX -> masalah tidak ada.

@bcoca saya selalu penggemar kompatibilitas mundur (ya saya mengirim perbaikan centos 6.5 itu). bagaimana dengan membuatnya dinamis pada versi openssh/distro jalur kontrol mana yang digunakan?

itu sudah dinamis, lihat logika di balik koneksi 'pintar' menjadi default

saat menghubungkan dari host ke host, mungkin Anda tidak memiliki kunci ssh di ransel Anda? :)

Di samping catatan %C bukan default yang bagus saat ini karena EL7 memiliki openssh 6.6, dan %C tidak ditambahkan sampai openssh 6.7 dan belum di-backport.

Anda dapat menggunakan bentuk %l%h%p%r yang diperluas sepenuhnya pada EL7, tetapi hanya sebagian yang dikurangi karena tentu saja tidak akan melakukan hash.

Pemilik distro harus mengubah konfigurasi default agar sesuai dengan paket yang dikirimkan. Saya pikir hulu tidak harus menunggu 7 tahun sebelum bergerak maju dengan perbaikan penting seperti ini.

Karena saya masih menggunakan Ansible versi 2.2 & Ansible Tower 3.1.1, saya juga mengalami masalah ini. Seperti yang ditunjukkan @dennisobrien sebelumnya , mengubah inventaris dari nama domain AWS ke alamat IP AWS menyelesaikan masalah ini. Namun, saya mencoba menggunakan hanya variabel-variabel ini dalam konfigurasi terlebih dahulu, dan itu tidak menyelesaikan masalah:

---
ssh_connection:
  control_path: "%(directory)s/%%h-%%p-%%r"

@b-long , gunakan control_path %(directory)s/%%C

Server saya memiliki masalah ini dan saya tidak memiliki izin untuk mengubahnya. Bagaimana saya bisa menyelesaikannya di akhir klien?

@thefourtheye ini murni masalah klien, bukan masalah server. Anda dapat menemukan opsi untuk mengatur di file ansible.cfg Anda sebelumnya di utas ini.

@antoineco Oh, terima kasih. Saya benar-benar baru untuk memungkinkan dan saya bahkan belum menginstalnya di mesin saya. Masih memiliki file ansible.cfg di direktori home akan berfungsi?

Saya memiliki masalah yang sama, saya mencoba semua solusi termasuk menambahkan file konfigurasi .ansible.cfg di ~/:
[defaults] inventory=/etc/ansible/hosts [ssh_connection] control_path=%(directory)s/%%h-%%r control_path_dir=~/.ansible/cp

Dan tambahkan know host dan ip ke ssh known_hosts. Tetapi masih tidak berfungsi, ini adalah ubuntu di EC2.
Ini adalah kesalahannya:

fatal: [default]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'ec2-xx-192-174-42.ap-northeast-1.compute.amazonaws.com,xx.192.174.42' (ECDSA) to the list of known hosts.\r\nunix_listener: \"/Users/name/.ansible/cp/ec2-xx-192-174-42.ap-northeast-1.compute.amazonaws.com-ubuntu.1fndG2vtHPliheeZ\" too long for Unix domain socket\r\n", "unreachable": true

Anda tidak menggunakan solusi yang diusulkan yaitu control_path = %(directory)s/%%C .

@akostadinov Terima kasih, itu berhasil. Terlalu banyak solusi di sini.

Terlalu banyak solusi di sini.

Kalau saja itu lebih sulit... kutuk penyedia solusi itu!

Saya mencoba menambahkan semua baris yang disarankan di sini di file ~/ansible.cfg di mesin lokasi saya, tetapi tidak membantu. saya menyerah.

Apa yang berhasil untuk saya sekarang, adalah mendapatkan alamat IP mesin dengan nslookup dan masuk dengan itu.

@thefourtheye , saya tidak yakin berapa banyak "baris yang disarankan" yang Anda lihat di sini. Gunakan pos dengan 50+ suka. Tetapi selain opsi yang tepat, Anda perlu menggunakan file konfigurasi yang mungkin diketahui . Dalam kasus Anda ~/.ansible.cfg . Coba perhatikan detailnya, titik di depan file konfigurasi pengguna adalah konvensi unix yang umum.

@akostadinov Maaf, itu salah ketik. Begini tampilannya

➜  ~ cat ~/.ansible.cfg
[ssh_connection]
control_path = %(directory)s/%%h-%%p-%%r

Saya hanya ingin berpadu dengan .ansible.cfg :

[ssh_connection]
control_path = /tmp/control_%%l_%%h_%%p_%%r

bagi saya, directory adalah sesuatu yang sangat panjang, bagian terakhir hanyalah sedotan yang mematahkan punggung unta. Saya juga memiliki ini di .ssh/config saya sehingga saya dapat menggunakan kembali koneksi yang sama:

ControlMaster                    auto
ControlPath                      /tmp/control_%l_%h_%p_%r

Maaf tapi tmp hardcoded tidak hanya tidak portabel tetapi juga risiko keamanan yang serius. Untuk alasan yang baik, MacOS tidak mengizinkan pengguna untuk menulis ke /tmp dan menyediakan folder tmp (pribadi) yang terisolasi untuk setiap pengguna.

Tmp hanya akan berfungsi jika Anda menggunakan jalur tmp yang disediakan OS, seperti %(tmp)s ...

Guys, tolong baca komentar yang ada, konyol semua orang datang menanyakan hal yang sama dan seseorang menambahkan solusi yang sama. Gunakan file konfigurasi yang tepat dan lihat https://github.com/ansible/ansible/issues/11536#issuecomment -153030743.

Seseorang, tolong tutup utas untuk menghindari spam lebih lanjut.

@ssbarnea harcoded apa pun tidak portabel ... itu sebabnya itu bukan default di ansible ... tidak yakin saya setuju tentang masalah keamanan atau masalah macOS karena /tmp lengket dan openssh menggunakan mode yang masuk akal (0600) untuk file-file ini.

mengenai solusi menggunakan %C yang membutuhkan openssh...

Saya tidak terlalu peduli dengan versi ssh kuno, terutama pada pengontrol yang memungkinkan. Untuk berevolusi kita perlu membiarkan beberapa hal di belakang dan dalam hal ini bukan masalah besar karena mereka yang terpengaruh dapat mengubah konfigurasi agar dapat terus menggunakannya.

Saya pikir sangat penting untuk pengalaman pengguna Ansible (UX), untuk memberikan default yang sesuai dengan sebagian besar pengguna, meminimalkan kebutuhan akan perubahan. Saya ragu bahwa kami memiliki lebih dari 1-2% pengguna yang menggunakan versi open openssh yang tidak mendukung %C .

Saya pikir kita perlu mengimplementasikan beberapa variabel INI kritis yang memungkinkan secepatnya karena setiap minggu kami menemukan bug yang disebabkan oleh kekurangannya: %(tmpdir)s m $(configdir)s , %(inventorydir)s .

Jika kita memiliki orang-orang ini akan dapat membuat jalur relatif yang dapat diandalkan.

Sayangnya, dalam kasus saya masalahnya bahkan lebih buruk karena kami menggunakan Ansible sebagai bagian dari CI dan karena seperti banyak kami memiliki beberapa node Jenkins pada mesin yang sama, berjalan di bawah pengguna yang sama, kami cukup sering menghadapi sesi ssh highjacking. Pokoknya masalah saya lebih kompleks dan di luar cakupan tiket ini.

Saya memperbaiki masalah ini secara umum untuk semua versi ssh 6 bulan yang lalu. Jika ada yang melihat masalah dengan Ansible 2.3+, itu karena Anda telah menetapkan jalur kontrol khusus di ansible.cfg alih-alih membiarkannya kosong.

https://github.com/ansible/ansible/commit/ac78347f2bc4a489c7e254c6c1d950fb45f240ad

https://github.com/ansible/ansible/blob/devel/examples/ansible.cfg#L360 -L367

# The path to use for the ControlPath sockets. This defaults to a hashed string of the hostname, 
# port and username (empty string in the config). The hash mitigates a common problem users 
# found with long hostames and the conventional %(directory)s/ansible-ssh-%%h-%%p-%%r format. 
# In those cases, a "too long for Unix domain socket" ssh error would occur.
#
# Example:
# control_path = %(directory)s/%%h-%%r
#control_path =

Karena percakapan ini terus berlanjut tanpa merujuk patch di atas, saya akan menguncinya. Jika Anda memiliki pertanyaan lebih lanjut tentang topik tersebut, silakan gunakan milis.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat