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/python3
untuk host yang telah python3
menginstal secara default
Saya pikir ini adalah metode yang unggul untuk memecahkan masalah jika Anda memiliki cara untuk mengelompokkan host Anda dengan apakah mereka telah python3
menginstal secara default atau tidak . Sejauh yang saya ketahui, python3
tersedia 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
python3
dan 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: false
yang digunakan raw
untuk 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: true
diperlukan jika Anda berencana untuk menjalankan permainan pada host yang belum apt-get
menginstal (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
apt
ada pada sistem dan mengabaikan kesalahan (tidak seperti opsi 3)
apt-get
perintah lambat (tidak seperti opsi 3)
Opsi 3 - /usr/bin/python -> /usr/bin/python3
Menggunakan 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 raw
menjalankan perintah shell untuk symlink /usr/bin/python -> /usr/bin/python3
jika python3
ada 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
python3
ada dan python
tidak ada - itu tidak akan menimpa Python 2 jika sudah diinstal
- Tidak berasumsi
apt
diinstal
- 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