Ansible berjalan di Python, dan dengan Ansible Tower, Python juga merupakan mesin di bawah tenda. Ketika bekerja dengan pelanggan saya, saya telah melihat beberapa pertanyaan praktis yang tampaknya relatif umum. Artikel ini memberikan beberapa tips untuk menyiapkan dan memecahkan masalah virtualenvs dalam skenario Ansible Tower.
1. Apa itu virtualenv?
Python virtualenv pada dasarnya adalah direktori yang dibuat dengan virtualenv
perintah (yang, seperti yang bisa Anda tebak, adalah skrip Python).
Setelah virtualenv ini "diaktifkan", Anda dapat menambahkan modul Python tertentu di sana dan memiliki lingkungan yang terisolasi untuk bereksperimen dan mengembangkan tanpa memengaruhi skrip dan playbook Python/Ansible utama Anda.
Ansible Tower memiliki dua virtualenvs di bawah direktori default:awx
dan ansible
.
Yang pertama adalah: /var/lib/awx/venv/awx.
awx
virtualenv adalah untuk penggunaan eksklusif dari Ansible Tower itu sendiri dan tidak boleh diubah .
Virtualenv lainnya adalah: /var/lib/awx/venv/ansible
. Virtualenv inilah yang digunakan Tower untuk menjalankan template (playbook).
Seseorang dapat bertanya:Jika saya perlu menambahkan modul Python yang diperlukan oleh buku pedoman Menara Ansible saya, haruskah saya menambahkannya di bawah ansible
default virtualenv?
Anda bisa.
Tapi mungkin ide yang lebih baik untuk membuat lain virtualenv jika:
- Anda ingin mempertahankan virtualenv default sebagai lingkungan pengembangan yang stabil dan ingin bereksperimen dengan modul baru di virtualenv lain.
- Anda memiliki grup pengembang berbeda yang bekerja dengan berbagai proyek yang memerlukan modul Python/Ansible tertentu.
2. Kiat untuk menyiapkan virtualenv
Ada penjelasan dan contoh yang sangat baik di Menara Ansible dan dokumentasi Python tentang cara menyiapkan virtualenv.
Saya biasanya mengikuti dokumentasi Ansible Tower ketika saya membuat virtualenv baru, tetapi ada beberapa topik yang cenderung saya abaikan (yang kemudian berakhir dengan saya menggaruk-garuk kepala bertanya, "Hmm... mengapa ini tidak bertindak seperti yang saya harapkan ?").
Izin pada modul Python
Pastikan untuk mematuhi rekomendasi untuk mengatur umask 0022
, tidak hanya saat Anda membuat virtualenv Anda, tetapi juga ketika Anda menambahkan Modul Python untuk itu.
Alasannya adalah karena Ansible Tower berjalan sebagai pengguna awx , jadi pengguna ini harus dapat membaca modul Python di virtualenv.
Jika izin tidak disetel dengan benar, template/playbook Anda mungkin memberikan kesalahan seperti modul XYZ tidak terpasang atau modul XYZ tidak memiliki atribut ABC padahal masalahnya sebenarnya masalah izin sederhana.
[ Pembaca juga menikmati: Cara membuat Playbook yang Mungkin ]
Instal Ansible di virtualenv Anda
Playbook yang ingin Anda jalankan menggunakan virtualenv akan membutuhkan modul Python spesifik Anda yang diinstal di virtualenv Anda. Masuk akal jika mesin Ansible juga berjalan dari virtualenv itu.
Anda dapat menggunakan perintah berikut untuk menginstal versi Ansible tertentu:
sudo /opt/my-envs/xyz/bin/pip install ansible==2.9.15
Catatan :Jika Anda tidak menentukan versinya, pip
menginstal versi terbaru. Ada perubahan perilaku antara Ansible 2.9 dan Ansible 2.10, jadi disarankan untuk memeriksa dokumen ini sebelum mengizinkan pemasangan 2.10 atau versi yang lebih baru.
Gunakan Pip untuk membuat daftar modul Python
Katakanlah Anda ingin membuat replika virtualenv Anda di lingkungan lain, atau Anda memiliki beberapa node Ansible Tower dan perlu mereplikasi virtualenv di semua node. Untuk menangkap daftar modul untuk perbandingan atau dokumentasi, Anda dapat menggunakan:
pip list > pip_list.txt
head -5 /tmp/pip_list.txt
Package Version
------------- ---------
ansible 2.9.15
certifi 2020.12.5
cffi 1.14.4
Anda juga dapat membuat daftar dalam format yang memungkinkan penginstalan versi modul yang sama di tempat lain:
pip freeze > /tmp/pip_freeze.txt
head -3 /tmp/pip_freeze.txt
ansible==2.9.15
certifi==2020.12.5
cffi==1.14.4
Anda kemudian dapat menggunakan file beku ini untuk menginstal modul yang sama dengan versi yang sama persis menggunakan:
sudo /opt/my-envs/xyz/bin/pip install -r pip_freeze.txt
3. Jadikan virtualenv tersedia di proyek/templat Tower
Secara default, Ansible Tower hanya tahu tentang virtualenv-nya sendiri.
Untuk membuat Tower mengetahui virtualenvs tambahan, Anda memiliki dua opsi:
- Gunakan panggilan REST API seperti yang dijelaskan dalam dokumentasi Ansible Tower
- Gunakan antarmuka web dan navigasikan ke PENGATURAN -> SISTEM :
Setelah melakukan salah satu dari dua langkah ini, Anda akan dapat memilih virtualenvs baru ketika Anda bekerja dengan Organisasi, Proyek, dan Template di Tower:
Catatan :Pastikan direktori virtualenv dapat dibaca oleh pengguna awx . Jika tidak, Tower tidak akan mencantumkan virtualenv.
"Hal terpenting yang harus diperhatikan adalah virtualenv mana yang aktif dan biner mana yang digunakan buku pedoman Anda."
4. Mencadangkan dan memulihkan virtualenv
Jika Anda mengambil cadangan Tower penuh (menggunakan setup.sh -b
script), virtualenvs akan secara otomatis dicadangkan di sana, dan Anda akan dapat memulihkannya dengan setup.sh -r
). Tentu saja, memulihkan dengan cara ini berarti yang lainnya juga akan dipulihkan.
Jika Anda perlu mencadangkan/memulihkan virtualenv, Anda selalu dapat menggunakan alat seperti tar
untuk melakukan itu.
Juga, jika Anda menyimpan output dari pip freeze
perintah, Anda dapat membuat ulang struktur direktori dan menggunakan pip install
perintah dengan -r
argumen seperti yang ditunjukkan di atas.
Pastikan bahwa struktur direktori yang dipulihkan dapat dibaca oleh awx pengguna sehingga Tower dapat mengenali virtualenv dan mencantumkannya di bawah ANSIBLE ENVIRONMENT bidang di Organisasi, Proyek, dan Template.
Catatan :Dalam skenario dengan Ansible Tower berjalan di OpenShift, hal-hal berbeda ketika berhadapan dengan virtualenvs. Itu adalah topik untuk artikel lain.
5. Versi pemecahan masalah
Versi Python mana yang Anda gunakan?
Salah satu sumber potensi masalah terkait dengan versi persis Python dan Pip yang digunakan, atau versi yang dilihat oleh alat .
Terkadang Anda perlu menggunakan baris perintah untuk menginstal/memverifikasi modul Python, jadi selalu baik untuk memeriksa versi Python yang Anda gunakan.
Misalnya, setelah mengaktifkan virtualenv, periksa versinya:
source /opt/my-envs/xyz/bin/activate
(xyz) [admin@control my-envs]$ which python
/opt/my-envs/xyz/bin/python
(xyz) [admin@control my-envs]$ which python3
/opt/my-envs/xyz/bin/python3
(xyz) [admin@control my-envs]$ python -V
Python 3.6.8
(xyz) [admin@control my-envs]$ which pip
/opt/my-envs/xyz/bin/pip
(xyz) [admin@control my-envs]$ pip3 -V
pip 20.2.4 from /opt/my-envs/xyz/lib/python3.6/site-packages/pip (python 3.6)
Seperti yang Anda lihat pada contoh di atas, setelah aktivasi, semua perintah mengarah ke jalur di virtualenv saya, yang seharusnya Anda lihat, kecuali Anda memiliki versi lain di jalur Anda, dan itu dapat menimbulkan beberapa masalah.
Ini sangat penting jika Anda melakukannya memiliki versi Python lain di server Anda. Terkadang Anda mungkin ingin menjalankan pip
perintah sebagai pengguna root, dan apa yang dilihat root sebagai Python default mungkin tidak seperti yang dilihat oleh akun non-root Anda. Ini akan menyebabkan modul dipasang di lingkungan Python yang salah, dan template yang Anda jalankan dari Tower tidak akan menemukan modul tersebut.
Alih-alih menjalankan sudo pip install module-name
, gunakan jalur lengkap untuk pip
untuk menghindari masalah ini. Menggunakan skenario saya sebelumnya sebagai contoh, yaitu:
sudo /opt/my-envs/xyz/bin/pip install module-name
Versi Ansible mana yang Anda gunakan?
Jika Anda masih melihat kesalahan seperti Tidak ada modul bernama XYZ , periksa versi Ansible mana yang Anda jalankan dari output template:
Apakah itu cocok dengan versi/lokasi yang Anda miliki di virtualenv Anda?
Anda tidak perlu menginstal Ansible di virtualenv Anda, tetapi perlu diingat bahwa jika playbook Ansible dijalankan oleh instance Ansible yang berbeda, modul Python mungkin tidak terpasang di virtualenv Anda.
[ Panduan gratis dari Red Hat:5 langkah untuk mengotomatisasi bisnis Anda. ]
Menutup
Virtualenvs adalah cara yang bagus untuk membuat skenario terisolasi di mana Anda dapat bereksperimen dengan modul Python/Ansible yang berbeda tanpa mengganggu modul lain yang diinstal. Virtualenvs mudah dibuat ulang dari awal. Hal terpenting yang harus diperhatikan adalah virtualenv mana yang aktif dan biner mana yang digunakan playbook Anda.