मुसीबत
नवीनतम, स्थिर Ansible बिल्ड का उपयोग करते हुए, मुझे एक अजीब समस्या है, जहां मेरी प्लेबुक "Gathering_Facts" के दौरान एक सर्वर पर लटकाती है, लेकिन सूडो का उपयोग करते समय अन्य समान सर्वर पर ठीक काम करती है। Ansible सर्वर पर, मैं अपने उपयोगकर्ता (NIS उपयोगकर्ता) के रूप में चलता हूं और परिवर्तन करने के लिए दूरस्थ सर्वर पर sudo (रूट के रूप में ) का उपयोग करता हूं । अगर मैं सूडो को इस सेटअप से हटाता हूं, तो सब कुछ ठीक रहता है।
सेट अप
सॉफ्टवेयर संस्करण
- ओएस : आरएचईएल 6.4
- Ansible संस्करण : ansible 1.8.2
- सूडो संस्करण :
सूडो संस्करण 1.8.6p3 सूडर्स पॉलिसी प्लगइन संस्करण 1.8.6p3 सूदखोर व्याकरण संस्करण 42 फाइल करते हैं Sudoers I / O प्लगइन संस्करण 1.8.6p3
- SSH संस्करण : OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 मार्च 2010
सर्वर का नक्शा
-------- User1 @ Server1: sudo -H -S -p (Gathering_Facts पर लटका) / User1 @ Ansible ---- \ -------- User1 @ Server2: sudo -H -S -p (वर्क्स ठीक)
उपयोगकर्ता
- User1: सर्वर 1 और Server2 दोनों पर एनआईएस सुलभ उपयोगकर्ता।
- रूट: प्रत्येक सर्वर के लिए स्थानीय रूट उपयोगकर्ता।
उत्तर देने योग्य विन्यास
मेरे ansible.cfg के प्रासंगिक हिस्से ।
ansible.cfg
sudo = true
sudo_user = root
ask_sudo_pass = True
ask_pass = True
...
gathering = smart
....
# change this for alternative sudo implementations
sudo_exe = sudo
# what flags to pass to sudo
#sudo_flags = -H
...
# remote_user = ansible
यहां एक खाली फ़ाइल को छूने और फिर उसे निकालने के लिए एक सरल परीक्षण पुस्तिका है। वास्तव में, मैं बस परीक्षण करना चाहता हूं कि क्या मैं दूरस्थ सर्वर पर सुडो का सही ढंग से उपयोग करने के लिए अन्सिबल प्राप्त कर सकता हूं। अगर प्लेबुक बिल्कुल चलती है, तो मैं अच्छे आकार में हूं।
TEST.yml
---
- hosts: Server1:Server2
vars:
- test_file: '/tmp/ansible_test_file.txt'
sudo: yes
tasks:
- name: create empty file to test connectivity and sudo access
file: dest={{ test_file }}
state=touch
owner=root group=root mode=0600
notify:
- clean
handlers:
- name: clean
file: dest={{ test_file }}
state=absent
सूद विन्यास
/ Etc / sudoers
Host_Alias SRV = Server1, Server2
User_Alias SUPPORT = User1, User2, User3
SUPPORT SRV=(root) ALL
यह sudo कॉन्फ़िगरेशन BOTH सर्वर पर ठीक काम करता है। खुद सूडो से कोई समस्या नहीं।
मैं यह सब कैसे चलाते हैं
बहुत आसान:
$ asible-playbook test.yml SSH पासवर्ड: sudo पासवर्ड [SSH पासवर्ड में चूक]: प्ले [सर्वर 1: सर्वर 2] ******************************* ** परिचारिकाएं ******************************* *************** ठीक है: [Server2] विफल: [Server1] => {"विफल": सच, "पार्स": असत्य} क्षमा करें दोबारा प्रयास कीजिये। [sudo asible, key = mxxiqyvztlfnbctwixzmgvhwfdarumtq] पासवर्ड के माध्यम से: sudo: 1 गलत पासवर्ड का प्रयास TASK: [कनेक्टिविटी और sudo एक्सेस का परीक्षण करने के लिए खाली फ़ाइल बनाएं] **************** परिवर्तित: [Server2] नोट: [साफ] ***************************** **************** परिवर्तित: [Server2] PLAY RECAP ************************************* ******************** पुनः प्रयास करने के लिए, का उपयोग करें: - @ @ घर / User1 / test.retry सर्वर 1: ठीक = 0 परिवर्तित = 0 अप्राप्य = 0 विफल = 1 Server2: ok = 3 परिवर्तित = 2 अप्राप्य = 0 विफल = 0
अगर मैं स्पष्ट रूप से एसएसएच / सूडो दोनों पासवर्ड के साथ-साथ अंतर्निहित रूप से प्रवेश करता हूं, तो इसमें विफल रहता है (सूडो एसएसएच के लिए डिफ़ॉल्ट रूप से पास होने देता है)।
रिमोट सर्वर लॉग
सर्वर 1 (विफल)
/ Var / log / सुरक्षित
31 दिसंबर 15:21:10 Server1 sshd [27093]: xxxx पोर्ट 51446 ssh2 से User1 के लिए स्वीकृत पासवर्ड 31 दिसंबर 15:21:10 Server1 sshd [27093]: pam_unix (sshd: session): उपयोगकर्ता द्वारा उपयोगकर्ता के लिए खोला गया सत्र (uid = 0) 31 दिसंबर 15:21:11 Server1 sshd [27095]: sftp के लिए सबसिस्टम अनुरोध 31 दिसंबर 15:21:11 Server1 sudo: pam_unix (sudo: cort): प्रमाणीकरण विफलता; logname = User1 uid = 187 euid = 0 tty = / dev / pts / 1 ruser = उपयोगकर्ता 1 rhost = उपयोगकर्ता = उपयोगकर्ता 1 31 दिसंबर 15:26:13 Server1 sudo: pam_unix (sudo: cort): बातचीत विफल रही 31 दिसंबर 15:26:13 Server1 sudo: pam_unix (sudo: cort): सेकंड पासवर्ड के लिए पासवर्ड की पहचान नहीं कर सका] 31 दिसंबर 15:26:13 Server1 sudo: User1: 1 गलत पासवर्ड प्रयास; TTY = pts / 1; PWD = / home / User1; USER = जड़; COMMAND = / bin / sh -c echo SUDO-SUCCESS-mxxiqyvztlfnbctwixzmgvhwfdarumtq; LANG = C LC_CTYPE = C / usr / bin / python /tmp/.ansible/tmp/ansible-tmp-1420039272.66-164754043073536/setup; rm -rf /tmp/.ansible/tmp/ansible-tmp-1420039272.66-164754043073536/> / dev / null 2> & 1 31 दिसंबर 15:26:13 Server1 sshd [27093]: pam_unix (sshd: session): उपयोगकर्ता User1 के लिए सत्र बंद
Server2 (ठीक चलता है)
/ Var / log / सुरक्षित
31 दिसंबर 15:21:12 Server2 sshd [31447]: xxxx पोर्ट 60346 ss2 से User1 के लिए स्वीकृत पासवर्ड 31 दिसंबर 15:21:12 Server2 sshd [31447]: pam_unix (sshd: session): उपयोगकर्ता द्वारा उपयोगकर्ता के लिए खोला गया सत्र (uid = 0) 31 दिसंबर 15:21:12 Server2 sshd [31449]: sftp के लिए सबसिस्टम अनुरोध 31 दिसंबर 15:21:12 Server2 sudo: User1: TTY = pts / 2; PWD = / home / User1; USER = जड़; COMMAND = / bin / sh -c echo SUDO-SUCCESS-vjaypzeocvrdlqalxflgcrcoezhnbibs; LANG = C LC_CTYPE = C / usr / bin / python /tmp/.ansible/tmp/ansible-tmp-1420039272.68-243930711246149/setup; rm -rf /tmp/.ansible/tmp/ansible-tmp-1420039272.68-243930711246149/> / dev / null 2> & 1 31 दिसंबर 15:21:14 Server2 sshd [31447]: pam_unix (sshd: session): उपयोगकर्ता User1 के लिए सत्र बंद
स्ट्रेस आउटपुट
यहां रूट उपयोक्ता के कमांड कमांड को स्ट्रेस से आउटपुट दिया गया है। कमान:
while [[ -z $(ps -fu root|grep [a]nsible|awk '{print $2}') ]]; do
continue
done
strace -vfp $(ps -fu root|grep [a]nsible|awk '{print $2}') -o /root/strace.out`
Server1
23650 सेलेक्ट (0, NULL, NULL, NULL, {1, 508055}) = 0 (टाइमआउट) 23650 सॉकेट (PF_NETLINK, SOCK_RAW, 9) = 10 23650 fcntl (10, F_SETFD, FD_CLOEXEC) = 0 23650 रीडलिंक ("/ proc / स्व / निर्वासन", "/ usr / बिन / sudo", 4096) = 13 23650 Sendto (10, "| \ 0 \ 0 \ 0L \ 4 \ 5 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0op = PAM: प्रामाणिक" ..., 124, 0, {sa_famY = AF_NETLINK, pid = 0, समूह = 00000000}, 12) = 124 23650 पोल ([{fd = 10, इवेंट = POLLIN}], 1, 500) = 1 ([{fd = 10, revents = POLLIN}]) 23650 पुनरावृत्ति (10, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0b \\\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 | \ 0 \ 0 \ 0 \ 0L) \ 4 \ 5 \ 0 \ 1 \ 0 \ 0 \ 0 "..., 8988, MSG_PEEK | MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, group = 00000000}, [12]) = 36 23650 पुनरावृत्ति (10, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0b \\\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 | \ 0 \ 0 \ 0 \ 0L) \ 4 \ 5 \ 0 \ 1 \ 0 \ 0 \ 0 "..., 8988, MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, समूह = 00000000}, [12]) [36] 23650 पास (10) = 0 23650 लिखें (2, "क्षमा करें, पुन: प्रयास करें। \ n", 18) = 18 23650 गेटटाइमऑफडे ({1420050850, 238344}, NULL) = 0 23650 सॉकेट (PF_FILE, SOCK_STREAM, 0) = 10 23650 कनेक्ट (10, {sa_family = AF_FILE, path = "/ var / run / dbus / system_bus_socket"}, 33) = 0
Server2
6625 चयन (8, [5 7], [], NULL, NULL) =? ERESTARTNOHAND (पुनः आरंभ किया जाना) ६६२५ --- सिगल्डएलडी (बच्चा बाहर) @ ० (०) --- 6625 लिखना (8, "\ 21", 1) = 1 6625 rt_sigreturn (0x8) = -1 EINTR (बाधित सिस्टम कॉल) 6625 चयन (8, [5 7], [], NULL, NULL) = 1 ([7] में) 6625 पढ़ा (7, "\ 21", 1) = 1 6625 प्रतीक्षा 4 (6636, [{WIFEXITED (s) && WEXITSTATUS (s) == 0}], WNOHANG | WSTOPPED, NULL) = 6636 6625 rt_sigprocmask (SIG_BLOCK, NULL, [], 8) = 0 6625 सॉकेट (PF_NETLINK, SOCK_RAW, 9) = 6 6625 fcntl (6, F_SETFD, FD_CLOEXEC) = 0 6625 रीडलिंक ("/ proc / self / exe", "/ usr / bin / sudo", 4096) = 13 6625 sendto (6, "x \ 0 \ 0 \ 0R \ 4 \ 5 \ 0 \ 6 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0op = PAM: session_c" ..., 120, 0, {sa_amamily] = AF_NETLINK, pid = 0, समूह = 00000000}, 12) = 120 6625 पोल ([{fd = 6, इवेंट्स = POLLIN}], 1, 500) = 1 ([{fd = 6, revents = POLLIN}]) 6625 रिकवरफ्रॉम (6, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 6 \ 0 \ 0 \ 0 \ 0 \ 330 \ 355 \ 377 \ 377 \ 377 \ 0 \ 0 \ 0 \ 0x \ 0 \ 0 \ \) 0R \ 4 \ 5 \ 0 \ 6 \ 0 \ 0 \ 0 \ "..., 8988, MSG_PE44 / MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, group =0000}, [12]) = 36 6625 रिकवरफ्रॉम (6, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 6 \ 0 \ 0 \ 0 \ 0 \ 330 \ 355 \ 377 \ 377 \ 377 \ 0 \ 0 \ 0 \ 0x \ 0 \ 0 \ \) 0R \ 4 \ 5 \ 0 \ 6 \ 0 \ 0 \ 0 "..., 8988, MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, समूह = 00000000}, [12]] = 36 6625 पास (6) = 0 6625 खुला ("/ etc / सुरक्षा / pam_env.conf", O_RDONLY) = 6 6625 fstat (6, {st_dev = makedev (253, 1), st_ino = 521434, st_mode = S_IFREG | 0644, st_nlink = 1, st_uid = 0, st_gid = 0, st_blksize = 4096, st_blocks = 8, st_size = 8_state)। = 2014/12 / 31-16: 10: 01, st_mtime = 2012/10 / 15-08: 23: 52, st_ctime = 2014/06 / 16-15: 45: 35}) = 0 6625 mmap (NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) = 0x7fbc3a59a000 6625 पढ़ा (6, "# \ n # यह कॉन्फ़िगरेशन फाई है" ..., 4096) = 2980 6625 पढ़ा (6, "", 4096) = 0 6625 पास (6) = 0 6625 मूनमैप (0x7fbc3a59a000, 4096) = 0 6625 खुला ("/ etc / पर्यावरण", O_RDONLY) = 6
मेरा अनुमान
Server1 को ठीक से पासवर्ड नहीं मिल रहा है या गलत तरीके से पासवर्ड के लिए पूछ रहा है / इंतजार कर रहा है। यह सूडो या अन्सिबल समस्या (अकेले, वे दोनों ठीक काम करते हैं) की तरह नहीं दिखता है, लेकिन Server1 को सर्वर 2 के समान रूप में क्रेडेंशियल्स (या उनका पालन करना) प्राप्त नहीं होता है। Server1 और 2 विभिन्न उद्देश्यों की पूर्ति करते हैं, इसलिए यह संभव है कि उनके पास कुछ प्रमाणीकरण या पैकेज संस्करण अंतर हैं, लेकिन वे दोनों एक ही भंडार से निर्मित थे; इसलिए, उन्हें अलग नहीं होना चाहिए।
PAM प्रामाणिक
मैंने सोचा कि शायद सिस्टम में अलग-अलग PAM कॉन्फ़िगरेशन थे, जिससे पासवर्ड को थोड़ा अलग तरीके से हैंडल किया जा सकता था। मैंने /etc/pam.d/ फ़ाइलों (उपयोग करने md5sum [file]
) की तुलना की , और वे दोनों प्रणालियों के बीच समान हैं।
टेस्ट
सूदो STDIN
एक अन्य मुद्दे का परीक्षण किया, जहां सूडान एसटीडीआईएन से पासवर्ड नहीं पढ़ेगा, लेकिन दोनों सर्वरों पर ठीक काम किया।
टेस्ट सुडो एड-हॉक
-Bash-4.1 $ ansible Server1 -m फ़ाइल -a "dest = / tmp / ansible_test.txt राज्य = स्पर्श" -sK SSH पासवर्ड: sudo पासवर्ड [SSH पासवर्ड में चूक]: सर्वर 1 | सफलता >> { "परिवर्तित": सच, "डेस्ट": "/tmp/ansible_test.txt", "गिद": 0, "समूह": "जड़", "मोड": "0644", "स्वामी": "जड़", "आकार": 0, "राज्य": "फ़ाइल", "यूआईडी": 0 }
सफलता! लेकिन क्यों?!
टी एल; डॉ
- Server1 sudo पासवर्ड प्रॉम्प्ट पर प्रतीक्षा कर रहा है, जबकि Server2 ठीक चलता है।
ansible
Server1 पर "एड-हॉक" चलाना ठीक काम करता है। इसे प्लेबुक के रूप में चलाना विफल हो जाता है।
प्रशन)
- एक सर्वर पर ठीक काम करने और दूसरे पर अस्वीकार किए जाने के कारण मेरे Ansible Sudo कॉन्फ़िगरेशन क्या हो सकता है?
- क्या स्थानीय और दूरस्थ मशीन से अलग-अलग तरीके से एड-हॉक बनाम प्लेबुक चलाते समय Ansible पासवर्ड करता है? मैंने मान लिया कि वे वही होंगे।
मुझे लगता है कि यह पूरी तरह से इस तथ्य पर विशुद्ध रूप से GitHub पृष्ठ पर एक बग रिपोर्ट प्रस्तुत करने के करीब हो रहा है कि सुडोकू उपयोग के अलग-अलग परिणाम हैं यदि मैं तदर्थ चला रहा हूं या नहीं।