Saya bekerja dengan banyak proyek, jadi solusi cjc tidak akan bekerja untuk saya. Ada juga masalah konfigurasi umum vs kustom (alamat dll umum untuk perusahaan, ada juga sedikit keajaiban di konfigurasi). Skema yang akhirnya saya setujui adalah sedikit peretasan, tetapi sangat mudah digunakan.
Alih-alih global ~/.chef
, saya menggunakan subdirektori '.chef' di dalam chef-repo, yang tidak disimpan di git (ditambahkan ke .gitignore
). Saya juga file config/knife.rb
file yang diperiksa ke Git dan berisi konfigurasi bersama. Dimulai dengan cuplikan ini:
root_dir = File.join(File.dirname(__FILE__), '..')
%w(knife-secrets.rb knife-local.rb).each do |conf_name|
conf = File.join(root_dir, ".chef", conf_name)
Kernel::load(conf) if File.exists? conf
end
Ini memuat file yang .chef/knife-local.rb
berisi konfigurasi khusus (dalam versi dasar hanya OPSCODE_USER='username'
konstan yang digunakan nanti, tetapi dapat berisi konfigurasi pisau apa pun), dan .chef/knife-secrets.rb
yang berisi rahasia bersama (kunci AWS dll).
Di bawah itu, ada konfigurasi pisau biasa yang menggunakan konstanta yang didefinisikan dalam file-file ini, misalnya:
client_key "#{root_dir}/.chef/#{OPSCODE_USER}.pem"
Dengan cara ini, saya mencapai standarisasi konfigurasi pisau di seluruh perusahaan, yang pada gilirannya berarti bahwa setiap potongan kode atau doa pisau bersama dalam wiki akan bekerja untuk semua orang. Ada cukup banyak kebingungan dan keajaiban pada pisau itu sendiri - konfigurasi yang berbeda hanya akan memperburuknya. Juga, semua orang mendapat manfaat dari cuplikan sihir kecil, seperti ini untuk knife ssh
menggunakan login yang dikonfigurasikan di pengguna~/.ssh/config
Ada juga masalah rahasia bersama: kunci validasi server chef, kunci AWS disimpan knife-secrets.rb
, kunci pribadi SSH EC2, kunci tas data terenkripsi, dan sebagainya. Kami jelas tidak ingin mereka disimpan dalam repositori - atau, sebenarnya, di mana pun mereka tidak dienkripsi dengan aman. Jadi kami mendistribusikan file-file itu sebagai .tar.gz
file, yang dienkripsi GPG untuk semua orang di perusahaan, dan dibagikan melalui Dropbox.
Mengkonfigurasi semua ini semakin rumit, dan saya ingin orang-orang di tim untuk benar-benar menggunakan hal itu, jadi ada elemen terakhir: rake init
tugas yang membuat .chef
direktori, symlink di config/knife.rb
sana, mendekripsi dan mengurai chef-secrets.tgz
file, memastikan kunci Platform Opscode pribadi pengguna ada di sana dan .chef/knife-local.rb
benar. dikonfigurasi, symlink plugins knife, dan set perizinan yang tepat pada direktori dan file di dalamnya. Tugas ini diatur sehingga aman untuk menjalankannya berkali-kali pada repositori yang sudah diinisialisasi (misalnya untuk memperbarui rahasia atau plugins pisau).
Ada juga tugas pembantu yang mengemas ulang semua rahasia, mengenkripsi tarball ke semua orang, dan menyalinnya ke dropbox, untuk membuatnya lebih mudah untuk menambah karyawan baru atau mengubah rahasia.
Mengenai beberapa lingkungan: Chef memiliki fitur yang disebut lingkungan . Saya belum menggunakannya, tetapi harus melakukan apa yang Anda butuhkan. Anda juga dapat secara ketat memisahkan lingkungan produksi (untuk menghindari pengembang memiliki kunci apa pun yang berkaitan dengan cara apa pun untuk produksi env) dengan memiliki dua organisasi Hosted Chef atau server Chef yang terpisah. Cuplikan knife.rb ini menunjukkan cara mengkonfigurasi pisau dengan cara berbeda berdasarkan cabang yang saat ini diperiksa - Anda dapat menggunakan ini untuk mengatur lingkungan serta url server chef. Ada juga plugin pisau yang disebut knife-flow , yang menyediakan alur kerja dua organisasi yang lebih lengkap.
.chef
folder untuk menggunakan variabel lingkungan atau sesuatu?