cronジョブを本番環境にどのようにデプロイしますか?
質問
どのように人々は本番環境にcronジョブを展開/バージョン管理しますか?私は、特定のソリューションよりも人々が使用する規則/標準に興味がありますが、たまたまリビジョン管理にgitを使用しており、cronjobはpython / djangoスクリプトを実行しています。
解決
展開に Fabric を使用している場合、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にジョブが追加されます(免責事項:完全にテストされておらず、very等ではありません)。
-
crontabを一時ファイルに保存します。
-
tmpfileに行を追加します。
-
crontabを書き戻します。
これはおそらく正確にあなたがしたいことではありませんが、これらの行に沿って、crontabをgitにチェックインし、デプロイするたびにサーバーで上書きすることを考えることができます。 (プロジェクト専用のユーザーがいる場合。)
他のヒント
Fabricを使用して、crontabの元のバージョンをローカルに保持することを好みます。そうすることで、実稼働中のものを正確に把握し、エントリの追加に加えて簡単にエントリを編集できます。
使用するファブリックスクリプトは次のようになります(一部のコードは、たとえばバックアップを処理するように編集されています):
def deploy_crontab():
put('crontab', '/tmp/crontab')
sudo('crontab < /tmp/crontab')
以下もご覧ください:
http:// django- fab-deploy.readthedocs.org/en/0.7.5/_modules/fab_deploy/crontab.html#crontab_update
django-fab-deployモジュールには、crontab_setやcrontab_updateなどの便利なスクリプトが多数あります
おそらくCFEngine / Chefなどをデプロイに使用できます(cronジョブを含むすべてをデプロイできます)
ただし、この質問をする場合-多数のスケジュールされたジョブを実行している多数の運用サーバーがある可能性があります。 この場合、ジョブを展開できるだけでなく、成功の失敗を追跡し、前回の実行からのログを簡単に確認したり、統計を実行したり、多くのジョブのスケジュールを簡単に変更したり、一度にサーバー(計画的なメンテナンスのため...)など
「UC4」という商用ツールを使用しています。私は本当にそれをお勧めしませんので、同じ問題を解決できるより良いプログラムを見つけることができると思います。ジョブを展開しても、ジョブの管理は終了しないと言っています。
cfengine / puppetなどの構成管理システムにシステムを接続できない場合、crontabを手動で展開する3つのオプションがあります。
単に crontab -u user -e を使用できますが、コピー/貼り付けでエラーが発生するリスクがあります。
ファイルをcronディレクトリにコピーすることもできますが、ファイルの構文チェックはありません。Linuxでは、crondが変更を反映するために touch / var / spool / cron を実行する必要があります。
注ある時点で誰もがタッチコマンドを忘れます。
私の経験では、この方法はcrontabを展開するための手動のお気に入りの方法です。
diff /var/spool/cron/<user> /var/tmp/<user>.new
crontab -u <user> /var/tmp/<user>.new
バージョン管理されたファイルとの一貫性を維持するのに役立つコピー/貼り付けエラーのリスクを冒さないため、上記の方法が最適だと思います。ファイル内のcronタスクの構文チェックを実行し、単純にファイルをコピーする場合のようにtouchコマンドを実行する必要はありません。
Djangoを使用している場合は、ジョブをご覧ください。 django-command-extensionsからのシステム。
利点は、バージョン管理により、プロジェクト構造内にジョブを保持し、Pythonですべてを記述し、crontabを1回だけ構成できることです。
Buildout を使用してDjangoプロジェクトを管理しています。 Buildoutでは、 z3c.recipe.usercrontab
デプロイまたは更新でcronジョブをインストールします。
crontab.txtを含むプロジェクトをバージョン管理下に置くことは、私が好むことです。次に、 Fabric を使用すると、次のように簡単になります。
@task
def crontab():
run('crontab deployment/crontab.txt')
これにより、 deployment / crontab.txt
の内容が、サーバーに接続するユーザーのcrontabにインストールされます。サーバーに完全なプロジェクトがない場合は、最初にcrontabファイルを put
したいでしょう。