Ansible隨機數

想爲你的Ansible劇本取一個隨機數?還想在接下來的運行中保持系統的等冪性?這裏有一個答案。python

假如,你要爲一大批服務器設置cron任務,卻不想讓它們同時啓動,你能夠這樣設置分鐘數:數組

minutes: "{{ 60 | random }}"

可是,如今生成的隨機(分鐘)數在運行以後,會產生許多沒必要要的任務變化。到了Ansbile 2.3,事情有了改觀。bash

Ansible 2.3的改進

在Ansible的2.3版本中,能夠從一個「種子」裏獲取隨機。這樣就能夠獲得一個隨機但等冪的數值:服務器

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

之前版本的Ansible怎麼辦?
你能夠根據任何一個變量或真值(Ansible從主機上採集到的FACT數據)來編造一個僞隨機數。如,你能夠用inventory_hostname來在各不一樣的主機上生成「隨機數」,還能保證劇本的運行等冪。在劇本中,這樣寫:dom

minutes: "{{ ( inventory_hostname | hash | list | map('int',0,16) | sum ) % 60 }}"

魔術能夠這樣解釋:spa

第1步:獲取主機名 inventory_hostname,如:myserver翻譯

第2步:將其序列化,取得一個哈希數,如"c3a7a35a28dcce27daad3a7a90caad99b967a904"code

第3步:將其拆分爲單字數組[["c","3","a",...]server

第4步:每一個單字其實是一個16進制數字ip

第5步:把這些數字轉成十進制

第6步:將全部的數字加起來

第7步:總和除以60以後的餘數,就是最終的「隨機數」

因而,Ansible的劇本中,你的cron任務可能會這樣寫:

cron:
  name: myjob
  job: myscript.sh
  minute: "{{ ( inventory_hostname | hash | list | map('int',0,16) | sum ) % 60 }}"
  hour: "{{ (( inventory_hostname | hash | list | map('int',0,16) | sum ) % 2) + 6 }}"

這樣,就能夠在6:00 - 7:59之間隨機一個分鐘點運行myscript.sh程序,還能保證劇本運行結果的等冪性。

這篇文章是本人翻譯過來的,原做請見連接。

相關文章
相關標籤/搜索