Sorun
En son, kararlı Ansible yapısını kullanarak, oyun kitabım "Gathering_Facts" sırasında bir sunucuda asılı ama Sudo kullanırken diğer benzer sunucularda iyi çalışıyor garip bir sorun var. Ansible sunucusunda, kullanıcı (NIS kullanıcısı) olarak çalıştırıyorum ve değişiklik yapmak için uzak sunucuda sudo (root olarak) kullanıyorum . Sudo'yu bu kurulumdan kaldırırsam, her şey iyi çalışır.
Kurmak
Yazılım Sürümleri
- İşletim Sistemi : RHEL 6.4
- Makul sürüm : ansible 1.8.2
- Sudo sürümü :
Sudo sürüm 1.8.6p3 Sudoers Policy Plugin Sürüm 1.8.6p3 Sudoers dosya gramer sürümü 42 Sudoers I / O eklentisi sürüm 1.8.6p3
- SSH sürümü : OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
Sunucu Haritası
-------- Kullanıcı1 @ Sunucu1: sudo -H -S -p (Toplama_Fabriklerine Asılır) / Kullanıcı1 @ Ansible ---- \ -------- Kullanıcı1 @ Sunucu2: sudo -H -S -p (İyi çalışıyor)
Kullanıcılar
- Kullanıcı1: Sunucu1 ve Sunucu2 üzerinde NIS erişimli kullanıcı.
- root: her sunucu için yerel kök kullanıcı.
Uygun Yapılandırma
Ansible.cfg dosyamın ilgili bölümleri .
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
Boş bir dosyaya dokunup kaldırmak için basit bir test oyun kitabı. Gerçekten, Ansible'ın uzak sunucuda sudo'yu doğru şekilde kullanıp kullanamayacağımı test etmek istiyorum. Başucu kitabı çalışırsa iyi durumdayım.
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
Sudo Yapılandırması
/ Etc / Sudoers
Host_Alias SRV = Server1, Server2
User_Alias SUPPORT = User1, User2, User3
SUPPORT SRV=(root) ALL
Bu sudo yapılandırması, BOTH sunucularında iyi çalışır. Sudo ile ilgili sorun yok.
Hepsini Nasıl Çalıştırırım
Çok basit:
$ ansible-playbook test.yml SSH şifresi: sudo password [varsayılan olarak SSH password]: OYNA [Sunucu1: Sunucu2] ******************************************** ** TOPLANTI GERÇEKLERİ ************************************************ *************** tamam: [Sunucu2] başarısız oldu: [Sunucu1] => {"başarısız oldu": doğru, "ayrıştırıldı": yanlış} Üzgünüm, tekrar dene. [sudo via ansible, anahtar = mxxiqyvztlfnbctwixzmgvhwfdarumtq] şifre: sudo: 1 yanlış şifre girişimi GÖREV: [bağlantı ve sudo erişimini test etmek için boş bir dosya oluşturun] **************** değiştirildi: [Sunucu2] NOTIFIED: [temiz] ********************************************* **************** değiştirildi: [Sunucu2] PLAY RECAP ************************************************ ******************** yeniden denemek için şunu kullanın: --limit @ / home / User1 / test.retry Sunucu1: ok = 0 değişti = 0 ulaşılamıyor = 0 başarısız oldu = 1 Sunucu2: ok = 3 değişti = 2 ulaşılamıyor = 0 başarısız = 0
Hem SSH / Sudo parolalarını hem de dolaylı olarak (sudo'nun SSH'ye varsayılan olarak geçmesine izin vererek) açıkça girersem de başarısız olur.
Uzak Sunucu Günlükleri
Sunucu1 (Başarısız)
/ Var / log / güvenli
31 Aralık 15:21:10 Server1 sshd [27093]: xxxx bağlantı noktası 51446 ssh2'den User1 için kabul edilen şifre 31 Aralık 15:21:10 Sunucu1 sshd [27093]: pam_unix (sshd: session): User1 kullanıcısı için oturum açıldı (uid = 0) Aralık 31 15:21:11 Sunucu1 sshd [27095]: sftp için alt sistem isteği 31 Aralık 15:21:11 Sunucu1 sudo: pam_unix (sudo: auth): kimlik doğrulama hatası; logname = Kullanıcı1 uid = 187 euid = 0 tty = / dev / pts / 1 ruser = Kullanıcı1 rhost = kullanıcı = Kullanıcı1 31 Aralık 15:26:13 Sunucu1 sudo: pam_unix (sudo: auth): konuşma başarısız 31 Aralık 15:26:13 Sunucu1 sudo: pam_unix (sudo: auth): auth [Kullanıcı1] için şifre tanımlayamadı 31 Aralık 15:26:13 Sunucu1 sudo: Kullanıcı1: 1 yanlış şifre girişimi; TTY = pts / 1; PWD = / ana sayfa / Kullanıcı1; KULLANICI = kök; KOMUT = / bin / sh -c yankı 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 Aralık 15:26:13 Sunucu1 sshd [27093]: pam_unix (sshd: session): kullanıcı1 için oturum kapatıldı
Sunucu2 (iyi çalışır)
/ Var / log / güvenli
31 Aralık 15:21:12 Server2 sshd [31447]: xxxx bağlantı noktası 60346 ssh2'den User1 için kabul edilen şifre 31 Aralık 15:21:12 Sunucu2 sshd [31447]: pam_unix (sshd: session): User1 kullanıcısı için oturum açıldı (uid = 0) Aralık 31 15:21:12 Sunucu2 sshd [31449]: sftp için alt sistem isteği 31 Aralık 15:21:12 Sunucu2 sudo: Kullanıcı1: TTY = pts / 2; PWD = / ana sayfa / Kullanıcı1; KULLANICI = kök; KOMUT = / bin / sh -c yankı 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 Aralık 15:21:14 Server2 sshd [31447]: pam_unix (sshd: session): kullanıcı1 için oturum kapatıldı
STrace Çıkışı
Kök kullanıcının ansible komutunu hedeflerken strace çıktısı. Komut:
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`
Sunucu 1
23650 seçim (0, NULL, NULL, NULL, {1, 508055}) = 0 (Zaman Aşımı) 23650 soket (PF_NETLINK, SOCK_RAW, 9) = 10 23650 fcntl (10, F_SETFD, FD_CLOEXEC) = 0 23650 readlink ("/ proc / self / exe", "/ usr / bin / sudo", 4096) = 13 23650 sendto (10, "| \ 0 \ 0 \ 0L \ 4 \ 5 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0op = PAM: otantik" ..., 124, 0, {sa_family = AF_NETLINK, pid = 0, gruplar = 00000000}, 12) = 124 23650 anket ([{fd = 10, olaylar = POLLIN}], 1, 500) = 1 ([{fd = 10, revents = POLLIN}]) 23650 recvfrom (10, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0b \\\ 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, gruplar = 00000000}, [12]) = 36 23650 recvfrom (10, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0b \\\ 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, gruplar = 00000000}, [12]) = 36 23650 yakın (10) = 0 23650 write (2, "Üzgünüm, tekrar deneyin. \ N", 18) = 18 23650 gettimeofday ({1420050850, 238344}, NULL) = 0 23650 soket (PF_FILE, SOCK_STREAM, 0) = 10 23650 bağlantı (10, {sa_family = AF_FILE, yol = "/ var / run / dbus / system_bus_socket"}, 33) = 0
Sunucu2
6625 seçin (8, [5 7], [], NULL, NULL) =? ERESTARTNOHAND (Yeniden başlatılacak) 6625 - SIGCHLD (Çocuk çıkıldı) @ 0 (0) --- 6625 yazma (8, "\ 21", 1) = 1 6625 rt_sigreturn (0x8) = -1 EINTR (Kesilmiş sistem çağrısı) 6625 seçim (8, [5 7], [], NULL, NULL) = 1 ([7] 'de) 6625 okuma (7, "\ 21", 1) = 1 6625 wait4 (6636, [{WIFEXITED (s) && WEXITSTATUS (s) == 0}], WNOHANG | WSTOPPED, NULL) = 6636 6625 rt_sigprocmask (SIG_BLOCK, NULL, [], 8) = 0 6625 soket (PF_NETLINK, SOCK_RAW, 9) = 6 6625 fcntl (6, F_SETFD, FD_CLOEXEC) = 0 6625 readlink ("/ 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 \ 0op = PAM: session_c" ..., 120, 0, {sa_family = AF_NETLINK, pid = 0, gruplar = 00000000}, 12) = 120 6625 anket ([{fd = 6, olaylar = POLLIN}], 1, 500) = 1 ([{fd = 6, revents = POLLIN}]) 6625 recvfrom (6, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 6 \ 0 \ 0 \ 0 \ 330 \ 355 \ 377 \ 377 \ 0 \ 0 \ 0 \ 0x \ 0 \ 0 \ 0R \ 4 \ 5 \ 0 \ 6 \ 0 \ 0 \ 0 "..., 8988, MSG_PEEK | MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, gruplar = 00000000}, [12]) = 36 6625 recvfrom (6, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 6 \ 0 \ 0 \ 0 \ 330 \ 355 \ 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, gruplar = 00000000}, [12]) = 36 6625 yakın (6) = 0 6625 açık ("/ etc / security / 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_uid = 2980, st_atime = 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 okuma (6, "# \ n # Bu fi yapılandırması" ..., 4096) = 2980 6625 okuma (6, "", 4096) = 0 6625 yakın (6) = 0 6625 munmap (0x7fbc3a59a000, 4096) = 0 6625 açık ("/ etc / environment", O_RDONLY) = 6
Tahminimce
Sunucu1 şifreyi düzgün almıyor veya yanlış bir şifre istiyor / bekliyor. Bu bir Sudo veya Ansible sorununa benzemiyor (tek başına, ikisi de gayet iyi çalışıyor), ancak Server1 kimlik bilgilerini Server2 ile aynı şekilde almıyor (veya onlara uyuyor). Sunucu1 ve 2 farklı amaçlara hizmet eder, bu nedenle bazı kimlik doğrulama veya paket sürüm farklılıklarına sahip olmaları mümkündür, ancak her ikisi de aynı depodan oluşturulmuştur; bu nedenle, bunlar farklı olmamalıdır.
PAM Yetkilendirme
Belki de sistemlerin farklı PAM konfigürasyonları olduğunu ve şifrelerin biraz farklı bir şekilde ele alınmasına neden olduğunu düşündüm. /Etc/pam.d/ dosyalarını (kullanarak md5sum [file]
) karşılaştırdım ve bunlar iki sistem arasında aynı.
Testler
Sudo STDIN
Sudo'nun STDIN'den bir parola okumaması, ancak her iki sunucuda da iyi çalıştığı başka bir sorunu test etti.
Sudo Ad-Hoc'u test et
-bash-4.1 $ ansible Server1 -m dosyası -a "dest = / tmp / ansible_test.txt durumu = dokunma" -sK SSH şifresi: sudo password [varsayılan olarak SSH password]: Sunucu1 | başarı >> { "değiştirildi": doğru, "dest": "/tmp/ansible_test.txt", "gid": 0, "grup": "kök", "mod": "0644", "owner": "kök", "boyut": 0, "state": "dosya", "uid": 0 }
Başarı! Ama neden?!
TL; DR
- Server2 gayet iyi çalışırken Server1 sudo şifre isteminde bekliyor gibi görünüyor.
- Koşu
ansible
Sunucu1'i "anlık" cezası çalışır. Bir oynatma kitabı olarak çalıştırmak başarısız olur.
Soru (lar)
- Ansible Sudo yapılandırmamın bir sunucuda düzgün çalışmasına ve başka bir sunucuda reddedilmesine ne sebep olabilir?
- Ansible, ad-hoc ve playbook'u çalıştırırken yerelden uzak makineye "geçiş" şifresini farklı mı yapıyor? Onların aynı olacağını varsaymıştım.
Bu sadece GitHub sayfasına bir hata raporu göndermeye yakınlaştığını düşünüyorum, sadece sudo erişiminin ad-hoc çalıştırıp çalıştırmamaya bağlı olarak farklı sonuçlara sahip olması gerçeğine bağlı.