Lavoro con più progetti, quindi la soluzione di cjc non funzionerà per me. C'è anche un problema di configurazione comune vs personalizzata (gli indirizzi, ecc. Sono comuni all'azienda, c'è anche un po 'di magia nelle configurazioni). Lo schema su cui ho finalmente deciso è un po 'un trucco, ma è conveniente da usare.
Invece di globale ~/.chef
, uso la sottodirectory '.chef' all'interno di chef-repo, che non è memorizzata in git (è aggiunta a .gitignore
). Ho anche file di config/knife.rb
file che è registrato in Git e contiene una configurazione condivisa. Si inizia con questo frammento:
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
Carica file .chef/knife-local.rb
contenenti una configurazione personalizzata (nella versione base è solo una OPSCODE_USER='username'
costante che verrà utilizzata in seguito, ma può contenere qualsiasi configurazione di coltello) e .chef/knife-secrets.rb
che contiene segreti condivisi (chiavi AWS ecc.).
Al di sotto di questo, vi è una configurazione di coltello regolare che utilizza costanti definite in questi file, ad esempio:
client_key "#{root_dir}/.chef/#{OPSCODE_USER}.pem"
In questo modo, ottengo la standardizzazione della configurazione dei coltelli in tutta l'azienda, il che a sua volta significa che qualsiasi frammento di codice o invocazione di coltelli condivisa in un wiki funzionerà per tutti. C'è abbastanza confusione e magia nel coltello stesso: configurazioni diverse non farebbero altro che peggiorare. Inoltre, tutti beneficiano di piccoli frammenti magici, come questo per knife ssh
utilizzare l'accesso configurato nell'utente~/.ssh/config
C'è anche un problema di segreti condivisi: chiave di convalida di chef server, chiavi AWS archiviate knife-secrets.rb
, chiave privata SSH di EC2, chiavi di data bag crittografate e così via. Non vogliamo assolutamente che vengano archiviati nel repository o, in realtà, ovunque non siano crittografati in modo sicuro. Quindi distribuiamo questi file come .tar.gz
file, che è crittografato con GPG a tutti gli utenti dell'azienda e condiviso su Dropbox.
Configurare tutto questo sta diventando complicato e voglio che le persone del team utilizzino effettivamente la cosa, quindi c'è l'ultimo elemento: rake init
attività che crea .chef
directory, config/knife.rb
collegamenti simbolici lì, decodifica e decomprime il chef-secrets.tgz
file, si assicura che la chiave della piattaforma Opscode privata dell'utente sia lì e .chef/knife-local.rb
sia correttamente configurato, collega i plug-in al coltello e imposta le autorizzazioni appropriate sulla directory e sui file all'interno. Questa attività è impostata in modo da poter essere eseguita in modo sicuro più volte su un repository già inizializzato (ad es. Per aggiornare segreti o plugin di coltello).
C'è anche un'attività di supporto che reimballa tutti i segreti, crittografa il tarball per tutti e lo copia in dropbox, per facilitare l'aggiunta di nuovi dipendenti o la modifica di segreti.
Per quanto riguarda più ambienti: Chef ha una funzione chiamata ambienti . Non l'ho ancora usato, ma dovrebbe fare quello che ti serve. È inoltre possibile separare rigorosamente l'ambiente di produzione (per evitare che gli sviluppatori dispongano di qualsiasi chiave correlata in qualche modo all'ambiente di produzione) disponendo di due organizzazioni Hosted Chef o Server Chef separati. Questo frammento di knife.rb mostra come configurare il coltello in un modo diverso in base al ramo attualmente estratto: puoi usarlo per impostare l'ambiente e l'URL del server chef. C'è anche un plugin per coltelli chiamato coltello-flusso , che fornisce un flusso di lavoro più completo, a due organizzazioni.
.chef
cartella per utilizzare le variabili di ambiente o qualcosa del genere?