โดยส่วนตัวแล้วฉันพบวิธีแก้ปัญหาที่เป็นไปได้ 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
ติดตั้งที่
แหล่งที่มา