2009-10-21 124 views
20

人們如何部署/版本控制cronjobs到生產?我更關心人們使用的約定/標準,而不是任何特定的解決方案,但我碰巧使用git進行版本控制,並且cronjob正在運行python/django腳本。如何將cron作業部署到生產環境?

回答

20

如果使用Fabric爲deploment可以添加一個編輯你的crontab的功能。

def add_cronjob(): 
    run('crontab -l > /tmp/crondump')    
    run('echo "@daily /path/to/dostuff.sh 2> /dev/null" >> /tmp/crondump') 
    run('crontab /tmp/crondump') 

這會將作業追加到您的crontab(免責聲明:完全未經測試且不是非常冪等)。

  1. 將crontab保存爲臨時文件。

  2. 向tmpfile追加一行。

  3. 寫回crontab。

這是propably不正是你想做的事,而是沿着你能想到有關檢查的crontab到Git和覆蓋它與每一個在服務器上部署這些行。 (如果有對你的項目專用的用戶。)

+0

實際上,如果修改cron行,使用Fabric的append命令不是冪等的。你會以舊線加新線。 – Dave 2011-03-16 20:02:26

+2

創建/ tmp/crondump時,我不得不添加語法來列出crontab,否則它會掛起(在Ubuntu atleast上)。 (即'crontab -l>/tmp/crondump') – joet3ch 2011-03-29 16:03:55

+0

我正在使用此方法在我的生產服務器上安裝crontab,但它不工作。它什麼都不做,即使當我'SSH'進入服務器並檢查'crontab -l'時,一切似乎都沒問題。我注意到,如果使用'crontab -e'編輯它,即使我只添加了一個無意義的空間,當我保存文件時,它會顯示「安裝新的crontab」,然後開始工作。任何想法爲什麼發生這種情況 – 2012-05-27 18:30:26

1

你可能可以使用類似的cfengine /廚師部署(它可以部署的一切 - 包括cron作業)

不過,如果你問這個問題 - 它可能因爲您有許多生產服務器,每個服務器都運行大量計劃作業。 如果是這種情況,您可能需要一種不僅可以部署作業的工具,還可以跟蹤成功故障,讓您輕鬆查看上次運行的日誌,運行統計數據,讓您輕鬆更改多個作業的時間表和服務器(由於計劃的維護...)等。

我使用一個名爲「UC4」的商業工具。我不推薦它,所以我希望你能找到一個更好的程序來解決同樣的問題。我只是說,當你部署他們時,工作管理不會結束。

8

使用面料,我寧願讓我的crontab的原始版本在本地,這樣,我確切地知道什麼是對生產,可以很容易地在除編輯條目添加。

我使用的面料腳本看起來是這樣的(一些代碼絕密例如採取備份的照顧):

def deploy_crontab(): 
    put('crontab', '/tmp/crontab') 
    sudo('crontab < /tmp/crontab') 
1

有真正的手動部署的crontab如果您無法連接你的系統是配置管理系統的cfengine一樣/傀儡3個選項。

您可以簡單地使用crontab -u用戶-e但您冒着複製/粘貼錯誤的風險。

您還可以將文件複製到cron目錄,但沒有語法檢查的文件,在linux下,你必須按順序運行觸摸的/ var /線軸/ cron的爲crond的以皮卡的變化。

注意每個人都會在某些時候忘記to​​uch命令。

在我的經驗,這種方法是部署一個crontab我最喜歡的手工方式。

diff /var/spool/cron/<user> /var/tmp/<user>.new 
crontab -u <user> /var/tmp/<user>.new 

我覺得我上面提到的方法是最好的,因爲你不運行的複製/粘貼錯誤的風險,它可以幫助你維持你的版本控制文件的一致性。它執行文件內部cron任務的語法檢查,並且不需要執行touch命令,就如同僅僅複製文件一樣。

+0

'部署'一詞意味着一個完全自動化的過程。不應該有任何手動觸摸,也不會有差異來檢查有哪些變化。一個命令會完成整個事情,一段時間。 (例如「fab staging deploy:v1.23」) – 2014-12-10 12:01:46

0

版本控制之下有你的項目,包括您的crontab.txt,是我喜歡的。然後,用Fabric,它是如此簡單:

@task 
def crontab(): 
    run('crontab deployment/crontab.txt') 

這將在deployment/crontab.txt的內容安裝到您連接到服務器的用戶的crontab中。如果你沒有完整的項目在服務器上,你首先需要put crontab文件。

相關問題