मुझे व्यक्तिगत रूप से इस समस्या के 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/python3
python3
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
।
सूत्रों का कहना है