Ansibleのタグ設計入門|実行範囲を制御するタグ付けパターンとnever・alwaysの活用

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Ansible > Ansibleのタグ設計入門|実行範囲を制御するタグ付けパターンとnever・alwaysの活用
「設定ファイルの変更だけ適用したいのに、Playbookを走らせるとNginxが再起動してしまう」「デプロイのたびにDB初期化タスクも動いてしまって困る」——Ansible運用が軌道に乗り始めると、こうした「実行したくないタスクをどう除外するか」という問題に必ずぶつかります。

この悩みを解決するのがAnsibleのタグ(tag)機能です。タスクにタグを付けておくことで、実行時に「このタグのタスクだけ動かす」「このタグのタスクは除外する」という精密なコントロールが可能になります。

この記事では、タグの基本的な書き方から実行時フラグの使い方、特殊な動作をするnever・alwaysタグの設計パターン、そしてチームで使えるタグ命名規約まで、設計の視点で解説します。

この記事のポイント

・タグをタスクに付けて--tagsで実行範囲を絞ると、Playbook全体を走らせずに済む
・--skip-tagsを使えば指定タグのタスクだけを除外して実行できる
・neverタグは明示指定時のみ・alwaysタグは--tags使用時でも必ず動く
・タグ名は動詞型(install/configure/deploy)に統一するとチームで迷わない


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

タグがない現場で起きていること

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

1つのタスクに複数タグを付けるときはYAMLリスト形式を使います。

- 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"

注意点として、複数タグの指定はANDではなくORです。--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
Ansibleのタグ設計は、Playbookが大規模化・複雑化する前に整えておくことが重要です。後から付け替えると影響範囲の確認コストが大きくなります。最初のPlaybook設計時に「どの操作単位で実行を分けたいか」を洗い出してタグを設計しておきましょう。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Ansibleによるインフラ自動化の実践スキルを習得できるLinux Master Pro Seminar(Ansible特化)のご案内はこちらからどうぞ。独学では見落としがちな設計判断の軸を、現役エンジニアが直接指導します。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。