はじめに
前の実験では、単一のコマンド(ansible ... -m ping)を実行しました。すばやい確認には便利ですが、Ansible の本当の力は Playbook にあります。
playbook は、自動化の手順を記述したテキストファイルです。通常のシェルスクリプトとは異なり、playbook では低レベルのコマンドを一つずつ指定するのではなく、通常、自動化の完了時に実現したい最終状態に焦点を当てます。
この「望ましい状態」を使って処理を記述する考え方は、Ansible で特に重要です。「これらのコマンドを正確に実行する」と指示する代わりに、自動化が完了した時点で成立しているべき状態を記述します。
Playbook は、人間が読みやすいデータ形式である YAML で記述します。そのため、自動化の内容を確認、共有、保守しやすくなります。
この実験では、次の処理を行う playbook を作成して、サーバーを Web サーバーとして構成します。
- 人気のある Web サーバーである Nginx をインストールする。
- Nginx サービスが 実行中 であることを確保する。
その後、この playbook を実行してローカルマシンを構成します。
Playbook ファイルを作成する
まず、playbook ファイルを作成します。慣例として、メインの playbook には site.yml という名前を付けることがよくあります。
最初に、プロジェクトディレクトリにいることを確認します。
cd ~/project
次に、テキストエディター nano を使って、site.yml という新しいファイルを作成して開きます。
nano site.yml
ファイルの先頭に、3 つのハイフンを入力します。これは YAML ドキュメントの開始を示します。
---
覚えておく YAML のルール:
- インデントは重要です! タブではなく、スペース(通常は 2 個)を使う必要があります。インデントが正しくないと、Ansible はエラーを表示します。
- こまめにファイルを保存してください。
nanoでは、Ctrl+Oを押してからEnterを押すと保存できます。次のステップで使うため、ファイルは開いたままにしておきます。
Play を定義する
1 つの playbook には、1 つ以上の「play」が含まれます。play は、実行するタスクと、それらを実行するホストのグループを対応付けます。
ホストグループとタスクの対応付けによって、1 つの playbook を 1 台のマシンから多数のマシンまで拡張して使えます。処理のロジックは 1 か所にまとめ、どのホストに適用するかは inventory で決めます。
site.yml ファイルで、--- の下に次の行を追加します。
---
- hosts: webservers
become: yes
コードの意味:
- hosts: webservers:inventory の[webservers]グループに登録されているすべてのサーバーで、この処理を実行するよう Ansible に指示します。become: yes:コマンドの前にsudoを付けて実行するのと同じような働きをします。ソフトウェアのインストールに必要な root 権限を Ansible に与えます。
- hosts が行の一番左から始まっていることを確認してください。ハイフンの前にスペースを入れないでください。
ファイルを保存します(Ctrl+O、Enter)。
インストールタスクを追加する
次に、Ansible に 何をするか を指示します。タスクのリストを追加して指定します。各タスクでは、モジュールを使用します。
ここでは Ubuntu を使用しているため、apt モジュールで Nginx をインストールします。
site.yml を次の内容になるように更新します。
---
- hosts: webservers
become: yes
tasks:
- name: Install nginx
apt:
name: nginx
state: present
コードの意味:
tasks::タスクのリストを開始します。- name: ...:人間が読むための説明です。playbook の実行時に画面へ表示されます。apt::aptモジュールを呼び出します。name: nginx:インストールするパッケージを指定します。state: present:ここが宣言的な処理の中心です。「今すぐインストールする」と指示するのではなく、「そのパッケージが存在する状態を確保する」と指定します。- パッケージが存在しない場合、Ansible がインストールします。
- すでに存在する場合、Ansible は何もしません。この性質を 冪等性(Idempotency) と呼びます。
冪等性は、構成管理の中心的な考え方です。同じ自動化を繰り返し安全に実行しても、副作用が重複せず、常に一貫した結果を期待できます。
インデントを確認してください:
tasksはbecomeと同じ位置にそろえます。- nameはインデントします(スペース 2 個)。aptはnameと同じ位置にそろえます。nameとstateはaptの下で、さらにインデントします。
ファイルを保存します。
サービスタスクを追加する
ソフトウェアをインストールするだけでは不十分です。プログラムが実行中であることも確保する必要があります。そのために service モジュールを使用します。
この処理では、playbook がシステムの状態を段階的に表現する方法も確認できます。1 つ目のタスクでパッケージの存在を確保し、2 つ目のタスクでサービスがアクティブであることを確保します。これらを組み合わせることで、ホストが最終的に到達すべき状態を記述できます。
site.yml のタスクのリストに、2 つ目のタスクを追加します。
---
- hosts: webservers
become: yes
tasks:
- name: Install nginx
apt:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
コードの意味:
service::systemctlのように、システムサービスを管理するモジュールです。state: started:サービスが実行中であることを確保します。サービスが停止している場合、Ansible が起動します。
重要: 2 つ目のタスクの - は、1 つ目のタスクの - と正確に同じ位置にそろえてください。
nano で保存して終了します(Ctrl+X、Y、Enter の順に押します)。
Playbook を実行する
いよいよ、自動化を実行します。
ansible-playbook コマンドを使用します。実行する playbook(site.yml)と、使用する inventory(hosts.ini)を指定します。
次のコマンドを実行します。
ansible-playbook site.yml -i hosts.ini
出力を確認してください。次の内容が表示されます。
- Gathering Facts:最初に Ansible がシステムの詳細情報を確認します。
- Install nginx:パッケージをインストールする必要があった場合、
changed(黄色)と表示されます。 - Start nginx:サービスを起動する必要があった場合、
changed(黄色)と表示されます。
まったく同じコマンドを 2 回目に実行すると、出力は緑色になり、ok と表示されます。これは、「すべてがすでに望ましい状態にあるため、何も変更しなかった」という意味です。
最後に、Nginx が実行中であることを手動で確認します。
systemctl status nginx
Active: active (running) と表示されることを確認してください。
まとめ
この実験では、最初の Ansible Playbook を作成しました。次の内容を学びました。
- YAML 構文:正しいインデントで playbook を構成する方法。
- Play:
hosts(実行先)とbecome(sudo を使用する設定)を定義する方法。 - タスク:
apt(インストール用)やservice(起動用)などのモジュールを使う方法。 - 冪等性(Idempotency):playbook を複数回実行しても、安全で安定した状態を保てるという考え方。
手動でコマンドを実行する段階から、「Infrastructure as Code」を定義する段階へ進みました。


