(Terkait dengan Panggilan balik atau kaitan, dan serangkaian tugas yang dapat digunakan kembali, dalam peran yang dimungkinkan ):
Apakah ada cara yang lebih baik untuk menambahkan ke daftar atau menambahkan kunci ke kamus di Ansible dari (ab) menggunakan ekspresi template jina2?
Saya tahu Anda dapat melakukan sesuatu seperti:
- name: this is a hack
shell: echo "{% originalvar.append('x') %}New value of originalvar is {{originalvar}}"
tetapi apakah benar-benar tidak ada semacam tugas atau penolong untuk melakukan ini?
Rasanya rapuh, tampaknya tidak berdokumen, dan bergantung pada banyak asumsi tentang bagaimana variabel bekerja di Ansible.
Kasing penggunaan saya adalah beberapa peran (ekstensi server basis data) yang masing-masing harus menyediakan beberapa konfigurasi ke peran dasar (server basis data). Ini tidak sesederhana menambahkan baris ke file konfigurasi server db; setiap perubahan berlaku untuk baris yang sama , misalnya ekstensi bdr
dan pg_stat_statements
keduanya harus muncul pada baris target:
shared_preload_libaries = 'bdr, pg_stat_statements'
Apakah cara yang dimungkinkan untuk melakukan ini hanya memproses file konfigurasi beberapa kali (sekali per ekstensi) dengan regexp yang mengekstrak nilai saat ini, mem-parsingnya, dan kemudian menulis ulang? Jika demikian, bagaimana Anda membuat idempoten itu di beberapa berjalan?
Bagaimana jika konfigurasi lebih sulit dari ini untuk diurai dan tidak sesederhana menambahkan nilai lain yang dipisahkan koma? Pikirkan file konfigurasi XML.
Jawaban:
Anda dapat menggabungkan dua daftar dalam variabel dengan
+
. Katakanlah Anda memilikigroup_vars
file dengan konten ini:Dan itu digunakan dalam template
pgsql.conf.j2
seperti:Anda kemudian dapat menambahkan ekstensi ke server basis data pengujian seperti ini:
Ketika peran dijalankan di salah satu server pengujian, ekstensi tambahan akan ditambahkan.
Saya tidak yakin ini berfungsi untuk kamus juga, dan juga berhati-hati dengan spasi dan meninggalkan koma menggantung di akhir baris.
sumber
group_vars
, peran tidak dapat mengurus detail pengaturan ekstensi itu sendiri. Ini menambahkan vars dari peran yang sangat saya cari, sehingga satu peran dapat ditambahkan ke var yang diekspos oleh peran lain.with_items
kalimat.Sejak Ansible v2.x Anda dapat melakukan ini:
semua hal di atas didokumentasikan dalam: http://docs.ansible.com/ansible/playbooks_filters.html
sumber
u'(': u\"'\"}"
2.4.x
(TETAP)set_fact: my_dict_var: '{{my_dict_var|default({})|combine({item[0]: item[1]})}}'
. Kesalahan yang tidak ditentukan datang ketika beberapa penyaringan digunakan atau tidak ada hasil terdaftar.Anda perlu membagi lingkaran menjadi 2
dan addhost.yml
sumber
Tidak yakin ketika mereka menambahkan ini, tetapi setidaknya untuk kamus / hash (BUKAN daftar / array), Anda dapat mengatur variabel hash_behaviour , seperti:
hash_behaviour = merge
di Andaansible.cfg
.Butuh beberapa jam untuk saya secara tidak sengaja menemukan pengaturan ini: S
sumber
Hampir semua jawaban di sini membutuhkan perubahan dalam tugas, tetapi saya perlu secara dinamis menggabungkan kamus dalam definisi vars, bukan selama menjalankan.
Misalnya saya ingin mendefinisikan beberapa vars yang dibagikan
all
group_vars
dan kemudian saya ingin memperluasnya di beberapa var laingroup
atauhost_vars
. Sangat berguna saat bekerja untuk peran.Jika Anda mencoba menggunakan
combine
atauunion
memfilter menimpa variabel asli dalam file var, Anda akan berakhir dalam loop tak terbatas selama templating, jadi saya membuat solusi ini (bukan solusi).Anda dapat mendefinisikan beberapa variabel berdasarkan beberapa pola nama dan kemudian secara otomatis memuatnya dalam peran.
group_vars/all.yml
group_vars/group1.yml
cuplikan kode peran
do_some_stuff.yml
Ini hanya cuplikan, tetapi Anda harus mendapatkan gagasan tentang cara kerjanya. catatan: lookup ('varnames', '') tersedia sejak an 2.8
Saya kira itu juga mungkin untuk menggabungkan semua variabel
dictionary_of_bla.*
menjadi satu kamus selama runtime menggunakan pencarian yang sama.Keuntungan dari pendekatan ini adalah Anda tidak perlu mengatur daftar nama variabel yang tepat, tetapi hanya pola dan pengguna yang dapat mengaturnya secara dinamis.
sumber
Ansible
adalah sistem otomasi, dan, mengenai manajemen file konfigurasi, itu tidak jauh berbeda dariapt
. Alasan semakin banyak perangkat lunak menawarkan fitur untuk membaca cuplikan konfigurasi dariconf.d
direktori adalah untuk memungkinkan sistem otomasi tersebut membuat paket / peran yang berbeda menambah konfigurasi ke perangkat lunak. Saya percaya bahwa itu bukan filosofiAnsible
untuk melakukan apa yang ada dalam pikiran Anda, melainkan menggunakanconf.d
triknya. Jika perangkat lunak yang dikonfigurasikan tidak menawarkan fungsi ini, Anda mungkin mengalami masalah.Karena Anda menyebutkan file konfigurasi XML, saya mengambil kesempatan untuk melakukan rengekan. Ada alasan untuk tradisi Unix menggunakan file konfigurasi teks biasa. File-file konfigurasi biner tidak cocok dengan otomasi sistem, sehingga segala bentuk format biner akan memberi Anda masalah dan kemungkinan akan mengharuskan Anda membuat program untuk menangani konfigurasi. (Jika ada yang berpikir XML adalah format teks biasa, mereka harus memeriksa otak mereka.)
Sekarang, pada
PostgreSQL
masalah spesifik Anda .PostgreSQL
tidak mendukungconf.d
triknya. Pertama, saya akan memeriksa apakahshared_preload_libraries
dapat ditentukan beberapa kali. Saya tidak menemukan petunjuk dalam dokumentasi yang bisa, tetapi saya masih akan mencobanya. Jika itu tidak dapat ditentukan beberapa kali, saya akan menjelaskan masalah saya kepadaPostgreSQL
orang - orang kalau-kalau mereka punya ide; ini adalahPostgreSQL
masalah dan bukanAnsible
masalah. Jika tidak ada solusi dan saya benar-benar tidak dapat menggabungkan peran yang berbeda menjadi satu, saya akan menerapkan sistem untuk mengkompilasi konfigurasi pada host yang dikelola. Dalam hal ini, saya mungkin akan membuat script/usr/local/sbin/update_postgresql_config
yang akan mengkompilasi/etc/postgresql/postgresql.conf.jinja
menjadi/etc/postgresql/9.x/main/postgresql.conf
. Script akan membaca preload shared library dari/etc/postgresql/shared_preload_libraries.txt
, satu perpustakaan per baris, dan memberikannya ke jinja.Tidak jarang sistem otomasi melakukan hal ini. Contohnya adalah
exim4
paket Debian .sumber
conf.d
mekanisme include dan untungnya menggunakan file plaintext. Namun, ada beberapa opsi konfigurasi di mana banyak ekstensi mungkin memiliki pendapat tentang hal itu - misalnya "meningkatkan max_wal_senders sebesar 10 dari apa pun itu sebelumnya".