ランダムに生成された変数を使用するプレイブックの冪等性を保証する方法はありますか?不可能な単位と無作為変数
例えば、私は異なる時間に複数のサーバ上の電子メールをトリガするために、私のcrontabファイルの設定にしたいので、私はansibleのset_factモジュールを使用してランダムな整数を作成:
tasks:
- set_fact:
first_run_30="{{ 30 | random }}"
run_once: yes
を次にansibleを使用して、私のcrontabにそれらの生成された変数を適用します以下のようなので:
- name: Setup cron30job
cron: name=cron30job minute={{first_run_30}},{{first_run_30 | int + 30}} job='/bin/bash /cron30job.sh' state=present user=root
environment:
MAILTO: '[email protected]'
MAILFROM: '[email protected]'
これは非常によく、しかし、ansibleのindempotence原理があり、私は信じて、プレイが行われるたびに変更を見るので、この戦略を使用して壊れて動作します。
さらにTASK: [Setup cron30job] *****************************************
changed: [127.0.0.1]
、crontabの中で3つの別々の実行中にルートの下に毎回チェック:
[ansible]# cat /var/spool/cron/root
#Ansible: cron30job
5,35 * * * * /bin/bash /sw/test/cron30job.sh
#Ansible: cron30job
9,39 * * * * /bin/bash /sw/test/cron30job.sh
#Ansible: cron30job
6,36 * * * * /bin/bash /sw/test/cron30job.sh
が回避策がある、または多分indempotenceはちょうど私のシナリオではできません場合は、私がしたいです知っている。
、それが最も合理的な解決策のように思えます。しかし、 'Get a pseudo-random minute'というタスクが' [changed] 'ステータスを報告することを指摘する必要があります。これを防ぐために 'changed_when:false'を追加することをお勧めします。この例では、crontabの特権を保証しているので、ハッシュ値は各マシンで変更されないことがわかっています。 – Jake88
@ Jake88良い点! –
これは素晴らしいですが、私には2つの問題がありました。最初に、exprはdebianのデフォルトのシェル(/ bin/sh)では動作しませんでした。これはダッシュだと思います。 'args:executable:/ bin/bash'を追加するとそれが助けになりました。第2に、出力が0の場合、exprの終了コードは1です。 'failed_when:" minute.rc == 2またはminute.rc == 3'は、終了コード1で失敗しないことで修正します。 – Berdir