Saya pribadi menemukan 3 solusi yang mungkin untuk masalah ini yang bekerja dengan baik dalam situasi yang berbeda:
Opsi 1 - Tetapkan ansible_python_interpreter: /usr/bin/python3untuk host yang telah python3menginstal secara default
Saya pikir ini adalah metode yang unggul untuk memecahkan masalah jika Anda memiliki cara untuk mengelompokkan host Anda dengan apakah mereka telah python3menginstal secara default atau tidak . Sejauh yang saya ketahui, python3tersedia di semua rilis Ubuntu 16.04 dan lebih tinggi.
- Jika semua host pasti memilikinya
python3, Anda dapat menambahkan variabel ke group_vars/all.yml(atau yang setara) Anda:
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- Jika beberapa host Anda tidak memiliki
python3dan Anda memiliki cara untuk memberi tag mereka ketika menggunakan inventaris dinamis (mis. Untuk penandaan AWS ec2.py), Anda dapat menerapkan variabel ke host tertentu seperti ini:
# group_vars/tag_OS_ubuntu1804.yml
ansible_python_interpreter: /usr/bin/python3
- Jika Anda menggunakan inventaris statis dan dapat mengelompokkan host berdasarkan apakah ada
python3, Anda dapat melakukan sesuatu seperti ini:
# inventory/hosts
[python2_hosts]
centos7_server
[python3_hosts]
u1804_server
[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
Saya paling suka opsi ini karena tidak memerlukan perubahan pada host jarak jauh dan hanya perubahan kecil pada variabel, yang bertentangan dengan opsi 2 dan 3, yang membutuhkan penambahan untuk setiap buku pedoman.
Opsi 2 - Instal Python 2 menggunakan raw
Opsi ini mengharuskan Anda meletakkan permainan di bagian atas setiap buku pedoman gather_facts: falseyang digunakan rawuntuk memasang 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: truediperlukan jika Anda berencana untuk menjalankan permainan pada host yang belum apt-getmenginstal (misalnya apa pun berbasis RHEL), jika tidak mereka akan kesalahan dalam bermain pertama.
Solusi ini berfungsi, tetapi merupakan yang terendah dalam daftar saya karena beberapa alasan:
- Harus ada di bagian atas setiap buku pedoman (sebagai lawan dari opsi 1)
- Diasumsikan
aptada pada sistem dan mengabaikan kesalahan (tidak seperti opsi 3)
apt-get perintah lambat (tidak seperti opsi 3)
Opsi 3 - /usr/bin/python -> /usr/bin/python3Menggunakan tautanraw
Saya belum melihat solusi yang diusulkan oleh orang lain. Ini tidak ideal, tapi saya pikir itu lebih unggul dari opsi 2 dalam banyak hal. Saran saya adalah menggunakan rawmenjalankan perintah shell untuk symlink /usr/bin/python -> /usr/bin/python3jika python3ada pada sistem dan python tidak:
- 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
Solusi ini mirip dengan opsi 2 di mana kita perlu meletakkannya di bagian atas setiap buku pedoman, tapi saya pikir itu unggul dalam beberapa cara:
- Hanya membuat symlink dalam kasus khusus yang
python3ada dan pythontidak ada - itu tidak akan menimpa Python 2 jika sudah diinstal
- Tidak berasumsi
aptdiinstal
- Dapat berjalan melawan semua host tanpa penanganan kesalahan khusus
- Sangat cepat dibandingkan dengan apa pun dengan
apt-get
Tentunya jika Anda perlu menginstal Python 2 di /usr/bin/python, solusi ini adalah no go dan opsi 2 lebih baik.
Kesimpulan
- Saya sarankan menggunakan opsi 1 dalam semua kasus jika Anda bisa.
- Saya sarankan menggunakan opsi 3 jika inventaris Anda benar-benar besar / kompleks dan Anda tidak memiliki cara untuk dengan mudah mengelompokkan host
python3, membuat opsi 1 jauh lebih sulit dan rawan kesalahan.
- Saya hanya menyarankan opsi 2 di atas opsi 3 jika Anda perlu menginstal Python 2 di
/usr/bin/python.
Sumber