この悩みを解決するのがAnsibleのタグ(tag)機能です。タスクにタグを付けておくことで、実行時に「このタグのタスクだけ動かす」「このタグのタスクは除外する」という精密なコントロールが可能になります。
この記事では、タグの基本的な書き方から実行時フラグの使い方、特殊な動作をするnever・alwaysタグの設計パターン、そしてチームで使えるタグ命名規約まで、設計の視点で解説します。
この記事のポイント
・タグをタスクに付けて--tagsで実行範囲を絞ると、Playbook全体を走らせずに済む
・--skip-tagsを使えば指定タグのタスクだけを除外して実行できる
・neverタグは明示指定時のみ・alwaysタグは--tags使用時でも必ず動く
・タグ名は動詞型(install/configure/deploy)に統一するとチームで迷わない
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
タグがない現場で起きていること
Ansibleを使い始めて最初のうちは、ansible-playbook site.yml をそのまま全件実行していても問題になりません。しかし台数が増え、Playbookが複雑になってくると、「全件実行」の代償が見えてきます。典型的な問題は次のようなものです。
・設定ファイルを1行変えただけなのに、パッケージのダウンロードと再起動が発生する
・デプロイ作業(アプリのコード更新)とインフラ初期化(ユーザー作成・鍵配布)が混在しているため、デプロイのたびに初期化タスクも走る
・本番作業中に「今は絶対に再起動できない」という状況でPlaybookを実行できない
タグはこれらを解決する手段です。タスクに意味のあるラベルを付けておくことで、実行時に「どのタスクを動かすか」を呼び出し側から指定できるようになります。
タグの基本構文——タスク・role・playへの付け方
1. タスクへのタグ付け
最も基本的な使い方は、個別タスクへのtags キーワードです。- name: Nginxをインストールする ansible.builtin.dnf: name: nginx state: present tags: install - name: Nginxの設定ファイルを配置する ansible.builtin.template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf tags: configure - name: Nginxを起動する ansible.builtin.service: name: nginx state: started enabled: true tags: deploy
- name: Nginxの設定ファイルを配置する ansible.builtin.template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf tags: - configure - nginx
2. playへのタグ付け
play全体にタグを付けると、配下のすべてのタスクにそのタグが継承されます。複数のplayがあるsite.yml でWebサーバー関連のplayだけを走らせたい場合に便利です。- name: Webサーバーのセットアップ hosts: webservers tags: webserver tasks: - name: Nginxをインストールする ansible.builtin.dnf: name: nginx state: present
3. roleへのタグ付け
playbookからroleを呼び出すときに、roleの全タスクへタグをまとめて付けられます。- hosts: appservers roles: - role: nginx tags: nginx - role: app tags: app
--tags nginx でNginx roleのタスクだけを実行できます。--tags と --skip-tags による実行範囲の制御
タグを付けたら、実行時のフラグで範囲を指定します。1. --tags で指定タグのみ実行
# configureタグのタスクだけを実行する $ ansible-playbook site.yml --tags configure # 複数タグを指定(いずれかに一致するタスクが実行される) $ ansible-playbook site.yml --tags "configure,nginx"
--tags "configure,nginx" は「configureかつnginxのタスク」ではなく「configureまたはnginxのタスク」が実行されます。2. --skip-tags で指定タグを除外
# restartタグのタスクを除外して実行する $ ansible-playbook site.yml --skip-tags restart # メンテナンス中のためDBマイグレーションだけ除外する例 $ ansible-playbook site.yml --skip-tags db_migrate
3. 利用可能なタグを確認する
Playbook内のタグ一覧を実行前に確認できます。チームへの共有やCI/CDの整備にも使えます。$ ansible-playbook site.yml --list-tags playbook: site.yml play #1 (webservers): Webサーバーのセットアップ TAGS: [webserver] TASK TAGS: [configure, deploy, install, nginx, restart, webserver]
never・always タグの特殊動作と設計パターン
AnsibleにはOrdinaryなタグとは動作が異なる2つの特殊タグがあります。1. never タグ——明示指定しないと実行されない
never タグが付いたタスクは、--tags never を明示指定しない限り実行されません。通常のPlaybook全件実行でも動きません。デバッグ用のタスクや、本番では絶対に走らせたくない危険な処理(テストデータの全削除など)の隔離に使います。- name: テスト用データを全件削除する(本番では絶対実行しない) ansible.builtin.command: mysql testdb -e "DROP TABLE users;" tags: - never - teardown - name: デバッグ情報を出力する ansible.builtin.debug: var: hostvars[inventory_hostname] tags: - never - debug
never と別のタグを組み合わせておくと、--tags teardown で明示的に実行できます。never 単体でもタグ指定で動かせますが、意図を名前に込めた方が運用上の安全を確保できます。2. always タグ——--tags 使用時でも必ず実行される
--tags xxx を指定すると、他のタグのタスクは実行されませんが、always タグが付いたタスクは必ず実行されます。Playbookの前提条件チェックや変数の検証など、どんな実行時でも省けないセットアップ処理に適しています。- name: 必須変数が定義されているか確認する ansible.builtin.assert: that: - app_version is defined - db_password is defined fail_msg: "app_versionとdb_passwordは必須変数です" tags: always - name: Nginxをインストールする ansible.builtin.dnf: name: nginx state: present tags: install
--tags install を指定しても assert タスクは必ず実行されます。変数不足のまま本番適用が走る事故を防げます。チームで使えるタグ命名規約と設計のベストプラクティス
タグはチーム全員が使うものなので、命名が散らかると「どのタグを使えばいいか」を毎回調べる手間が生まれます。以下に2つの命名パターンと選択指針を示します。1. 動詞型命名(推奨)
「何をするか」に着目した命名です。ライフサイクル操作を軸にするため、どのサービスにも応用できます。・install — パッケージのインストール
・configure — 設定ファイルの配置・変更
・deploy — アプリのデプロイ
・restart — サービスの再起動
・cleanup — 一時ファイルの削除や後始末
チームで最初にこの粒度を合意しておくことが大切です。
start と restart を別々に定義するか、restart に統一するかといった判断をドキュメント化しておきましょう。Ansibleによるインフラ自動化の実践を体系的に学ぶ際も、このタグ設計は基礎知識として必要になります。2. リソース型命名
「何に対して操作するか」に着目した命名です。サービスごとにタスクを制御したい場合に向いています。・nginx — Nginx関連タスク
・mysql — MySQL関連タスク
・app — アプリケーション本体
・os — OSレベルの設定(ユーザー・ネットワーク等)
3. 命名規約の選択指針
| ユースケース | 向いている命名 | 実行例 |
|---|---|---|
| 「設定変更だけ適用」が頻繁 | 動詞型 | ansible-playbook site.yml --tags configure |
| 「Nginx関連だけ更新」が頻繁 | リソース型 | ansible-playbook site.yml --tags nginx |
| 操作軸とリソース軸の両方が必要 | 動詞型+リソース型を1タスクに付与 | ansible-playbook site.yml --tags "configure,nginx" |
--tags configure で全サービスの設定変更を、--tags nginx でNginx関連のすべての操作を実行できます。タグ設計でよくある失敗と対策
1. gather_facts が除外されてタスクが失敗する
--tags xxx を指定すると、デフォルトでは gather_facts(ホスト情報の収集)もスキップされる場合があります。ansible_os_family や ansible_distribution などの変数を参照しているタスクが失敗する原因になります。対策としては、Playbookの冒頭に変数検証タスクを置いて
tags: always で保護するか、gather_facts 相当のセットアップ処理に always を付けておくことが確実です。2. handlers はタグのフィルタリング対象外
handlers はnotify が発生した時点でタスク終了後に実行されますが、タグによるフィルタリングの対象ではありません。--tags configure でタスクを走らせても、そのタスクが handler(例: notify: Restart Nginx)をトリガーした場合、handlerは実行されます。「タグを指定したのに再起動が走った」と驚くケースがあるので、handlers の発火条件は設計段階で確認しておきましょう。3. タグが細かすぎると管理コストが増える
「インストール手順を3ステップに分けてそれぞれ別タグにする」という設計は、組み合わせが複雑になりすぎます。タグの粒度は「よくある運用パターンに合わせた単位」に留め、細かすぎないことが重要です。目安は1つのPlaybookにつき10個前後。それを超えてきたら、タグの整理かPlaybookの分割を検討するタイミングです。本記事のまとめ
| やりたいこと | 設定・コマンド |
|---|---|
| タスクにタグを付ける | tags: configure または tags: [configure, nginx] |
| 指定タグのタスクだけ実行 | ansible-playbook site.yml --tags configure |
| 指定タグのタスクを除外 | ansible-playbook site.yml --skip-tags restart |
| Playbookのタグ一覧を確認 | ansible-playbook site.yml --list-tags |
| 明示指定時のみ実行するタスク | tags: [never, teardown] |
| --tags時でも必ず実行させるタスク | tags: always |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:Ansibleのクロスプラットフォームrole設計|ansible_os_familyでRHEL・Ubuntu対応のroleを作る方法
- この記事の属するカテゴリ:Ansibleへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます