はじめに
各タスク内で、どのようなホストの順番で実行されるのか、を指定する order
というディティブがあります。
先日たまたま知ったので、せっかくなので、検証します。
[2020/08/02 追記]
order
で指定できるのは、実行開始の順であって、結果の表示順ではないようです。先に実行されたホストがあとから実行されたホストに追い越されて、結果的に実行開始順と異なる順にログが表示されることもあります。この記事では、処理時間にブレが出にくい debug
モジュールを使っているので、開始順=完了順になる傾向ですが、実際はブレ出ます。
そりゃそうかという感じだけれども、Playbook 実行したときのログって、実行完了順に表示されるのですね。非同期で実行した順ではなく。なので、デフォルトの fork数5の場合、順番が異なって表示されることも全然ある(画像1、2)。
— よこち (@akira6592) 2020年8月2日
で、forks数を1にすると一定する(画像3、4) pic.twitter.com/FAGk42EpII
- 検証環境
- Ansible 2.9.6
order で指定できる値
order は Play単位で指定します。指定できる値と意味は以下のとおりです。
値 | 意味 |
---|---|
inventory | インベントリファイルで定義された順(デフォルト) |
sorted | インベントリ名の昇順 |
reverse_sorted | インベントリ名の降順 |
reverse_inventory | インベントリファイルで定義された順番の降順 |
shuffle | シャッフル |
検証
代表して、inventory
、sorted
、shuffle
だけ検証します。
インベントリファイル
以下のインベントリファイルを利用します。数字部分が 1, 3, 5, 2, 4
という順番で定義しています。
[sv] sv1 ansible_host=localhost sv3 ansible_host=localhost sv5 ansible_host=localhost sv2 ansible_host=localhost sv4 ansible_host=localhost
Playbook
order: inventory
まずは order: inventory
を指定します。これはデフォルトの動作です。
--- - hosts: sv gather_facts: false order: inventory # ここポイント tasks: - name: debug1 debug: msg: "I am {{ inventory_hostname }}" - name: debug2 debug: msg: "I am {{ inventory_hostname }}"
実行します。order: inventory
なのでインベントリファイルで指定したとおり、1, 3, 5, 2, 4
という順番になりました。(前述の追記通り、開始順=完了順とは限りません)
$ ansible-playbook -i inventory.ini order.yml PLAY [sv] ******************************************************************************************************* TASK [debug1] *************************************************************************************************** ok: [sv1] => { "msg": "I am sv1" } ok: [sv3] => { "msg": "I am sv3" } ok: [sv5] => { "msg": "I am sv5" } ok: [sv2] => { "msg": "I am sv2" } ok: [sv4] => { "msg": "I am sv4" } TASK [debug2] *************************************************************************************************** ok: [sv1] => { "msg": "I am sv1" } ok: [sv3] => { "msg": "I am sv3" } ok: [sv5] => { "msg": "I am sv5" } ok: [sv2] => { "msg": "I am sv2" } ok: [sv4] => { "msg": "I am sv4" } PLAY RECAP ****************************************************************************************************** sv1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv3 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv4 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv5 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
PLAY RECAP
のところはインベントリ名の昇順です。
order: sorted
続いて order: sorted
の場合の実行結果です。インベントリ名の昇順になりました。(前述の追記通り、開始順=完了順とは限りません)
$ ansible-playbook -i inventory.ini order.yml PLAY [sv] ***************************************************************************************************************** TASK [debug1] ************************************************************************************************************* ok: [sv1] => { "msg": "I am sv1" } ok: [sv2] => { "msg": "I am sv2" } ok: [sv3] => { "msg": "I am sv3" } ok: [sv4] => { "msg": "I am sv4" } ok: [sv5] => { "msg": "I am sv5" } TASK [debug2] ************************************************************************************************************* ok: [sv1] => { "msg": "I am sv1" } ok: [sv2] => { "msg": "I am sv2" } ok: [sv3] => { "msg": "I am sv3" } ok: [sv4] => { "msg": "I am sv4" } ok: [sv5] => { "msg": "I am sv5" } PLAY RECAP **************************************************************************************************************** sv1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv3 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv4 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv5 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
order: shuffle
order: shuffle
の場合です。なんとも言えない順番にシャッフルされました。
シャッフルされた順番は、Play 内では固定のようです。
$ ansible-playbook -i inventory.ini order.yml PLAY [sv] ***************************************************************************************************************** TASK [debug1] ************************************************************************************************************* ok: [sv3] => { "msg": "I am sv3" } ok: [sv1] => { "msg": "I am sv1" } ok: [sv5] => { "msg": "I am sv5" } ok: [sv4] => { "msg": "I am sv4" } ok: [sv2] => { "msg": "I am sv2" } TASK [debug2] ************************************************************************************************************* ok: [sv3] => { "msg": "I am sv3" } ok: [sv1] => { "msg": "I am sv1" } ok: [sv5] => { "msg": "I am sv5" } ok: [sv4] => { "msg": "I am sv4" } ok: [sv2] => { "msg": "I am sv2" } PLAY RECAP **************************************************************************************************************** sv1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv3 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv4 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 sv5 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
おわりに
各タスク内で、どのようなホストの順番で実行されるのか、を指定する order
というディティブの検証をしました。
処理の順番にシビアになることはあまり多くはないかもしれませんが、ログの出力順を変えたいときはあるかもしれません。(追記: order
はログの出力順ではなく、実行開始順を制御するもの)