特定のタスクを1号機だけ実行する

はじめに

下記のようなインベントリがあったとします。

[servers]
node01
node02

node01node02が、ほぼ同じ構成のとき、基本的にはserversグループを対象としてPlaybookを作成すると思います。 しかし、何らかの事情で、あるタスクは1号機だけ実行したいというケースがあった場合、ホスト名のサフィックスを利用して、これを実現する例を書いてみます。

Playbook

- hosts: servers
  gather_facts: false
  tasks:
    - name: all node
      ansible.builtin.debug:
        msg: "I am {{ inventory_hostname }}"

    - name: only primary
      ansible.builtin.debug:
        msg: "I am {{ inventory_hostname }}"
      when: inventory_hostname | regex_search('.+01$')

実行結果

PLAY [servers] ******************************************************************************************************

TASK [all node] *****************************************************************************************************
ok: [node01] => {
    "msg": "I am node01"
}
ok: [node02] => {
    "msg": "I am node02"
}

TASK [only primary] *************************************************************************************************
ok: [node01] => {
    "msg": "I am node01"
}
skipping: [node02]

PLAY RECAP **********************************************************************************************************
node01                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node02                     : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0