Anahtar reddedilirse Ansible şifresini nasıl kullanılır?


15

Yeni sunucu örneklerim ssh üzerinden parola ile oturum açacak şekilde yapılandırıldı. Ansible playbook'umun anahtarları kullanmak için yeniden yapılandırmasını ve ilk çalıştırmada şifre ile root girişini devre dışı bırakmasını istiyorum, bu yüzden böyle bir şeye ihtiyacım var:

  • anahtarla giriş yapmayı dene
  • anahtar ile giriş yapamıyorsanız:

    • şifre ile giriş yap
    • yetkili_anahtarlara anahtar ekle
    • şifre ile root girişini devre dışı bırak
    • isteğe bağlı olarak anahtar kullanarak yeniden bağlanın
  • diğer görevleri yap

Bunu nasıl başarabilirim?

EDIT : Açıkça, nasıl anahtar eklemek veya kök devre dışı bırakmak için sormuyorum, bu sadece bağlam için. Anahtarla kimlik doğrulaması yapamadıysa nasıl şifreye geri dönüleceğini soruyorum. Ansible ile --ask-passveya ansible_ssh_passayarlandığında, ortak anahtar kimlik doğrulamasını kullanmaya bile çalışmaz


Güzel soru, şu ana kadar ne denedin?
dawud

1
Ssh yapılandırmasını ayrı bir playbook'a aldım ve -k seçeneği ile çalıştırıyorum, sonra ana playbook'u -k (ajandan anahtar kullanarak) olmadan çalıştırıyorum. Gerçi tek bir oyun kitabına sarılabileceğini umuyordum ...
petr0

@ petr0 Ask-pass şifresi anahtardan farklı bir kullanıcı için olduğunda (yani, şifreli ssh'yi devre dışı bıraktıktan sonra uzak kullanıcıyı değiştirdiğinizde) bu benim için çalışır. İşe yarayacağından emin değilim.
DylanYoung

Yanıtlar:


6

PreferredAuthenticationsSeçeneği ayarlayarak deneyebilirsiniz publickey,password. Varsayılan, bunları diğer seçeneklerle birlikte bu sırayla içerir, bu nedenle ansible muhtemelen bunu ayarlamaktadır. -oVeya istemci yoluyla eklemek bunu ssh_configengelleyebilir.

Bir sarmalayıcı komut dosyası kullanabilirsiniz. Örneğin, bu key_or_password.shve a pass.shile parolayı vererek, çalışan bash key_or_password.sh root@hostbir publickey ve ardından etkileşimli olmayan bir parola girişi dener.

export DISPLAY=dummy:0
export SSH_ASKPASS=$PWD/pass.sh
exec setsid ssh -v -o 'PreferredAuthentications publickey,password' "$@"

Günlük, hangi yöntemin başarılı olduğunu gösterir;

debug1: Authentication succeeded (publickey).

7

ansible_userBaşucu kitabının 'ilk çalıştırılması' için farklıysa (örneğin yalnızca bir rootkullanıcınız varsa ve SSH anahtarıyla yeni bir kullanıcı kuracaksanız) yaptığım şey :

  • Parolayı, ansible_passparola girişlerini kullanıyorsanız (Apps Kasası'nı kullanmayı unutmayın) yaptığınız gibi saklayın; bu, oynatma kitabının 'ilk çalıştırılması' için kullandığınız kullanıcının parolası olmalıdır.
  • Set ansible_userEğer sunucu üzerinde doğru kurulmuş kullanıcıları olduğunda ilk çalıştırdıktan sonra kullanmak istediğiniz kullanıcının kullanıcı adına.
  • ansible_user_first_runÖrneğin, oynatma kitabının 'ilk çalıştırılması' için kullanacağınız kullanıcıya bir değişken ayarlayın root.
  • Sunucuya doğru SSH anahtarıyla bağlanmayı denemek için yerel bir komut kullanın ignore_errorsvechanged_when: False
  • Bu başarısız olursa, ansible_userdeğerini güncelleyinansible_user_first_run

İşte kod:

---
- name: Check if connection is possible
  command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
  register: result
  connection: local
  ignore_errors: yes
  changed_when: False
- name: If no connection, change user_name
  connection: local
  set_fact:
    ansible_user: "{{ ansible_user_first_run }}"
  when: result|failed

Not: transport = sshParamiko'nun bazı yapılandırmalarda beklenmedik bir şekilde sunucuya giriş yapamaması nedeniyle ayarlamaya değer (örneğin, sunucu şifreleri kabul etmeyecek şekilde ayarlandığında ve önce bir anahtarla, sonra bir şifre ile çalışıyorsunuz ... tuhaf!) Ayrıca ssh taşımacılığı daha hızlıdır, bu yüzden buna değer.

Ek not: Bu yöntemi kullanıyorsanız, gather_facts: falseşifre sınama aşamasına gelmeden kurulum / bilgi toplama görevlerinin otomatik olarak çalıştırılmaması için oynatma kitabı tanım dosyanızda belirtmeniz gerekir . Eğer yanıtlayıcı 'gerçeklerin herhangi gerekiyorsa, açıkça çağırmanız gerekir setupgibi yerlerde normal olarak mevcut herhangi bir veri erişmeden önce rol ansible_devicesvs. Bunu yapmanın iyi bir yolu aramaktır setupbir ile whençekler olmadığını görmek için bu fıkra Kullandığınız gerçek, rolünüz olarak adlandırmadan önce boştur ya da değildir.


Çözümünüz iyi, ancak gather_facts: nooyun kitabını başlatırken bağlanmayı denemek için ansible'ı durdurmak zorundasınız :)
k4cy

Haklısın. Açık bir şekilde 'kurulum' çağırmak zorunda tüm playbooks için kapalı set_facts var. Cevapta bundan bahsetmeyi unuttum, şimdi güncelleyeceğim.
Tom Bull

6

--ask-passAnsible-playbook çalıştırırken kullanabilirsiniz .

Sorduğunuz diğer görevler için, çeşitli yollarla, örneğin kopya modülü ile gerçekleştirilebilir.
Kök girişini devre dışı bırakmak da yapılabilir. templating tarafından sshd_confveya conf dosyasında satır ekleyerek.


--ask-pass (-k ile aynıdır) yaptığım şeydir ve yukarıdaki yorumda yazdım
petr0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.