tags - タスクにタグを付ける

2019/06/06

Ansible

 Ansible Documentation

Tags

 機能

  • タスクにタグを付ける
  • 複数のタスクに同じタグを付けることもできる
  •  ansible-playbook コマンドで --tags オプションを指定すると、指定されたタグのタスクだけを実行できる
  •  ansible-playbook コマンドで --skip-tags オプションを指定すると、指定されたタグのタスクだけを実行から除外できる

 基本の使い方

各タスクにタグを付けた例です。
---
- hosts: all
  gather_facts: no

  tasks:
    - name: 1 番目のタスク
      debug:
        msg: "Task #1"
      tags: job1
    - name: 2 番目のタスク
      debug:
        msg: "Task #2"
      tags:
        - job2
    - name: 3 番目のタスク
      debug:
        msg: "Task #3"
    - name: 4 番目のタスク
      debug:
        msg: "Task #4"
      tags: job2, job3
    - name: 5 番目のタスク
      debug:
        msg: "Task #5"
    - name: 6 番目のタスク
      debug:
        msg: "Task #6"
      tags:
        - job1
        - job3
 --list-tasks オプションで、各タスクとタグの状態を確認します。タスク「3 番目のタスク」と「5 番目のタスク」にタグが付いていません。タスク「4 番目のタスク」と「6 番目のタスク」に 2 つのタグが付いています。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --list-tasks site.yml

playbook: site.yml

  play #1 (all): all TAGS: []
    tasks:
      1 番目のタスク TAGS: [job1]
      2 番目のタスク TAGS: [job2]
      3 番目のタスク TAGS: []
      4 番目のタスク TAGS: [job2, job3]
      5 番目のタスク TAGS: []
      6 番目のタスク TAGS: [job1, job3]
ansibleman@ubuntu-pc:~/ansible/tags$
まず、タグの指定なしの実行です。すべてのタスクが実行されます。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3"
}

TASK [4 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #4"
}

TASK [5 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #5"
}

TASK [6 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #6"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
タグ job1 が指定されたタスクだけを実行します。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags "job1" site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [6 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #6"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
タグ job2 以外のタスクを実行します。この場合、タグが付いていないタスクも実行対象になります。「4 番目のタスク」は指定したタグに job2 が含まれているため実行対象外になります。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --skip-tags "job2" site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3"
}

TASK [5 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #5"
}

TASK [6 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #6"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$

 タグの継承

 play や import_tasks: にタグを付けると、その中に含まれるすべてのタスクにタグが自動的に追加されます。このように含まれるすべてのタスクにタグが自動的に追加されることを「タグの継承」と呼びます。すでにタスクにタグが付いている場合、そのタグはそのままで継承されたタグが追加されます。
play にタグを付けた例です。
---
- hosts: all
  gather_facts: no
  tags: foobar

  tasks:
    - name: 1 番目のタスク
      debug:
        msg: "Task #1"
    - name: 2 番目のタスク
      debug:
        msg: "Task #2"
      tags: baz
    - name: 3 番目のタスク
      debug:
        msg: "Task #3"
 --list-tasks で確認すると、タグの継承ですべてのタスクにタグ foobar が追加されています。タスク「2 番目のタスク」はタスク自体に設定したタグ baz とタグの継承でタグ foobar が追加され 2 つのタグが付きます。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --list-tasks site.yml

playbook: site.yml

  play #1 (all): all TAGS: [foobar]
    tasks:
      1 番目のタスク TAGS: [foobar]
      2 番目のタスク TAGS: [baz, foobar]
      3 番目のタスク TAGS: [foobar]
ansibleman@ubuntu-pc:~/ansible/tags$
 import_tasks: にタグを付けた例です。
---
- hosts: all
  gather_facts: no

  tasks:
    - name: 1 番目のタスク
      debug:
        msg: "Task #1"
      tags:
        - foo
    - name: 2 番目のタスク
      import_tasks: sample.yml
      tags: bar
    - name: 3 番目のタスク
      debug:
        msg: "Task #3"
      tags:
        - baz
子ファイルです。
- name: 子タスク 1 番目のタスク
  debug:
    msg: "child #1"
- name: 子タスク 2 番目のタスク
  debug:
    msg: "child #2"
  tags:
    - forbar
 --list-tasks の確認結果です。import_tasks: に付けたタグはすべての子タスクに継承されます。子タスク「子タスク 2 番目のタスク」は子タスク自体に設定したタグ foobar とタグの継承でタグ bar が追加され 2 つのタグが付きます。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --list-tasks site.yml

playbook: site.yml

  play #1 (all): all TAGS: []
    tasks:
      1 番目のタスク TAGS: [foo]
      子タスク 1 番目のタスク TAGS: [bar]
      子タスク 2 番目のタスク TAGS: [bar, forbar]
      3 番目のタスク TAGS: [baz]
ansibleman@ubuntu-pc:~/ansible/tags$
 block: にタグを付けた例です。
---
- hosts: all
  gather_facts: no

  tasks:
    - name: 1 番目のタスク
      debug:
        msg: "Task #1"
      tags: job1
    - name: 2-4 番目のタスク
      block:
      - name: 2 番目のタスク
        debug:
          msg: "Task #2"
      - name: 3 番目のタスク
        debug:
          msg: "Task #3"
        tags: job4
      - name: 4 番目のタスク
        debug:
          msg: "Task #4"
      tags: job2
    - name: 5 番目のタスク
      debug:
        msg: "Task #5"
      tags:
        - job1
        - job3
 --list-tasks の確認結果です。block: につけたタグは block: 内のすべてのタスクに継承されます。タスク「3 番目のタスク」はタスク自体に設定したタグ job4 とタグの継承でタグ job2 が追加され 2 つのタグが付きます。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --list-tasks site.yml

playbook: site.yml

  play #1 (all): all TAGS: []
    tasks:
      1 番目のタスク TAGS: [job1]
      2 番目のタスク TAGS: [job2]
      3 番目のタスク TAGS: [job2, job4]
      4 番目のタスク TAGS: [job2]
      5 番目のタスク TAGS: [job1, job3]
ansibleman@ubuntu-pc:~/ansible/tags$ 

 特別なタグ

特別なタグとして always と never があります。タグ always を付けられたタスクは常に実行されます。次の play はタスク「3 番目のタスク」にタグ always を設定しています。
---
- hosts: all
  gather_facts: no

  tasks:
    - name: 1 番目のタスク
      debug:
        msg: "Task #1"
      tags: job1
    - name: 2 番目のタスク
      debug:
        msg: "Task #2"
    - name: 3 番目のタスク
      debug:
        msg: "Task #3 - 常に実行するタスク"
      tags: always
    - name: 4 番目のタスク
      debug:
        msg: "Task #4"
      tags: job2
    - name: 5 番目のタスク
      debug:
        msg: "Task #5"
      tags:
        - job1
        - job3
 --list-tasks の確認結果です。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --list-tasks site.yml

playbook: site.yml

  play #1 (all): all TAGS: []
    tasks:
      1 番目のタスク TAGS: [job1]
      2 番目のタスク TAGS: []
      3 番目のタスク TAGS: [always]
      4 番目のタスク TAGS: [job2]
      5 番目のタスク TAGS: [job1, job3]
ansibleman@ubuntu-pc:~/ansible/tags$
タグ job1 のタスクを実行します。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags job1 site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3 - 常に実行するタスク"
}

TASK [5 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #5"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$
タグ job2 のタスクを実行します。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags job2 site.yml

PLAY [all] *********************************************************************

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3 - 常に実行するタスク"
}

TASK [4 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #4"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$
タグ job1 以外のタスクを実行します。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --skip-tags job1 site.yml

PLAY [all] *********************************************************************

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3 - 常に実行するタスク"
}

TASK [4 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #4"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
このようにタグを指定して play を実行したとき、タグ always が設定されたタスクは必ず実行されます。always もタグなので、次のような実行もできます。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags always site.yml

PLAY [all] *********************************************************************

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3 - 常に実行するタスク"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --skip-tags always site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [4 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #4"
}

TASK [5 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #5"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
タグ never を付けられたタスクは、明示的に指定されない限り実行されません。タスク「3 番目のタスク」と「5 番目のタスク」にタグ never を付けています。
---
- hosts: all
  gather_facts: no

  tasks:
    - name: 1 番目のタスク
      debug:
        msg: "Task #1"
      tags: job1
    - name: 2 番目のタスク
      debug:
        msg: "Task #2"
    - name: 3 番目のタスク
      debug:
        msg: "Task #3 - never なタスク"
      tags: never
    - name: 4 番目のタスク
      debug:
        msg: "Task #4"
      tags: job2
    - name: 5 番目のタスク
      debug:
        msg: "Task #5 - never なタスク"
      tags:
        - job1
        - never
 --list-tasks の確認結果です。タグ never を付けられたタスクは表示されません。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --list-tasks site.yml

playbook: site.yml

  play #1 (all): all TAGS: []
    tasks:
      1 番目のタスク TAGS: [job1]
      2 番目のタスク TAGS: []
      4 番目のタスク TAGS: [job2]
ansibleman@ubuntu-pc:~/ansible/tags$
 --tags を付けずに実行した結果です。タグ never を付けたタスクは実行されません。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [4 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #4"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
タグ job1 を指定した実行結果です。タスク「5 番目のタスク」にタグ never と job1 が付いているので実行対象になっています。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags job1 site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [5 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #5 - never なタスク"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
タグ never もタグなので、--tags で指定できます。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags never site.yml

PLAY [all] *********************************************************************

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3 - never なタスク"
}

TASK [5 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #5 - never なタスク"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
タグ never 以外を指定した実行結果です。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --skip-tags never site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [4 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #4"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
タグ always と never が混在した例です。
---
- hosts: all
  gather_facts: no

  tasks:
    - name: 1 番目のタスク
      debug:
        msg: "Task #1"
      tags: job1
    - name: 2 番目のタスク
      debug:
        msg: "Task #2"
      tags: always
    - name: 3 番目のタスク
      debug:
        msg: "Task #3"
      tags: never
 --tags always の実行結果です。タグ always が付いたタスクだけが実行されます。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags always site.yml

PLAY [all] *********************************************************************

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
 --tags never の実行結果です。タグ never が付いたタスク以外にタグ always が付いたタスクも実行されます。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags never site.yml

PLAY [all] *********************************************************************

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 

 --tags で指定できる特別なタグ

 --tags で指定できる特別なタグは all, tagged, untagged の 3 種類があります。次の play で確認します。
---
- hosts: all
  gather_facts: no

  tasks:
    - name: 1 番目のタスク
      debug:
        msg: "Task #1"
      tags: job1
    - name: 2 番目のタスク
      debug:
        msg: "Task #2"
      tags: always
    - name: 3 番目のタスク
      debug:
        msg: "Task #3"
    - name: 4 番目のタスク
      debug:
        msg: "Task #4"
      tags: never
    - name: 5 番目のタスク
      debug:
        msg: "Task #5"
      tags: job2
    - name: 6 番目のタスク
      debug:
        msg: "Task #6"
      tags: job1
      
 --list-tasks の結果です。タスク「4 番目のタスク」はタグ never が付いているので表示されません。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --list-tasks site.yml

playbook: site.yml

  play #1 (all): all TAGS: []
    tasks:
      1 番目のタスク TAGS: [job1]
      2 番目のタスク TAGS: [always]
      3 番目のタスク TAGS: []
      5 番目のタスク TAGS: [job2]
      6 番目のタスク TAGS: [job1]
ansibleman@ubuntu-pc:~/ansible/tags$ 
タグを指定しないで実行した結果です。タグ never が付いた「4 番目のタスク」以外を実行します。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3"
}

TASK [5 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #5"
}

TASK [6 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #6"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
タグ all はタグ never 以外のタスクおよびタグ無しのタスクを実行します。--tags を指定しない場合、--tags all が指定されたと見なされます。実行結果は上述の --tags なしと同じです
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags all site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3"
}

TASK [5 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #5"
}

TASK [6 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #6"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$
タグ tagged はタグが指定されたタスクだけを実行します。ただし、タグ never が付いたタスクは除きます。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags tagged site.yml

PLAY [all] *********************************************************************

TASK [1 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #1"
}

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [5 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #5"
}

TASK [6 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #6"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$ 
タグ untagged はタグが指定されていないタスクとタグ always が付いたタスクを実行します。
ansibleman@ubuntu-pc:~/ansible/tags$ ansible-playbook -i hosts.yml --tags untagged site.yml

PLAY [all] *********************************************************************

TASK [2 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #2"
}

TASK [3 番目のタスク] ****************************************************************
ok: [node-c0706] => {
    "msg": "Task #3"
}

PLAY RECAP *********************************************************************
node-c0706                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/tags$

カテゴリー

目次

QooQ