मुझे व्यक्तिगत रूप से इस समस्या के 3 संभावित समाधान मिले हैं जो विभिन्न परिस्थितियों में अच्छी तरह से काम करते हैं:
विकल्प 1 - ansible_python_interpreter: /usr/bin/python3उन मेजबानों के लिए सेट करें जो python3डिफ़ॉल्ट रूप से इंस्टॉल किए गए हैं
मुझे लगता है कि समस्या को हल करने के लिए यह एक बेहतर तरीका है यदि आपके पास अपने होस्ट python3को डिफ़ॉल्ट रूप से स्थापित करने या न करने का तरीका है । जहां तक मुझे जानकारी है, python3सभी उबंटू रिलीज 16.04 और उच्चतर पर उपलब्ध है।
- यदि आपके सभी मेजबान निश्चित रूप से हैं
python3, तो आप चर को अपने group_vars/all.yml(या समतुल्य) में जोड़ सकते हैं :
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- यदि आपके कुछ मेजबानों के पास नहीं है
python3और आपके पास डायनामिक इन्वेंट्री का उपयोग करते समय उन्हें टैग करने का एक तरीका है (जैसे AWS टैगिंग के लिए ec2.py), तो आप इस तरह से कुछ मेजबानों के लिए चर को लागू कर सकते हैं:
# group_vars/tag_OS_ubuntu1804.yml
ansible_python_interpreter: /usr/bin/python3
- यदि आप स्टैटिक इन्वेंट्री का उपयोग करते हैं और मेजबान को इस बात पर आधारित
python3कर सकते हैं कि क्या उनके पास है , तो आप कुछ इस तरह से कर सकते हैं:
# inventory/hosts
[python2_hosts]
centos7_server
[python3_hosts]
u1804_server
[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
मुझे यह विकल्प सबसे अधिक पसंद है क्योंकि इसके लिए रिमोट होस्ट पर कोई बदलाव नहीं करना पड़ता है और केवल चर में मामूली बदलाव होते हैं, विकल्प 2 और 3 के विपरीत, जिसके लिए हर प्लेबुक में परिवर्धन की आवश्यकता होती है।
विकल्प 2 - उपयोग करके पायथन 2 स्थापित करें raw
इस विकल्प को स्थापित करने के लिए gather_facts: falseउपयोग rawकरने वाले प्रत्येक प्लेबुक के शीर्ष पर एक नाटक डालने की आवश्यकता है python:
- name: install python2 on all instances
hosts: "*"
gather_facts: false
tasks:
- name: run apt-get update and install python
raw: "{{ item }}"
loop:
- sudo apt-get update
- sudo apt-get -y install python
become: true
ignore_errors: true
ignore_errors: trueयदि आपको मेजबानों पर नाटक चलाने की योजना है जो apt-getस्थापित नहीं है (उदाहरण के लिए आरएचईएल-आधारित कुछ भी), अन्यथा वे पहले नाटक में त्रुटि करेंगे।
यह समाधान काम करता है, लेकिन कुछ कारणों से मेरी सूची में सबसे कम है:
- हर प्लेबुक के शीर्ष पर जाने की जरूरत है (विकल्प 1 के विपरीत)
aptसिस्टम पर मान लिया गया है और त्रुटियों को अनदेखा करता है (विकल्प 3 के विपरीत)
apt-get कमांड धीमी हैं (विकल्प 3 के विपरीत)
विकल्प 3 - साइमलिंक /usr/bin/python -> /usr/bin/python3का उपयोग करनाraw
मैंने किसी अन्य द्वारा प्रस्तावित इस समाधान को नहीं देखा है। यह आदर्श नहीं है, लेकिन मुझे लगता है कि विकल्प 2 से कई मायनों में बेहतर है। मेरा सुझाव सिस्टम पर है और नहीं है तो rawसिम्कलिन के लिए एक शेल कमांड चलाने के लिए उपयोग करना है:/usr/bin/python -> /usr/bin/python3python3 python
- name: symlink /usr/bin/python -> /usr/bin/python3
hosts: "*"
gather_facts: false
tasks:
- name: symlink /usr/bin/python -> /usr/bin/python3
raw: |
if [ -f /usr/bin/python3 ] && [ ! -f /usr/bin/python ]; then
ln --symbolic /usr/bin/python3 /usr/bin/python;
fi
become: true
यह समाधान विकल्प 2 के समान है जिसमें हमें इसे हर प्लेबुक में सबसे ऊपर रखना होगा, लेकिन मुझे लगता है कि यह कुछ ही मामलों में बेहतर है:
- केवल उस विशिष्ट मामले में सिम्लिंक बनाता है जो
python3मौजूद है और pythonनहीं है - यह पायथन 2 को ओवरराइड नहीं करेगा यदि यह पहले से ही स्थापित है
aptस्थापित नहीं है
- किसी भी विशेष त्रुटि से निपटने के बिना सभी मेजबानों के खिलाफ चला सकते हैं
- सुपर फास्ट के साथ कुछ भी की तुलना में है
apt-get
जाहिर है अगर आपको पायथन 2 की आवश्यकता है/usr/bin/python , तो यह समाधान एक नहीं है और विकल्प 2 बेहतर है।
निष्कर्ष
- यदि आप कर सकते हैं तो मैं सभी मामलों में विकल्प 1 का उपयोग करने का सुझाव देता हूं ।
- मैं विकल्प 3 का उपयोग करने का सुझाव देता हूं यदि आपकी इन्वेंट्री वास्तव में बड़ी / जटिल है और आपके पास आसानी से होस्ट करने के लिए कोई रास्ता नहीं है
python3, तो विकल्प 1 को और अधिक कठिन और त्रुटि-प्रवण बना देगा।
- मैं केवल सुझाव है कि विकल्प 2 से अधिक विकल्प 3 अगर आप अजगर 2 पर स्थापित की जरूरत है
/usr/bin/python।
सूत्रों का कहना है