基本パターンとワイルドカードパターンを使用したホストの選択
このステップでは、Ansible 自動化で特定のホストをターゲットにするための基本を学びます。その核心となるのは、管理対象のサーバーをリストする Ansible インベントリファイルと、Playbook 内の hosts ディレクティブであり、これによりタスクセットを実行する対象のサーバーを指定します。まず Ansible をインストールし、基本的なインベントリと Playbook を作成してから、グループ名とワイルドカードパターンを使用してホストを選択する方法を探求します。
まず、環境に Ansible がインストールされていることを確認しましょう。Ansible はデフォルトではインストールされていないため、DNF パッケージマネージャーを使用してインストールする必要があります。ansible-core パッケージは、ansible-playbook を含む、Ansible の基本的なコマンドラインツールを提供します。次のコマンドを実行してください。
sudo dnf install -y ansible-core
以下のような出力が表示されるはずです。
...
Installed:
ansible-core-2.16.x-x.el9.x86_64
...
Complete!
次に、ファイルを整理するために、この演習用の専用ディレクトリを作成しましょう。このステップの以降のすべての操作は、この新しいディレクトリ内で行われます。
mkdir -p ~/project/ansible_patterns
cd ~/project/ansible_patterns
ここで、インベントリファイルを作成します。インベントリは、Ansible コマンド、モジュール、およびタスクが操作するホストとホストのグループを定義するテキストファイルです。ここでは、そのシンプルさから INI フォーマットを使用します。
nano エディタを使用して inventory という名前のファイルを作成します。
nano inventory
inventory ファイルに以下の内容を追加します。これは、それぞれ 2 つのホストを含む webservers と dbservers という 2 つのグループを定義しています。
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.lab.net
db2.lab.net
ファイルを保存し、Ctrl+X、Y、Enter の順に押して nano を終了します。
インベントリの準備ができたので、簡単な Playbook を作成しましょう。この Playbook は ansible.builtin.debug モジュールを使用してメッセージを表示し、タスクがどのホストで実行されているかを確認します。これは、システムに変更を加えることなくホストパターンをテストするのに最適な方法です。
playbook.yml という名前の新しいファイルを作成します。
nano playbook.yml
以下の YAML コンテンツを追加します。最初は webservers グループのすべてのホストをターゲットにしています。
---
- name: Test Host Patterns
hosts: webservers
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
エディタを保存して終了します。次に、ansible-playbook を使用して Playbook を実行します。-i フラグはカスタムインベントリファイルを指定します。
ansible-playbook playbook.yml -i inventory
出力は次のようになります。
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
PLAY RECAP *********************************************************************
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ご覧のとおり、webservers グループのホストのみがターゲットにされました。次に、ワイルドカード (*) を使用するように Playbook を変更しましょう。ワイルドカードは、より柔軟なパターンマッチングを可能にします。
playbook.yml を編集し、hosts 行を hosts: "*.lab.net" に変更します。ワイルドカードを含むパターンは引用符で囲むことを忘れないでください。
---
- name: Test Host Patterns
hosts: "*.lab.net"
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Playbook を再度実行します。
ansible-playbook playbook.yml -i inventory
以下のような出力が表示されるはずです。
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
今回は、プレイは .lab.net で終わるホストでのみ実行されました。最後に、特別なキーワード all を使用して、インベントリで定義されたすべてのホストをターゲットにしましょう。
playbook.yml をもう一度編集し、hosts 行を hosts: all に変更します。
---
- name: Test Host Patterns
hosts: all
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Playbook を実行して結果を確認します。
ansible-playbook playbook.yml -i inventory
出力には、すべてのホストがターゲットになっていることが示されます。
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook は現在、インベントリの 4 つすべてのホストで実行されており、all パターンの強力さを示しています。