فكرة الميزة
استمرار سيطرة ssh
2.0
عند محاولة استخدام المكون الإضافي ec2 ، يفشل ssh مع هذا الخطأ:
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
هذا هو المثال الكامل:
$ 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.
لقد قمت بتغيير بعض المعلومات الحساسة هنا مثل IP وما إلى ذلك.
أضف هذا إلى التهيئة غير المرغوبة لتقصير المسار:
[ssh_connection]
control_path = %(directory)s/%%h-%%p-%%r
قد يكون من المفيد تضمين ذلك في ناتج الخطأ أو القيام بشيء آخر أكثر رشاقة بدلاً من الفشل.
بالنسبة لي نفس الخطأ! أنا أتفق مع LukeHoersten في هذا الإصلاح.
شكرًا لتوضيح الحل الخاص بك من
لا مشكلة. نأمل أن نتمكن من الحصول على إصلاح أكثر قوة هناك. إنه أمر سيء للقادمين الجدد على وجه الخصوص.
يحتوي التكوين غير القابل للتصرف على اقتراح آخر تم التعليق عليه
control_path = %(directory)s/%%h-%%r
لكن نعم ، قد تكون رسالة المساعدة مفيدة.
أنا فقط ضربت هذا أيضا. أنا جديد وأهدرت الكثير من الوقت. شكرا على الاجابة! وأنا أوافق ، يحتاج إلى الإصلاح.
أنا أيضًا: +1: لهذه الميزة.
تواجه ذلك اليوم. شكرا للتلميحات على ansible.cfg
!!
لا يعمل تحرير control_path على نظام التشغيل Mac OSX El Capitan.
هذا يعمل بالنسبة لي في El Capitan:
[ssh_connection]
control_path =٪ (دليل) s / ٪٪ h - ٪٪ r
كما أشار willotter ، فهو أحد العبارات التي تم التعليق عليها في https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
هل أنت مهتم بمعرفة سبب هذه المشكلة - منذ متى أصبحت أسماء المسارات الطويلة مشكلة خارج Windows؟
هذا يعمل بالنسبة لي بعد الترقية إلى EI Capitan.
[ssh_connection]
control_path = %(directory)s/%%h-%%p-%%r
deyvsh لماذا هذه مشكلة - منذ متى أصبحت أسماء المسار الطويلة مشكلة خارج Windows؟
منذ أن تم إطلاق El Capitan من قبل شركة Apple. بصرف النظر عن صفحة باللغة الصينية ، هذه هي الصفحة الوحيدة التي يبدو أنها تشير إلى هذا السلوك الجديد في MacOS. واجهت نفس المشكلة عند محاولة استخدام وضع Tramp في emacs والذي يسمح بالوصول الشفاف إلى الملفات البعيدة عبر ssh. نفس الخطأ حول أسماء الملفات الطويلة لمقبس مجال unix ، ولكن ليس من السهل حله كما هو الحال في Ansible.
cswarth يتم تمرير التكوين غير القابل للتصرف إلى عميل ssh الخاص بك. قد تتمكن من إعداد control_path في ملف تهيئة ssh ~/.ssh/config
مثل هذا:
Host *
ControlPath /tmp/%r@%h:%p
ليس لدي نظام Mac OS X ، لذا لا يمكنني اختبار ذلك ، لكن هذا يجب أن يعمل ما لم يمرر emacs أي معلمات محددة عبر SSH.
willotter اضطررت إلى تعديل هذه الفكرة وإضافتها إلى ملف ansible.cfg الخاص بي لتشغيلها.
[ssh_connection]
control_path = /tmp/%%h-%%p-%%r
تحديث 2017: يبدو أن Willotter لم يعد موجودًا :(
LukeHoersten شكرًا على هذا ، أصلح المشكلة بالنسبة لي!
السبب الجذري لذلك هو في
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;
}
لمعرفة الحد الأقصى (sizeof (sunaddr.sun_path)) ، نحتاج إلى إلقاء نظرة على 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];
};
المسار محدد بـ 104 حرفًا بما في ذلك حرف النهاية 0.
تتم مناقشة هذا أيضًا في https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing#Manually_Establishing_Multiplexed_Connections الذي يقترح أيضًا أنك تستخدم
بدءًا من 6.7 ، يمكن استبدال مجموعة٪ r @٪ h:٪ p والاختلافات الموجودة بها بـ٪ C والتي تقوم بمفردها بإنشاء تجزئة من تسلسل٪ l٪ h٪ p٪ r.
في النهاية ، تريد استخدام
[ssh_connection]
control_path = %(directory)s/%%C
أيضًا ، تريد البقاء بعيدًا عن / tmp أو أي موقع آخر قابل للكتابة عليه عالميًا ، ومقروءًا عالميًا ، لأن الأمان.
راجع أيضًا http://pastebin.com/ugXKMFsv
isotopp اقتراحات جيدة. أتساءل لماذا لا نقوم فقط بتغيير الإعداد الافتراضي إلى control_path = %(directory)s/%%C
لتجنب المشكلات المستقبلية.
LukeHoersten أعتقد أنه يجب أن يغير Ansible الافتراضي أيضًا. فى الواقع. انا فعلت
[:~] $ grep -i control ~/.ssh/config
ControlMaster auto
ControlPath ~/.ssh/_%C
Pingbcoca - راجع التحليل والتغييرات المقترحة أعلاه.
+1
لأنه لن يعمل على العديد من أنظمة التشغيل / التوزيعات التي تعمل حتى الإصدارات الأقدم قليلاً من opensh
التغيير المقترح في http://pastebin.com/ugXKMFsv يغير المستندات والتعليقات فقط. ستعمل مع الإصدارات القديمة من opensh ، ولكن اجعل المؤشر إلى٪ C أكثر وضوحًا.
لدي اسم مستخدم طويل على جهازي (11 حرفًا) ، مما تسبب في تجاوز دليلي لعدد الأحرف المسموح به.
https://github.com/ansible/ansible/blob/devel/examples/ansible.cfg#L216 -L225
لقد أسقطت -%%r
وحلت هذه المشكلة بالنسبة لي.
: +1: إلى https://github.com/ansible/ansible/issues/11536#issuecomment -156210086
لقد واجهت هذا الخطأ اليوم لأنه بدلاً من ملف الجرد الخاص بي ، قمت بتوفير ملف group_vars الخاص بي وقمت بتحليل الملف المشفر بطريقة ما بسعادة وقبلت شيئًا مثل 182937891273891723981723891723987189237189237981273981 كاسم مضيف. SSH أيضًا لم يعتقد أن هذا كان غريبًا قبل أن يلاحظ مسار ControlPath الطويل. تحذير للأجيال القادمة - قم بتشغيل كل شيء باستخدام -vvvv وتأكد من أنك تشير إلى المضيف الصحيح وكل ذلك.
شكرا لك على هذا. لقد أصلحت الخطأ الذي كان لدي في OS X El Capitan.
+1
هذا فقط حل مشكلتي على OS X El Capitan.
عملت معي أيضًا على OS X EL Capitan. مجرد ملاحظة ، إذا كنت قد قمت بتثبيت غير صالح من خلال الشراب ، فإن الملف هو /usr/local/etc/ansible/ansible.cfg
: +1 حدث هذا لي فقط أثناء محاولتي القيام بـ ansible all -i inventory -m ping
وجود مضيف باسم مضيف طويل مثل ec2-XX-XXX-XX-XX.eu-west-1.compute.amazonaws.com
لقد نجح هذا بالنسبة لي في El Capitan:
لقد قمت بإنشاء ملف ansible.cfg
في دليلي الحالي باستخدام:
[ssh_connection]
control_path = %(directory)s/%%C
الآن تشغيل ansible ..
لم يعطيني أي أخطاء ssh.
عملت معي أيضًا على OS X EL Capitan. مجرد ملاحظة ، إذا قمت بتثبيت غير مقبول من خلال التخمير ، فإن الملف هو /usr/local/etc/ansible/ansible.cfg
أنا El Capitan وقمت بتثبيت ansible عبر الشراب ، وتجاهل الملف /usr/local/etc/ansible/ansible.cfg
الذي حاولت إضافته بهذه الإعدادات.
tleyden هذا غريب تمامًا ، /usr/local/etc/ansible/ansible.cfg
يعمل بشكل جيد بالنسبة لي.
أوه ، لقد أدركت للتو الفرق - لقد قمت بتثبيت ansible عبر pip install ansible
، وليس عبر الشراب
لماذا هو غريب إضافة سلسلة مثل CErvOvRE5U0urCgm
في النهاية؟ تنكسر الأمور بالنسبة لي بسبب تلك الخيط غير المجدي.
ما عليك سوى إضافة بعض التعليقات هنا لتوضيح الإجراءات التي يمكن اتخاذها:
لقد أضفت أيضًا:
%(directory)s/%%h‐%%r
لكن طريقي لا يزال طويلا؟ كيف يمكنني اصلاح هذا:
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
أرى هذه المشكلة مع 2.1.0.0 على Ubuntu 16.04
$ ssh -V
OpenSSH_7.2p2 Ubuntu-4ubuntu1, OpenSSL 1.0.2g-fips 1 Mar 2016
إضافة هذا إلى عمل ansible.cfg الخاص بي:
[ssh_connection]
control_path=%(directory)s/%%h-%%p-%%r
بدلاً من ذلك ، أدى تغيير اسم مجال AWS الطويل إلى عنوان IP إلى إصلاحه أيضًا ، حتى بدون التغيير إلى ssh_connection.control_path في ansible.cfg.
كما قال الآخرون ، لم يكن هذا الخطأ واضحًا عند التشغيل مع -vvvv. اضطررت إلى نسخ الأمر في إخراج التصحيح وتشغيل ذلك مباشرة في محطة لرؤية الخطأ "طويل جدًا لمقبس مجال Unix".
أنا أيضا لدي نفس المشكلة.
كانت هذه المشكلة مزعجة للغاية ، حيث يتعين عليك التبديل بين IP و FQDN اعتمادًا على الجهاز الذي يقوم بتشغيل كتاب اللعب Ansible ... أي حل حقيقي مخطط له من جانب Ansible؟
swoodford ، ربما يمكنك تقديم مشكلة في توزيعة
ما زلت أعتقد أن Ansible يجب أن يغير دافولت رغم ذلك.
مضحك للغاية. لقد واجهنا نفس المشكلة في cdist منذ بعض الوقت (ونبحث في خطأ آخر متعلق بهذا). إن حد sun_path في نظام التشغيل Unix هو حد قديم حقًا يزعجنا جميعًا في عام 2016.
أسهل حل: لا يوجد.
ثاني أفضل حل: حاول إبقاء اسم المقبس قصيرًا. لا يزال يكسر إذا كان دير المنزل طريق طويل
ثالث أفضل حل: قم بتخزينه في مكان ما في / tmp / Short-random-path / c (تحتاج فقط إلى حرف واحد)
حل طويل المدى: تخلص من حد مسار الشمس أو ارفعه إلى حد افتراضي معقول لعام 2016 (أي شخص من مجموعة أوستن / بوسيكس يقرأ هنا؟)
ماذا يعني %(directory)
؟
isotopp
هل هذا هو بناء الجملة الصحيح (مع بادئة تسطير) لوضع داخل ملف ~/.ssh/config
؟
ControlMaster auto
ControlPath ~/.ssh/_%C
هل هذا هروب له نفس معنى %%
المضاعف من ملف ansible.cfg؟ أحاول تكوين كلاهما بنفس الطريقة التي أستخدم بها ssh حتى خارج ansible.
حتى بعد إضافة control_path
إلى ansible.cfg في مشروعي ، ما زلت أتلقى هذا الخطأ لكنني عدت إلى الإصدار 2.1.3 ، وقمت بتشغيل نفس الأمر الذي ألقى الخطأ عند تشغيل 2.2.1 ، و تم حل المشكلة.
لا تزال تواجه هذه المشكلة مع الإصدار: ansible 2.2.0.0
قضية غريبة حقا. ansible 2.2.0.0 على فيدورا 24 -> مشكلة موجودة
git head من 2016/07/05 على OSX -> المشكلة غير موجودة.
bcoca أنا دائمًا معجب بالتوافق مع الإصدارات السابقة (نعم ، لقد أرسلت إصلاح centos 6.5). ماذا عن جعله ديناميكيًا على إصدار opensh / distro الذي يجب استخدامه في مسار التحكم؟
إنه ديناميكي بالفعل ، انظر إلى المنطق وراء الاتصال "الذكي" باعتباره الافتراضي
عند الاتصال من مضيف إلى مضيف ، ربما لا يكون لديك مفاتيح ssh في حقيبة ظهرك؟ :)
في ملاحظة جانبية ، لا يعد٪ C افتراضيًا كبيرًا في الوقت الحالي حيث أن EL7 قد تم فتحه 6.6 ، ولم تتم إضافة٪ C حتى يتم فتحه 6.7 ولم يتم نقله إلى الخلف.
يمكنك استخدام النموذج الموسع بالكامل لـ٪ l٪ h٪ p٪ r على EL7 بالرغم من ذلك ، ولكن يخفف جزئيًا فقط لأنه لن يقوم بإجراء تجزئة بالطبع.
يجب أن يكون مالكو التوزيعات لتغيير التكوين الافتراضي لتناسب الحزمة المشحونة. أعتقد أن المنبع يجب ألا ينتظر 7 سنوات قبل المضي قدمًا في تحسينات مهمة مثل هذه.
نظرًا لأنني ما زلت أستخدم الإصدار 2.2 من Ansible وبرج Ansible 3.1.1 ، فقد واجهت أيضًا هذه المشكلة. كما أوضحناdennisobrien سابقًا ، أدى تغيير المخزون من اسم مجال AWS إلى عنوان AWS IP إلى حل هذه المشكلة. ومع ذلك ، حاولت استخدام هذه المتغيرات فقط في التكوين أولاً ، ولم يتم حل المشكلة:
---
ssh_connection:
control_path: "%(directory)s/%%h-%%p-%%r"
@ b-long ، استخدم control_path %(directory)s/%%C
خادمي لديه هذه المشكلة وليس لدي أذونات لتغييرها. كيف يمكنني حلها في نهاية العميل؟
thefourtheye إنها مشكلة عميل بحت ، وليست مشكلة خادم. يمكنك العثور على خيار التعيين في ملف ansible.cfg مسبقًا في هذا الموضوع.
antoineco أوه ، شكرا لك. أنا جديد تمامًا على ansible ولم يتم تثبيته حتى في جهازي. هل لا يزال لديك الملف ansible.cfg
في الدليل الرئيسي هل سيعمل؟
لدي نفس المشكلة ، أحاول أن تشمل كل الحلول إضافة ملف التكوين .ansible.cfg في ~ /:
[defaults]
inventory=/etc/ansible/hosts
[ssh_connection]
control_path=%(directory)s/%%h-%%r
control_path_dir=~/.ansible/cp
وأضف معرفة المضيف والملكية الفكرية إلى ssh known_hosts. لكنها ما زالت لا تعمل ، إنها ubuntu على EC2.
هذا هو الخطأ:
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
أنت لا تستخدم الحل المقترح وهو control_path = %(directory)s/%%C
.
akostadinov شكرًا لك ، إنها تعمل. الكثير من الحل هنا.
الكثير من الحل هنا.
لو كان الأمر أصعب ... اللعنة على مقدمي الحلول هؤلاء!
حاولت إضافة جميع الأسطر المقترحة هنا في ملف ~/ansible.cfg
في جهاز الموقع الخاص بي ، لكن ذلك لم يساعد. أنا التخلي.
ما يناسبني الآن هو الحصول على عنوان IP للجهاز بـ nslookup
وتسجيل الدخول بذلك.
thefourtheye ، لست متأكدًا من عدد "الخطوط المقترحة" التي تراها هنا. استخدم المنشور الذي حصل على أكثر من 50 إعجابًا. ولكن إلى جانب الخيار المناسب ، تحتاج إلى استخدام ملف تكوين يعرفه ansible . في حالتك ~/.ansible.cfg
. حاول الانتباه إلى التفاصيل ، النقطة الموجودة أمام ملف تهيئة المستخدم هي اصطلاح يونكس شائع.
akostadinov أنا آسف ، كان هذا خطأ مطبعي. هذه عن كيفية الشبه
➜ ~ cat ~/.ansible.cfg
[ssh_connection]
control_path = %(directory)s/%%h-%%p-%%r
أريد فقط التناغم مع .ansible.cfg
:
[ssh_connection]
control_path = /tmp/control_%%l_%%h_%%p_%%r
بالنسبة لي ، كان directory
شيئًا طويلًا بشكل يبعث على السخرية ، وكان الجزء الأخير مجرد القشة التي قصمت ظهر البعير. لدي أيضًا هذا في .ssh/config
حتى أتمكن من إعادة استخدام نفس الاتصال:
ControlMaster auto
ControlPath /tmp/control_%l_%h_%p_%r
معذرة ، فإن tmp الثابت ليس فقط محمولًا ولكنه يمثل أيضًا خطرًا أمنيًا خطيرًا. لأسباب وجيهة ، لا يسمح MacOS للمستخدمين بالكتابة إلى / tmp ويوفر مجلدات tmp معزولة (خاصة) لكل مستخدم.
لن يعمل Tmp إلا إذا كنت تستخدم مسار tmp المقدم من نظام التشغيل ، شيء مثل٪ (tmp) s ... بعد الترقيع ansible.
يا رفاق ، يرجى قراءة التعليقات الموجودة ، إنه لأمر سخيف أن يأتي الجميع ويسأل نفس الشيء ويضيف شخص ما نفس الحل. استخدم ملف التكوين المناسب وانظر https://github.com/ansible/ansible/issues/11536#issuecomment -153030743.
شخص ما ، الرجاء إغلاق سلسلة الرسائل لتجنب المزيد من البريد العشوائي.
ssbarnea harcoded أي شيء غير محمول ... لهذا السبب ليس الإعداد الافتراضي في غير مرئي ... لست متأكدًا من أنني أوافق على مشكلة الأمان أو مشكلة macOS نظرًا لأن / tmp ثابت ويستخدم opensh وضعًا معقولاً (0600) لهذه الملفات.
بخصوص الحل باستخدام %C
الذي يتطلب opensh حديثًا ...
لا أهتم حقًا بإصدارات ssh القديمة ، خاصةً على وحدة التحكم غير الصالحة. من أجل التطور ، نحتاج إلى ترك بعض الأشياء وراءنا وفي هذه الحالة ليست مشكلة كبيرة حقًا لأن المتأثرين يمكن أن يغيروا التكوين حتى يتمكنوا من الاستمرار في استخدامه.
أعتقد أنه ضروري لتجربة المستخدم Ansible (UX) ، لتوفير الإعدادات الافتراضية التي تناسب معظم المستخدمين ، وتقليل الحاجة إلى التغيير. أشك في أن لدينا أكثر من 1-2٪ من المستخدمين يستخدمون إصدارات opensh المفتوحة التي لا تدعم %C
.
أعتقد أننا بحاجة إلى تنفيذ عدد قليل من متغيرات INI الهامة في Ansible في أسرع وقت ممكن لأننا نواجه أخطاء كل أسبوعين ناتجة عن نقصها: %(tmpdir)s
m $(configdir)s
، %(inventorydir)s
.
إذا كان لدينا هؤلاء الأشخاص ، فسيكون بإمكانهم إنشاء مسارات نسبية موثوقة.
للأسف ، في حالتي ، كانت المشكلة أسوأ لأننا نستخدم Ansible كجزء من CI ولأننا مثل العديد من عُقد Jenkins متعددة على نفس الجهاز ، والتي تعمل تحت نفس المستخدم ، واجهنا سرقة عالية لجلسة ssh كثيرًا. على أي حال ، مشكلتي أكثر تعقيدًا وخارج نطاق هذه التذكرة.
لقد أصلحت هذه المشكلة بطريقة عامة لجميع إصدارات ssh منذ 6 أشهر. إذا كان أي شخص يرى مشكلة Ansible 2.3+ ، فذلك لأنك قمت بتعيين مسار تحكم مخصص في ansible.cfg بدلاً من تركه فارغًا.
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 =
نظرًا لأن هذه المحادثة تستمر دون الرجوع إلى التصحيح أعلاه ، فسوف أقفله. إذا كانت لديك أسئلة أخرى حول هذا الموضوع ، فيرجى استخدام القائمة البريدية.
التعليق الأكثر فائدة
أضف هذا إلى التهيئة غير المرغوبة لتقصير المسار:
قد يكون من المفيد تضمين ذلك في ناتج الخطأ أو القيام بشيء آخر أكثر رشاقة بدلاً من الفشل.