想爲你的Ansible劇本取一個隨機數?還想在接下來的運行中保持系統的等冪性?這裏有一個答案。python
假如,你要爲一大批服務器設置cron任務,卻不想讓它們同時啓動,你能夠這樣設置分鐘數:數組
minutes: "{{ 60 | random }}"
可是,如今生成的隨機(分鐘)數在運行以後,會產生許多沒必要要的任務變化。到了Ansbile 2.3,事情有了改觀。bash
在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程序,還能保證劇本運行結果的等冪性。
這篇文章是本人翻譯過來的,原做請見連接。