Kelola buku masak koki di lingkungan tim

13

Saya belajar koki dan mengalami masalah dalam mengatur semuanya agar bekerja dengan tim saya.

Sebagai permulaan, tampaknya Anda harus membuat folder chef-repo, tempat Anda akan menyimpan dan memodifikasi buku masak yang digunakan untuk mengelola node Anda.

Saya mengerjakan berbagai proyek, dan masing-masing dari mereka sudah di bawah kendali sumber git. Idealnya saya akan menyimpan satu folder chef-repo di masing-masing proyek saya dengan proyek buku resep itu, kan?

Namun, dalam folder chef-repo saya harus menambahkan folder konfigurasi (.chef) dengan konfigurasi pisau dan validasi kunci saya, dan ini khusus untuk saya. Apakah normal untuk hanya menambahkan folder .chef ke file gitignore?

Saya mengerti bahwa buku masak bisa diunggah ke server chef untuk kemudian digunakan. Bagaimana tim lain memisahkan pementasan dari lingkungan produksi tanpa menduplikasi banyak pekerjaan? Kami memiliki cabang utama yang merupakan cabang produksi kami, cabang dev yang merupakan cabang pementasan kami (menerima kurang dari 5% dari permintaan situs web) dan cabang fitur. Sebagian besar waktu, cabang dev ketika stabil digabung ke cabang master. Bagaimana kita dapat mengunggah buku masak secara terpisah untuk dapat memiliki dua lingkungan secara terpisah?

Terima kasih untuk bantuannya!

Alex Recarey
sumber
Bisakah Anda mengatur .cheffolder untuk menggunakan variabel lingkungan atau sesuatu?
ceejayoz
Bisakah Anda jelaskan tujuan Anda secara lebih rinci? Infrastruktur seperti apa yang Anda inginkan untuk diotomatisasi menggunakan Chef? Anda telah menyebutkan cabang yang berbeda - jika Anda berbicara tentang penyebaran perangkat lunak, alat CI seperti Jenkins bisa menjadi solusi yang lebih baik.
geewiz
Sangat bagus bagaimana boneka mendukung lingkungan seperti ini, secara alami.
Tom O'Connor

Jawaban:

15

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.rbfile 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.rbberisi konfigurasi khusus (dalam versi dasar hanya OPSCODE_USER='username'konstan yang digunakan nanti, tetapi dapat berisi konfigurasi pisau apa pun), dan .chef/knife-secrets.rbyang 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 sshmenggunakan 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.gzfile, 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 inittugas yang membuat .chefdirektori, symlink di config/knife.rbsana, mendekripsi dan mengurai chef-secrets.tgzfile, memastikan kunci Platform Opscode pribadi pengguna ada di sana dan .chef/knife-local.rbbenar. 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.

Maciej Pasternacki
sumber
Terima kasih atas jawaban terinci. Melihat pekerjaan yang mengaturnya setidaknya berarti saya tidak melewatkan sesuatu yang jelas ...
Alex Recarey
3

Anda perlu menyiapkan dua server Chef, satu untuk produksi dan satu untuk pengembangan. Alasannya adalah bahwa tidak ada server Chef tunggal yang dapat mendukung pengembangan bercabang; bahkan dengan lingkungan.

Atau Anda dapat meninggalkan konsep server Chef dan menggunakan chef-solo. Anda dapat mengelola buku resep Anda di Git. Anda dapat bercabang & menggabungkan. Anda dapat mengabaikan masalah dengan kredensial pisau karena Anda tidak akan menggunakannya lagi.

Anda tidak akan dapat menggunakan pencarian pisau atau tas data **. Tetapi beberapa orang tidak memerlukan fitur-fitur itu.

** Nah, Anda semacam dapat: http://wiki.opscode.com/display/chef/Data+Bags#DataBags-UsingDataBagswithChefSolo

kgilpin
sumber
2

Saya memiliki dua direktori di rumah saya, .chef dan chef-repo. Chef-repo ada di git. .Chef adalah beberapa direktori pribadi yang merupakan default untuk pisau. Anda tidak harus memasukkan rahasia Anda dari .chef ke git; pisau akan mencari ~ / .chef.

cjc
sumber
2

Direktori ~ / .chef Anda seharusnya tidak berada di git repo.

Saya memiliki direktori ~ / proyek / di mana saya menyimpan repo chef saya. Dalam hal ini konfigurasi server saya.

Pekerjaan terakhir saya adalah sebagai Insinyur Sistem di toko Ruby-on-Rails. Konfigurasi nginx, varnish, dan rails kami (antara lain) masuk dalam chef repo, tetapi app Rails sendiri disimpan di repo git yang terpisah, dan digunakan secara terpisah.

Lingkungan Pementasan kami adalah satu server yang menjalankan seluruh lingkungan pementasan. Ini tidak ideal karena tidak menyerupai Produksi di mana Rails menipis dan DB berada di kotak yang terpisah. Apa yang saya sarankan adalah menggunakan Lingkungan Chef untuk memisahkan Pementasan dan Produksi. (Begitulah ketika aku sampai di sana, dan aku hanya tidak punya waktu untuk memperbaikinya sebelum aku pergi.)

gWaldo
sumber