यदि कुंजी को अस्वीकार कर दिया गया था, तो उसे कैसे उपयोग किया जा सकता है?


14

मेरा नया सर्वर इंस्टेंस पासवर्ड के साथ ssh के माध्यम से रूट पर लॉगिन करने के लिए कॉन्फ़िगर किया गया है। मैं चाहता हूं कि मेरी Ansible playbook इसे बदले में कुंजियों का उपयोग करने के लिए फिर से कॉन्फ़िगर करें और पहले रन पर पासवर्ड के साथ रूट लॉगिन को अक्षम करें, इसलिए मुझे इस तरह की आवश्यकता नहीं है:

  • कुंजी से लॉगिन करने का प्रयास करें
  • यदि आप कुंजी से लॉगिन नहीं कर सकते हैं:

    • पासवर्ड से लॉगिन करें
    • अधिकृत_की में कुंजी जोड़ें
    • पासवर्ड के साथ रूट लॉगिन अक्षम करें
    • कुंजी का उपयोग करके वैकल्पिक रूप से पुन: कनेक्ट करें
  • अन्य कार्य करें

मैं इसे कैसे पूरा कर सकता हूं?

संपादित करें : स्पष्ट होने के लिए, मैं यह नहीं पूछ रहा हूं कि कुंजी कैसे जोड़ें या रूट को अक्षम करें, यह केवल संदर्भ के लिए है। अगर यह कुंजी के साथ प्रमाणित नहीं कर सकता है तो मैं पासवर्ड कैसे वापस कर सकता हूं। --ask-passया ansible_ssh_passसेट के साथ , Ansible सार्वजनिक कुंजी प्रमाणीकरण का उपयोग करने का प्रयास भी नहीं करेगा


अच्छा सवाल, आपने अब तक क्या कोशिश की है?
18

1
मैंने ssh कॉन्फ़िगरेशन को एक अलग प्लेबुक में ले लिया और मैं इसे -k विकल्प के साथ चलाता हूं, फिर मैं मुख्य प्लेबुक को -k (एजेंट से कुंजी का उपयोग करके) चलाता हूं। मैं उम्मीद कर रहा था कि इसे एक ही
नाटकपुस्तिका

@ petr0 यह मेरे लिए तब काम कर रहा है जब पूछ-पास पासवर्ड कुंजी से अलग उपयोगकर्ता के लिए है (यानी जब आप पासवर्ड को अक्षम करने के बाद दूरस्थ उपयोगकर्ता को स्विच करते हैं)। यकीन नहीं होता है कि मदद करता है।
डायलनयुंग

जवाबों:


6

आप PreferredAuthenticationsविकल्प की कोशिश कर सकते हैं , इसे करने के लिए सेटिंग publickey,password। डिफ़ॉल्ट में इस क्रम में इन्हें शामिल किया गया है, अन्य विकल्पों के साथ, इसलिए यह संभवत: इसे निर्धारित कर रहा है। के माध्यम से -oया ग्राहक ssh_configको जोड़ने से इसे रोका जा सकता है।

आप एक रैपर स्क्रिप्ट का उपयोग करने में सक्षम हो सकते हैं। उदाहरण के लिए, इसके साथ key_or_password.shऔर pass.shयह पासवर्ड देता है, चल रहा bash key_or_password.sh root@hostहै एक गैर-इंटरैक्टिव पासवर्ड लॉगिन के बाद एक publickey की कोशिश करेगा।

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

लॉग इंगित करता है कि किस विधि के साथ सफल हुआ, उदा

debug1: Authentication succeeded (publickey).

7

यहाँ मैं क्या करता हूँ अगर ansible_userप्लेबुक के 'पहले रन' के लिए अलग है (उदाहरण के लिए यदि आपके पास केवल एक rootउपयोगकर्ता है और आप एक SSH कुंजी के साथ एक नया उपयोगकर्ता सेट करने जा रहे हैं):

  • पासवर्ड को इस ansible_passरूप में स्टोर करें जैसे कि आप पासवर्ड लॉगिन का उपयोग कर रहे थे (वॉल्ट का उपयोग करना याद रखें) यह उस उपयोगकर्ता का पासवर्ड होना चाहिए जिसे आप प्लेबुक के 'पहले रन' के लिए उपयोग कर रहे हैं।
  • सेट ansible_userउपयोगकर्ता क्या आप उन सर्वर पर ठीक से सेट किया है, जब पहली बार चलाने के बाद उपयोग करना चाहते हैं के उपयोगकर्ता नाम के लिए।
  • ansible_user_first_runउदाहरण के लिए, प्लेबुक के 'पहले रन' के लिए आप जिस उपयोगकर्ता का उपयोग करने जा रहे हैं, उसका एक चर सेट करें root
  • सही SSH कुंजी के साथ सर्वर से कनेक्ट करने के लिए, का उपयोग कर ignore_errorsऔर करने के लिए एक स्थानीय कमांड का उपयोग करेंchanged_when: False
  • यदि वह विफल रहता है, ansible_userतो के मूल्य पर अद्यतन करेंansible_user_first_run

यहाँ कोड है:

---
- 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

नोट: यह सेटिंग के लायक है transport = sshक्योंकि paramiko अप्रत्याशित रूप से सर्वर में कुछ कॉन्फ़िगरेशन में प्रवेश करने में विफल हो सकता है (जैसे कि जब सर्वर को पासवर्ड स्वीकार नहीं करने के लिए सेट किया जाता है, और आप पहले एक कुंजी के साथ प्रयास कर रहे हैं फिर एक पासवर्ड ... अजीब!) इसके अलावा ssh परिवहन तेज है, इसलिए यह वैसे भी इसके लायक है।

आगे नोट: यदि आप इस पद्धति का उपयोग कर रहे हैं, तो आपको gather_facts: falseअपनी प्लेबुक परिभाषा फ़ाइल में निर्दिष्ट करने की आवश्यकता है ताकि परीक्षण पासवर्ड प्राप्त करने से पहले सेटअप / तथ्य एकत्रित करने का कार्य स्वचालित रूप से न चले। यदि आपको किसी भी वास्तविक तथ्य की आवश्यकता है, तो आपको setupसामान्य रूप से ऐसी जगहों पर उपलब्ध किसी भी डेटा को एक्सेस करने से पहले अपनी भूमिका में स्पष्ट रूप से कॉल करना होगा ansible_devices, आदि। ऐसा करने का एक अच्छा तरीका यह है कि देखने के लिए चेक के setupसाथ कॉल करें। whenइससे पहले कि आप अपनी भूमिका में हैं, तथ्य यह है कि खाली है या नहीं।


आपका समाधान अच्छा है, लेकिन आपको gather_facts: noप्लेबुक लॉन्च करते समय कनेक्ट करने की कोशिश कर रहे ansible को रोकने के लिए जोड़ना होगा :)
k4cy

तुम सही हो। मेरे पास मेरी सभी प्लेबुक के लिए इकट्ठा करने के लिए सेट_फैक्ट है ताकि मुझे स्पष्ट रूप से 'सेटअप' कॉल करना पड़े। मैं जवाब में यह उल्लेख करना भूल गया, मैं इसे अब अपडेट करूंगा।
टॉम बुल

5

--ask-passAnsible-playbook चलाते समय आप इसका उपयोग कर सकते हैं ।

आपके द्वारा पूछे गए अन्य कार्यों के लिए, यह विभिन्न माध्यमों से प्राप्त होता है, उदाहरण के लिए, कॉपी मॉड्यूल।
रूट लॉगिन को अक्षम करना भी जैसे किया जा सकता है। sshd_confअस्थायी फ़ाइल या conf फ़ाइल में लाइन डालने के द्वारा ।


--स्क-पास (जो कि -k जैसा है) वही कर रहा हूं और मैंने इसके बारे में ऊपर टिप्पणी में लिखा है
petr0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.