2015-10-27 7 views
5

ランダムに生成された変数を使用するプレイブックの冪等性を保証する方法はありますか?不可能な単位と無作為変数

例えば、私は異なる時間に複数のサーバ上の電子メールをトリガするために、私の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はちょうど私のシナリオではできません場合は、私がしたいです知っている。

答えて

6

ランダム値の代わりに、ホスト名のハッシュやIPアドレスの最後のバイトなど、ノードに関連するものを取得できます。

これは例である:Ansibleバージョン2.3のよう

- name: Get a pseudo-random minute 
    shell: expr $((16#`echo "{{inventory_hostname}}" | md5sum | cut -c 1-4`)) % 30 
    register: minute 
    changed_when: false 
+0

、それが最も合理的な解決策のように思えます。しかし、 'Get a pseudo-random minute'というタスクが' [changed] 'ステータスを報告することを指摘する必要があります。これを防ぐために 'changed_when:false'を追加することをお勧めします。この例では、crontabの特権を保証しているので、ハッシュ値は各マシンで変更されないことがわかっています。 – Jake88

+0

@ Jake88良い点! –

+0

これは素晴らしいですが、私には2つの問題がありました。最初に、exprはdebianのデフォルトのシェル(/ bin/sh)では動作しませんでした。これはダッシュだと思います。 'args:executable:/ bin/bash'を追加するとそれが助けになりました。第2に、出力が0の場合、exprの終了コードは1です。 'failed_when:" minute.rc == 2またはminute.rc == 3'は、終了コード1で失敗しないことで修正します。 – Berdir

6

、それは種子から乱数生成器を初期化することが可能です。

"{{ 59 |random(seed=inventory_hostname) }} * * * * root /script/from/cron" 

出典:random number filter

私はランダムcronの開始時間を生成するために、このパターンを使用しました:上

  1. 異なる分このように、あなたは冪等ランダムしかし、数字を作成することができます異なるターゲットサーバー
  2. 同じサーバー上の異なる時間の異なる時間(ランダム性)
  3. 同じ日に同じ分サーバは繰り返しAnsible(冪等)を実行しているとき

がAnsible> = 2.3が必要です:これが唯一の提案ですが

cron: 
    name: "{{some_name}}_{{item.day}}" 
    state: present 
    job: "{{some_job}}" 
    weekday: "{{item.day}}" 
    hour: "{{item.hour}}" 
    minute: "{{59|random(seed=inventory_hostname + item.dow)}}" 
    with_items: 
- { day: 0, hour: 3, dow: "sunday" } 
- { day: 1, hour: 7, dow: "monday" } 
- { day: 2, hour: 1, dow: "tuesday" } 
- { day: 3, hour: 5, dow: "wednesday" } 
- { day: 4, hour: 2, dow: "thursday" } 
- { day: 5, hour: 4, dow: "friday" } 
- { day: 6, hour: 7, dow: "saturday" } 
関連する問題