Bagaimana cara menentukan dan secara berulang-ulang menetapkan nomor port yang meningkat di Ansible?

12

Saya baru mengenal Ansible, tetapi saya harus memelihara satu set buku pedoman, yang berhubungan dengan layanan yang akan disiapkan di lingkungan tertentu. Mereka perlu diberi port, sertifikat, dll. Ini menghasilkan banyak file dengan daftar nama dan tugas yang pada dasarnya selalu sama.

Dalam banyak kasus saya pikir saya dapat dengan mudah menggunakan kembali service_name sebagai variabel, tetapi ketika memetakan ke IP, port atau pengidentifikasi numerik lainnya, saya belum menemukan cara untuk secara deterministik menetapkan angka yang berbeda dengan cara yang dapat direproduksi, dan lebih disukai tetap menjadi sama bahkan ketika layanan baru ditambahkan. Saya telah mempertimbangkan menggunakan database SQLite untuk menyimpan layanan dari dan untuk menghasilkan nilai dari id mereka, tetapi saya tidak tahu bagaimana mengintegrasikannya dengan Ansible.

Saya berasumsi bahwa menetapkan peningkatan nomor port bukanlah sesuatu yang sama sekali baru; itu adalah sesuatu yang banyak sysadmin untuk dilakukan sehari-hari sehingga harus ada beberapa cara untuk melakukan itu.

Sunting : Kami langsung menambahkan nomor port dll group_vars/all.ymlseperti ini:

ports:
    service1:1024
    service2:1025
    service3:1026

Inventaris dihasilkan secara otomatis, karena kami membuat penjara tambahan (BSD) dan tergantung pada peran yang akan dieksekusi.

midor
sumber
2
Karena Anda mungkin harus menambahkan layanan ke inventaris, apa yang menghentikan Anda untuk menambahkan nomor port tertentu di sana secara manual? Atau jika inventaris Anda dihasilkan secara otomatis, maka Anda mungkin harus menyelesaikan masalah di tingkat pembuatan inventaris
SztupY
Tolong sertakan beberapa cuplikan Ansible? Tidak jelas apakah Anda menggunakan group_varsatau menambahkan variabel langsung ke file inventaris. Tidak jelas juga bagaimana inventaris Anda dihasilkan.
Woodland Hunter
Sudahkah Anda mempertimbangkan untuk menggunakan alat penemuan layanan seperti Konsul HashiCorp?
Foghorn CTO

Jawaban:

5

Penafian: Saya tidak menggunakan Ansible.

Apa yang akan saya lakukan adalah menggunakan nomor acak "dapat diprediksi". Menurut Ansible doc Anda dapat menabur generator nomor acak:

Pada Ansible versi 2.3, dimungkinkan juga untuk menginisialisasi generator angka acak dari sebuah seed. Dengan cara ini, Anda dapat membuat angka acak-tapi-idempoten:

"{{59 | random (seed = inventory_hostname)}} * * * * root / script / from / cron"

Jadi dalam kasus Anda untuk nomor port (saya anggap tidak terprivat) saya akan pergi untuk variabel dengan sesuatu seperti:

port="{{ 32767 |random(start=1024,seed=service_name) }}"

Maks pada 32767 untuk menghindari bentrok dengan port yang diprakarsai klien (Lihat port Ephemeral untuk alasannya).

Tensibai
sumber
Itu adalah ide yang bagus, yang saya pertimbangkan, tetapi itu membuat bagian yang semakin meningkat menjadi mustahil. Memiliki layanan tertentu yang secara logis terkait dalam kisaran port tertentu mungkin sangat diinginkan.
midor