てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] 各タスク内で実行するホストの順番を指定する(order)

はじめに

各タスク内で、どのようなホストの順番で実行されるのか、を指定する order というディティブがあります。

先日たまたま知ったので、せっかくなので、検証します。

[2020/08/02 追記]

order で指定できるのは、実行開始の順であって、結果の表示順ではないようです。先に実行されたホストがあとから実行されたホストに追い越されて、結果的に実行開始順と異なる順にログが表示されることもあります。この記事では、処理時間にブレが出にくい debug モジュールを使っているので、開始順=完了順になる傾向ですが、実際はブレ出ます。

  • 検証環境
    • Ansible 2.9.6

order で指定できる値

order は Play単位で指定します。指定できる値と意味は以下のとおりです。

意味
inventory インベントリファイルで定義された順(デフォルト)
sorted インベントリ名の昇順
reverse_sorted インベントリ名の降順
reverse_inventory インベントリファイルで定義された順番の降順
shuffle シャッフル

検証

代表して、inventorysortedshuffle だけ検証します。

インベントリファイル

以下のインベントリファイルを利用します。数字部分が 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 はログの出力順ではなく、実行開始順を制御するもの)