Ansible「Could not match supplied host pattern」エラーの修正 — インベントリにホストが一致しない

beginner🔧 Ansible2026-03-24| Ubuntu 20.04/22.04、CentOS 7/8、macOS 上の Ansible 2.9 以降 — INI および YAML インベントリ形式

Error Message

[WARNING]: Could not match supplied host pattern, ignoring: webservers [WARNING]: No hosts matched, nothing to do
#ansible#インベントリ#ホスト#パターン#ini

何が起きているか

プレイブックを実行すると、Ansibleが次のメッセージを表示します:

[WARNING]: Could not match supplied host pattern, ignoring: webservers
[WARNING]: No hosts matched, nothing to do

プレイブックはタスクを1つも実行せずに即座に終了します。Ansibleはインベントリファイルを見つけましたが、プレイブックの hosts: フィールドで参照しているホストグループまたはホスト名を見つけられませんでした。

ほとんどの場合、原因は名前の不一致です。タイポ、誤ったインベントリパス、またはインベントリファイルの構造上の問題です。どこを確認すればよいかわかれば、大抵2分で解決できます。

デバッグ手順

ステップ1 — Ansibleがインベントリで実際に認識しているものを確認する

まずここから始めましょう。Ansibleにインベントリから解析できるすべてのホストとグループを列挙させます:

# 特定のインベントリファイルを使用する場合
ansible-inventory -i inventory.ini --list

# ディレクトリを使用する場合
ansible-inventory -i inventories/production --list

JSONの出力を確認します。webservers(または参照したグループ名)が存在しない場合、Ansibleは本当にそれを見つけられていません。ファイル自体に問題があるか、間違ったファイルを指定しています。

見やすいツリー形式で確認したい場合は --graph を使用します:

ansible-inventory -i inventory.ini --graph

正常なグループの表示はこのようになります:

@all:
  |--@webservers:
  |  |--web01.example.com
  |  |--web02.example.com
  |--@ungrouped:

ステップ2 — プレイブックが参照している内容を確認する

プレイブックを開いて hosts: の行を確認します:

---
- name: Deploy web app
  hosts: webservers
  tasks:
    ...

この値は、インベントリ内のグループ名またはホスト名と完全に一致している必要があります。大文字・小文字も区別されます。スペースも不可です。必要であれば1文字ずつ確認してください — 1文字でも違えばこのエラーが発生します。

ステップ3 — 正しいインベントリファイルを指定しているか確認する

最もよくある原因は、-i を指定せずにプレイブックを実行し、Ansibleが暗黙的に /etc/ansible/hosts にフォールバックしてしまうことです。そのファイルは通常空か、自分のグループが含まれていません。

# 誤り — デフォルトの /etc/ansible/hosts を使用してしまう
ansible-playbook deploy.yml

# 正しい — インベントリを明示的に指定する
ansible-playbook -i inventory.ini deploy.yml
ansible-playbook -i inventories/production deploy.yml

毎回 -i を入力する手間を省くには、ansible.cfg にパスを一度設定します:

[defaults]
inventory = ./inventory.ini

解決策

修正1 — インベントリファイルの構造を修正する

[webservers] グループを含む有効なINIインベントリはこのようになります:

[webservers]
web01.example.com
web02.example.com ansible_user=ubuntu

[dbservers]
db01.example.com ansible_user=centos ansible_port=22

グループのマッチングを気づかないうちに壊してしまう4つのミス:

  • ブラケット内の余分なスペース:[ webservers ] — Ansibleはこれを別の文字列として扱い、グループ webservers とは認識されません
  • タイポ:インベントリでは [webserver]、プレイブックでは hosts: webservers
  • グループヘッダーより前にホストが記述されている — [ungrouped] に入ってしまいます
  • YAMLのインベントリ構文を .ini ファイルに誤って使用している(またはその逆)

YAMLインベントリを使いたい場合は、同等の構造はこのようになります:

all:
  children:
    webservers:
      hosts:
        web01.example.com:
        web02.example.com:
          ansible_user: ubuntu
    dbservers:
      hosts:
        db01.example.com:
          ansible_user: centos

修正2 — hostsパターンを正確に一致させる

インベントリに実際に存在するパターンを使うようにプレイブックを修正します:

---
- name: Deploy web app
  hosts: webservers     # インベントリと完全に一致している必要がある
  become: true
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

Ansibleでは複数のグループを同時に対象にするためのパターン指定がいくつかあります:

hosts: all                    # インベントリ内の全ホスト
hosts: webservers,dbservers   # 複数グループ
hosts: webservers:&staging    # AND条件(webservers かつ staging)
hosts: webservers:!dbservers  # webservers から dbservers を除外

修正3 — ansible.cfgにインベントリパスを追加する

プレイブックの隣にプロジェクトレベルの ansible.cfg を置けば、以降 -i を指定する必要はありません:

[defaults]
inventory = ./inventory.ini
remote_user = ubuntu
host_key_checking = False

Ansibleはカレントディレクトリの ansible.cfg を自動的に読み込みます。これにより -i なしで ansible-playbook deploy.yml を実行しても正しく動作するようになります。

確認方法

サーバーに手を加える前に実行しておくべき3つのコマンドです:

# グループが正しく表示されることを確認
ansible-inventory -i inventory.ini --graph

# プレイブックのドライラン(変更は適用されない)
ansible-playbook -i inventory.ini deploy.yml --check

# 対象となるホストを一覧表示する
ansible-playbook -i inventory.ini deploy.yml --list-hosts

--list-hosts が成功した場合の表示はこのようになります:

playbook: deploy.yml

  play #1 (webservers): Deploy web app
    pattern: ['webservers']
    hosts (2):
      web01.example.com
      web02.example.com

それでもホスト数が0だったり警告が出る場合は、ステップ1に戻ってください。

ヒント

webservers:&production:!disabled のような複雑なパターンは、特にインベントリが大きくなるほど間違えやすいです。プレイブックにパターンを記述する前に、ToolCraftのRegex Tester でロジックを確認しています。ホストリストを貼り付けて、パターンが期待通りにマッチするかテストできます。データはアップロードされず完全にブラウザ上で動作するため、内部サーバー名を含むリストを扱う際も安心です。

教訓

  • プロジェクトディレクトリ外から実行する場合は常に -i を明示的に指定するか、ansible.cfg を設定してインベントリが常に正しく解決されるようにしましょう。
  • プレイブックが予期しない動作をするときはまず ansible-inventory --graph を実行する — 自分が書いたと思っている内容ではなく、Ansibleが実際に解析した内容が表示されます。
  • INIのグループヘッダーはホワイトスペースに敏感です — Ansibleにとって [webservers][ webservers ] は別の文字列です。
  • 重要な実行前には毎回 --list-hosts を使う — 安全な読み取り専用のチェックで、実際のサーバーにタスクが触れる前にターゲットを確認できます。

Related Error Notes