GNU/Linux >> Belajar Linux >  >> Linux

5 tips untuk mengonfigurasi virtualenvs dengan Ansible Tower

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:

  1. Anda ingin mempertahankan virtualenv default sebagai lingkungan pengembangan yang stabil dan ingin bereksperimen dengan modul baru di virtualenv lain.
  2. 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:

  1. Gunakan panggilan REST API seperti yang dijelaskan dalam dokumentasi Ansible Tower
  2. 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.


Linux
  1. 4 tips untuk mendapatkan kerabat yang lebih tua secara online dengan Linux

  2. Memahami YAML untuk Ansible

  3. 6 keterampilan pemecahan masalah untuk buku pedoman Ansible

  1. 3 tips untuk mencetak dengan Linux

  2. 8 tips untuk baris perintah Linux

  3. 7 Tips Berguna untuk Menghosting Sendiri Instance Hantu Dengan Docker

  1. 5 tips untuk GNU Debugger

  2. Tip dan trik menggunakan CUPS untuk mencetak dengan Linux

  3. Mengonfigurasi penyimpanan lokal di Linux dengan Stratis