人々はどのようにcronジョブを本番環境にデプロイ/バージョン管理しますか?私は特定のソリューションよりも人々が使用する規則/標準に興味がありますが、リビジョン管理にgitを使用していて、cronjobはpython/djangoスクリプトを実行しています。
9 に答える
deplomentに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にジョブが追加されます(免責事項:完全にテストされておらず、べき等ではありません)。
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コマンドを実行する必要はありません。
crontab.txtを含め、プロジェクトをバージョン管理下に置くことが私が好むものです。次に、Fabricを使用すると、次のように簡単になります。
@task
def crontab():
run('crontab deployment/crontab.txt')
deployment/crontab.txt
これにより、サーバーに接続するユーザーのcrontabにコンテンツがインストールされます。サーバー上に完全なプロジェクトがない場合は、put
最初にcrontabファイルを作成することをお勧めします。
Djangoを使用している場合は、django-command-extensionsのジョブシステムを確認してください。
利点は、バージョン管理を使用してプロジェクト構造内にジョブを保持し、すべてをPythonで記述し、crontabを1回だけ構成できることです。
Buildoutを使用してDjangoプロジェクトを管理しています。Buildoutではz3c.recipe.usercrontab
、デプロイまたは更新時にcronジョブをインストールするために使用します。
あなたが言った:
私は特定の解決策よりも人々が使用する慣習/標準についてもっと興味があります
しかし、公平を期すために、特定の解決策は環境によって異なり、普遍的なエレガントな特効薬はありません。たまたまPython/Djangoを使用していることを考えると、Celeryをお勧めします。これはPythonの非同期タスクキューであり、Djangoとうまく統合されています。また、非同期タスクキューとして提供される機能に加えて、定期的なタスクに固有の機能もあります。
私は個人的にdjango-celery-beat
統合を使用しましたが、Django設定と完全に統合され、分散環境で正しく動作します。定期的なタスクがDjangoのものに関連している場合は、Celeryを確認することを強くお勧めします。これは、特定の非同期メーリングにのみ使用し始め、多くの非同期タスク+定期的な健全性チェックやその他のWebアプリケーションのメンテナンスに使用することになりました。