2016-04-14 8 views
2

驚きを避けるために、私は、同じターゲットホストに対して同時展開を妨げるソリューションを実装したいと考えています。2つの不可能なジョブが同じマシンに対して実行されないようにするにはどうすればよいですか?

集中管理サーバーではなく、私たち自身のマシンから展開する機能を妨げたくないことに注意してください。

同じことを並行して実行していないことを保証したいだけです。

答えて

4

あなたがファイルをチェックして、あなたはに対して実行ホスト上のファイルをドロップすることができます:

tasks:  
    - stat: path=.ansible_lock_file 
    register: lock_file_check 

    - fail: msg="ansible is already being run against this host" 
    when: lock_file_check.stat.exists 

    - file: path=.ansible_lock_file state=touch` 

とロックファイルがありますが、あなたの脚本

- file: path=.ansible_lock_file state=touch 
+0

良いスタートが、それは一つのキーパーツを欠い:脚本が完全に実行に失敗した場合、無残に失敗します。また、コードを複製することなく、すべてのプレイブックを実装できることは非常に有用です。 – sorin

+0

ハンドラを使用すると、ハングしないようにハンドラを使用できます。インクルードファイルを使用すると、ハンドブック全体で再利用できるようになります。 – ferrants

+0

新しいレスキューメソッドをAnabilities 2.0で使用することができます。https://docs.ansible.com/ansible/playbooks_blocks.html#error-handling –

0

の終わりにそれを削除技術的な解決策として、私は代わりに文化的なものを提案したいと思います。

多くの開発チームは、リリースを調整する内部チャットチャネルを持っています。ボットは現在進行中のリリースのステータスを表示し、開発者は何かを展開する準備ができていると言います。場合によっては、これは少し正式化されています。ボットは誰がロックを持っているかを把握しています。

操作チームと同じことができます。あなたが正しいと書いたコードに頼るよりも簡単です。もっと重要なのは、全員を同じページに保つのに役立ちます。そして、より多くのチャットシステムでは、いつ変更されたのかのログを自動的に提供します。

+0

既にいくつかのデプロイメントで実装されていますが、これはCDの場合には機能しません。ほぼすべての変更がテスト環境への展開を引き起こすと考えてください。これは1時間に10回も発生する可能性があります。そこで、私たちはいくつかのデプロイメントジョブだけをボーカリゼーションすることになりました。 – sorin

1

まだ完全な答えではありませんが、私の印象は、エレガントなソリューションは、それを実装するコールバックプラグインを書くことです。

コールバックAPIを使用して、実行するための追加のタスクを挿入したり、ある変数にアクセスしたり、いくつかの条件で再生を中止できるかどうかはわかりません。

https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/callback/osx_say.py

関連する問題