2013-04-22 1 views
5

Sono in esecuzione un'app Rails con tre server Web e un server di database (un server RDS AWS). Mi schiero con Chef Solo. Attualmente imposto "migrate true" nella mia ricetta rails_app e "rake db: migrate" viene eseguito una volta su ciascun server web.Con Chef, come faccio a eseguire una migrazione Rails solo una volta?

Questo di solito non è un problema quando le migrazioni sono brevi. (Il primo ha esito positivo e il secondo e il terzo vengono saltati perché la tabella schema_migrations elenca la versione dello schema più recente.) Ma quando la migrazione richiede molto tempo, il secondo e il terzo server Web tentano di eseguire una migrazione prima che il primo sia terminato . Falliscono e lo chef esce senza successo. Si noti che la migrazione è riuscita (almeno quando l'ho provata), ma la distribuzione complessiva della nuova versione ha esito negativo. (Se lo eseguo di nuovo, tutto funziona correttamente quando la migrazione è già stata eseguita.)

La mia domanda è, qual è il modo migliore/canonico per garantire che la migrazione venga eseguita una sola volta?

+0

Si potrebbe ascoltare quel podcast: http://foodfightshow.org/2013/01/application-deployment.html – StephenKing

risposta

0

Potrebbe essere possibile verificare se il contenuto del file db/migrate.rb è stato modificato. Se è così, invoca condizionalmente la migrazione true. Se si utilizza git, è possibile controllare

eseguire "git diff HEAD @ {1} TESTA db/migrare"

se non esiste alcun cambiamento, quindi utilizzare la migrazione vera.

+0

che non era proprio la domanda purtroppo .. –

0

Invece di tutti i nodi che eseguono la migrazione, utilizzerei gli attributi del nodo, in modo che solo una delle convergenze esegua la migrazione.

Nella ricetta 'rails_app' la tua proprietà migrate sarebbe;

migrate node['rails']['migrate'] 

E quindi nel nodo attributi json file per l'unico nodo che si desidera eseguire;

"rails" : { "migrate" : true } 

e per gli altri due

"rails" : { "migrate" : false } 

Ovviamente modificare il percorso/nome degli attributi, come si vede in forma.

0

Vorrei diventare un ruolo leader per uno dei tre server Web e eseguire solo db: migrare su quel ruolo.

Un'altra opzione è la distribuzione del codice anche sul server db e l'esecuzione di db: migrazione lì.