โดยส่วนตัวแล้วฉันพบวิธีแก้ปัญหาที่เป็นไปได้ 3 ข้อสำหรับปัญหานี้ซึ่งทำงานได้ดีในสถานการณ์ต่าง ๆ
ตัวเลือก 1 - ตั้งค่าansible_python_interpreter: /usr/bin/python3สำหรับโฮสต์ที่python3ติดตั้งโดยค่าเริ่มต้น
ฉันคิดว่านี่เป็นวิธีการที่เหนือกว่าสำหรับการแก้ปัญหาหากคุณมีวิธีจัดกลุ่มโฮสต์ของคุณด้วยการpython3ติดตั้งโดยค่าเริ่มต้นหรือไม่ เท่าที่ฉันทราบpython3มีให้ใน Ubuntu ทุกรุ่นที่ 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 ซึ่งต้องการการเพิ่มเติมสำหรับ playbook ทุกตัว
ตัวเลือก 2 - ติดตั้ง Python 2 โดยใช้ raw
ตัวเลือกนี้ต้องวางการเล่นที่ด้านบนสุดของ playbook ทุกอัน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ติดตั้ง (เช่นอะไรก็ตามที่ใช้ RHEL) มิฉะนั้นจะเกิดข้อผิดพลาดในการเล่นครั้งแรก
วิธีนี้ใช้ได้ผล แต่ต่ำที่สุดในรายการของฉันด้วยเหตุผลบางประการ:
- ต้องไปที่ด้านบนสุดของทุก playbook (ตรงข้ามกับตัวเลือก 1)
- ถือว่า
aptอยู่ในระบบและละเว้นข้อผิดพลาด (ตรงข้ามกับตัวเลือก 3)
apt-get คำสั่งช้า (ตรงข้ามกับตัวเลือก 3)
ตัวเลือก 3 - /usr/bin/python -> /usr/bin/python3ใช้Symlinkraw
ฉันไม่ได้เห็นวิธีการแก้ปัญหาที่เสนอโดยคนอื่น ไม่เหมาะ แต่ฉันคิดว่ามันยอดเยี่ยมกว่าตัวเลือก 2 ในหลาย ๆ วิธี ข้อเสนอแนะของฉันคือการใช้rawเพื่อเรียกใช้คำสั่ง shell เพื่อ symlink /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 ซึ่งเราต้องวางไว้ที่ด้านบนสุดของ playbook ทุกเล่ม แต่ฉันคิดว่ามันเหนือกว่าในหลายวิธี:
- สร้าง symlink ในกรณีเฉพาะที่
python3มีอยู่เท่านั้นpythonไม่ใช่ - มันจะไม่แทนที่ Python 2 หากติดตั้งไว้แล้ว
- ไม่ได้
aptติดตั้งไว้
- สามารถทำงานกับโฮสต์ทั้งหมดโดยไม่มีการจัดการข้อผิดพลาดพิเศษใด ๆ
- เป็นซุปเปอร์เร็วเมื่อเทียบกับทุกสิ่งด้วย
apt-get
เห็นได้ชัดว่าถ้าคุณต้องการติดตั้ง Python 2 ที่/usr/bin/pythonวิธีนี้จะไม่มีทางและตัวเลือก 2 จะดีกว่า
ข้อสรุป
- ฉันขอแนะนำให้ใช้ตัวเลือก 1ในทุกกรณีถ้าทำได้
- ฉันขอแนะนำให้ใช้ตัวเลือก 3หากพื้นที่โฆษณาของคุณมีขนาดใหญ่ / ซับซ้อนและคุณไม่มีวิธีจัดกลุ่มโฮสต์ได้อย่างง่ายดาย
python3ทำให้ตัวเลือกที่ 1ยากขึ้นและเกิดข้อผิดพลาดได้ง่ายขึ้น
- ฉันเพียง แต่แนะนำทางเลือกที่ 2มากกว่า3 ตัวเลือกหากคุณต้องการหลาม 2
/usr/bin/pythonติดตั้งที่
แหล่งที่มา