タグ

Playbook が大きい場合は、 Playbook で すべて を実行するのではなく、その特定の部分のみを実行できると便利な場合があります。 Ansible は、この理由により「tags:」属性をサポートします。

タグは、Ansible の 多く の構造に適用できます (下記の「タグの継承」を参照) が、 最も簡単なのは、個別のタスクを使用することです。以下は、 2 つのタスクに異なるタグを付ける例となります:

tasks:
- yum:
    name:
    - httpd
    - memcached
    state: present
  tags:
  - packages

- template:
    src: templates/src.j2
    dest: /etc/foo.conf
  tags:
  - configuration

Playbook を実行する場合は、次の 2 つの方法でタグに基づいてタスクをフィルタリングできます。

  • コマンドラインで、--tags オプションまたは --skip-tags オプション使用
  • Ansible 構成設定で、TAGS_RUN オプションおよび TAGS_SKIP オプションの使用

たとえば、非常に長い Playbook の「構成」と「パッケージ」の部分だけを実行する場合は、 コマンドラインで --tags オプションを使用できます。

ansible-playbook example.yml –tags “configuration,packages”

一方、特定のタグ付きタスク なし で Playbook を実行する場合は、 --skip-tags コマンドラインオプションを使用できます。

ansible-playbook example.yml –skip-tags “packages”

--list-tasks と組み合わせることで、 --tags または --skip-tags で実行するタスクを確認できます。

ansible-playbook example.yml –tags “configuration,packages” –list-tasks

Warning

  • ファクト収集は、デフォルトで「always」でタグ付けされます。タグを適用して、 --tags で別のタグを使用するか、 --skip-tags で同じタグを使用する場合にのみ省略されます。

タグの再使用

複数のタスクに同じタグを適用できます。--tags コマンドラインオプションを使用してプレイを実行すると、 そのタグ名を持つすべてのタスクが実行されます。

この例では、タグ「ntp」がある複数のタスクをタグ付けしています:

---
# file: roles/common/tasks/main.yml

- name: be sure ntp is installed
  yum:
    name: ntp
    state: present
  tags: ntp

- name: be sure ntp is configured
  template:
    src: ntp.conf.j2
    dest: /etc/ntp.conf
  notify:
  - restart ntpd
  tags: ntp

- name: be sure ntpd is running and enabled
  service:
    name: ntpd
    state: started
    enabled: yes
  tags: ntp

タグの継承

tags: をプレイに追加、または静的にインポートされたタスクおよびロールに追加すると、 含まれているすべてのタスクにそのタグを追加します。これは タグの継承 * と呼ばれています。タグの継承は、 ``include_role`` や ``include_tasks`` などの動的な包含には *適用されません

tags: 属性をタスク以外の構造に適用すると、 Ansible はタグ属性を処理して、その属性に含まれるタスクのみに適用します。 タスク以外の場所にタグを付けるのは利便性のためであり、 個別にタスクにタグを付ける必要はありません。

この例では、2 つのプレイのすべてのタスクにタグを付けています。最初のプレイはすべてのタスクに「bar」のタグが付けられており、 2 番目のプレイにはすべてのタスクに「foo」のタグが付けられています:

- hosts: all
  tags:
  - bar
  tasks:
    ...

- hosts: all
  tags: [ foo ]
  tasks:
    ...

また、roles でインポートされたタスクにタグを適用することもできます:

roles:
  - role: webserver
    vars:
      port:5000
    tags: [ web, foo ]

import_role: ステートメントおよび import_tasks: ステートメントに追加します:

- import_role:
    name: myrole
  tags: [ web, foo ]

- import_tasks: foo.yml
  tags: [ web, foo ]

このタグはすべて、指定されたタグをプレイ、インポートされたファイル、またはロール内の「各」タスクに適用するため、 対応するタグを使用して Playbook が呼び出されたときに、 このタスクを選択的に実行できます。

タグは、依存関係チェーン 適用されます。タグを依存ロールのタスクに継承するには、 タグを、ロール内のすべてのタスクではなく、 ロール宣言または静的インポートに適用する必要があります。

「これらのタグのみをインポートする」方法はありません。 このような機能を探している場合は、おそらくより小さなロール/インクルードに分割する必要があります。

上記の情報は、include_tasks または他の動的インクルードには適用されません。 インクルードに適用される属性は、 インクルード自体にのみ影響するためです。

--list-tasks オプションを指定して ansible-playbook を実行すると、 タスク、ロール、および静的インポートに適用されるタグを確認できます。--list-tags オプションで、 使用可能なすべてのタグを表示できます。

Note

上記の情報は、include_tasksinclude_roles、 またはその他の動的インクルードには適用されません。これらのいずれかに適用されるタグは、 インクルード自体にのみタグを付けます。

動的包含を目的としたタスクとロールでタグを使用するには、 必要なすべてのタスクにタスクレベルで明示的にタグを付ける必要があります。 または block: を使用して一度に複数のタスクにタグを付けることができます。インクルード自体にも、 タグを付ける必要があります。

次に、block ステートメントを使用してロールタスクにタグ mytag を付け、 動的インクルードで使用する例を示します。

Playbook ファイル:

- hosts: all
  tasks:
  - include_role:
      name: myrole
    tags: mytag

ロールタスクファイル:

- block:
  - name:First task to run
    ...
  - name:Second task to run
    ...
  tags:
  - mytag

特別なタグ

特に省略しない限り、常にタスクを実行する特別な always タグがあります (--skip-tags always)。

例:

tasks: - debug:

msg: “Always runs”

tags: - always

  • debug:

    msg: “runs when you use tag1”

    tags: - tag1

New in version 2.5.

他にも、特別なタグとして never があります。 これは、タグが特に要求されない限り、タスクを実行しないようにします。

例:

tasks:
  • debug: msg=”{{ showmevar }}” tags: [ never, debug ]

この例では、タスクは、debug タグまたは never タグが明示的に要求された場合に限り実行されます。

タグには、タグ付きタグなしすべて の 3 つの特別なキーワードがあります。 これは、それぞれ「タグ付きのみ」、「タグなしのみ」、または「すべてのタスク」を実行します。

デフォルトでは、Ansible は --tags all が指定されている時のように実行されます。

See also

Playbook について
Playbook の概要
ロール
ロール別の Playbook の組織
ユーザーメーリングリスト
ご質問はございますか。 Google Group をご覧ください。
irc.freenode.net
IRC チャットチャンネル #ansible