यहाँ मैं क्या करता हूँ अगर 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इससे पहले कि आप अपनी भूमिका में हैं, तथ्य यह है कि खाली है या नहीं।