Saat membuat peran Ansible baru, templat membuat direktori vars
a dan defaults
direktori dengan main.yml
file kosong . Ketika mendefinisikan peran saya, saya dapat menempatkan definisi variabel dalam salah satu dari ini, dan mereka akan tersedia dalam tugas saya.
Apa perbedaan antara memasukkan definisi ke dalam defaults
dan vars
? Apa yang harus masuk defaults
, dan apa yang harus masuk vars
? Apakah masuk akal untuk menggunakan keduanya untuk data yang sama?
Saya tahu ada perbedaan dalam hal prioritas / prioritas di antara keduanya, tetapi saya ingin memahami apa yang harus dilakukan.
Katakanlah peran saya akan membuat daftar direktori pada sistem target. Saya ingin memberikan daftar direktori default yang akan dibuat, tetapi ingin memungkinkan pengguna untuk menimpanya ketika menggunakan peran.
Ini akan terlihat seperti apa:
---
- directories:
- foo
- bar
- baz
Saya bisa menempatkan ini ke dalam defaults/main.yml
atau di dalam vars/main.yml
, dari perspektif eksekusi, itu tidak akan membuat perbedaan - tetapi ke mana harus pergi?
defaults
dan apa yangvars
lebih dalam .Variabel peran yang didefinisikan
var
memiliki prioritas yang sangat tinggi - mereka hanya dapat ditimpa dengan melewati mereka pada baris perintah, dalam tugas tertentu atau dalam sebuah blok. Oleh karena itu, hampir semua variabel Anda harus didefinisikan dalamdefaults
.Dalam artikel " Variable Precedence - Where To Put Your Role Vars ", penulis memberikan satu contoh tentang apa yang harus dimasukkan
vars
: konstanta khusus sistem yang tidak banyak berubah. Jadi Anda dapat memilikivars/debian.yml
danvars/centos.yml
dengan nama variabel yang sama tetapi nilai yang berbeda dan memasukkannya secara kondisional.sumber
IMHO itu tidak praktis dan tidak masuk akal bahwa tempat-tempat Ansible seperti prioritas tinggi pada konfigurasi di vars dari peran . Konfigurasi dalam
vars/main.yml
dandefaults/main.yml
harus rendah dan mungkin prioritas yang sama.Adakah contoh nyata dari kasus di mana kita menginginkan jenis perilaku ini?
Ada contoh yang kita tidak mau ini.
Maksudnya di sini adalah konfigurasi di
defaults/main.yml
tidak bisa dinamis. Konfigurasi dalamvars/main.yml
kaleng. Jadi misalnya Anda dapat memasukkan konfigurasi untuk OS dan versi tertentu secara dinamis seperti yang ditunjukkan pada geerlingguy.postgresqlTetapi karena presedensi begitu aneh dan tidak praktis dalam geerlingguy mungkin perlu memperkenalkan variabel pseudo seperti yang dapat dilihat pada variabel.yml
Ini adalah contoh nyata kehidupan nyata yang menunjukkan bahwa prioritasnya tidak praktis.
Hal lain yang ingin dibuat di sini adalah bahwa kita ingin peran dapat dikonfigurasi. Peran dapat bersifat eksternal, dikelola oleh orang lain. Sebagai aturan umum Anda tidak ingin konfigurasi dalam peran memiliki prioritas tinggi.
sumber
Pada dasarnya, apa pun yang masuk ke "peran default" (folder default di dalam peran) adalah yang paling mudah ditempa dan diganti dengan mudah. Apa pun di direktori vars dari peran menimpa versi sebelumnya dari variabel tersebut di namespace. Gagasan yang harus diikuti di sini adalah bahwa semakin eksplisit Anda dalam ruang lingkup, semakin diutamakan dengan baris perintah - vars ekstra selalu menang. Host dan / atau variabel inventaris dapat memenangkan peran default, tetapi tidak termasuk eksplisit seperti direktori vars atau tugas include_vars. dokter
sumber
Variabel dan default berjalan beriringan. ini sebuah contoh
di file default Anda, Anda akan memiliki sesuatu seperti:
Apa yang mungkin dilakukan adalah, itu akan mengambil nilai
package_version
dan meletakkannya di sebelah nama paket sehingga akan membaca di suatu tempat sebagai:Dengan cara ini ia akan menginstal
xyz123
dan bukanxyz123.4
atau apa pun yang ada di repositori xyz.Pada akhirnya itu akan dilakukan
yum install -y xyz123
Jadi pada dasarnya default adalah nilai yang ada, jika Anda tidak menetapkan nilai spesifik untuk variabel, menyebabkan ruang itu tidak bisa tetap kosong.
sumber
defaults
digunakan ketika tidak ada yangvars
didefinisikan, tetapi jawabannya tidak menjelaskan, mengapa Anda akan mendefinisikan nilai sebagai satu atau yang lain, yang merupakan apa yang diminta OP. Bandingkan dengan penjelasan di bawah ini.