てくなべ (tekunabe)

ansible / network / automation

[Ansible] 明示的なグループに所属しないホストが暗黙的に所属する ungrouped グループ

はじめに

Ansible には、allungrouped というデフォルトで定義されたグループがあります。

all はすべてのホストが所属するグループです。

一方で、 ungrouped は、明示的なグループに所属さないホストが暗黙的に所属するグループです。

言葉では少しわかりにくいかもしれませんので、例で説明します。

  • 動作確認環境
    • Ansible 2.9.10

インベントリファイル

以下のようなインベントリファイルを想定します。

rt01
rt02

[ios]
ios01
ios02

[eos]
eos01
eos02

上記のうち、rt01rt02 はどの明示的なグループ(ioseos)にも所属していません。

この rt01rt02ungrouped に所属することになります。

確認

グループの所属関係は、ansible-inventoy コマンド--graph オプションを利用すると視覚的にわかりやすいです。(参考

$ ansible-inventory -i inventory.ini --graph

@all:
  |--@eos:
  |  |--eos01
  |  |--eos02
  |--@ios:
  |  |--ios01
  |  |--ios02
  |--@ungrouped:
  |  |--rt01
  |  |--rt02

ungrouped グループに、rt01rt02 が所属していることが分かります。また、ungrouped グループは all グループに所属しています。

Playbook 内でも ungrouped グループをターゲットにできます。

---
- hosts: ungrouped
  gather_facts: false

  tasks:
    - name: debug
      debug:
        msg: "{{ inventory_hostname }} in ungrouped"

実行すると、rt01rt02 を対象に実行されます。

$ ansible-playbook -i inventory.ini ungrouped.yml 

PLAY [ungrouped] *************************************************************************************************

TASK [debug] *****************************************************************************************************
ok: [rt02] => {
    "msg": "rt02 in ungrouped"
}
ok: [rt01] => {
    "msg": "rt01 in ungrouped"
}

PLAY RECAP *******************************************************************************************************
rt01                       : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
rt02                       : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0