最初の Playbook を作成する

AnsibleBeginner
オンラインで実践に進む

はじめに

前の実験では、単一のコマンド(ansible ... -m ping)を実行しました。すばやい確認には便利ですが、Ansible の本当の力は Playbook にあります。

playbook は、自動化の手順を記述したテキストファイルです。通常のシェルスクリプトとは異なり、playbook では低レベルのコマンドを一つずつ指定するのではなく、通常、自動化の完了時に実現したい最終状態に焦点を当てます。

この「望ましい状態」を使って処理を記述する考え方は、Ansible で特に重要です。「これらのコマンドを正確に実行する」と指示する代わりに、自動化が完了した時点で成立しているべき状態を記述します。

Playbook は、人間が読みやすいデータ形式である YAML で記述します。そのため、自動化の内容を確認、共有、保守しやすくなります。

この実験では、次の処理を行う playbook を作成して、サーバーを Web サーバーとして構成します。

  1. 人気のある Web サーバーである Nginx をインストールする。
  2. 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

出力を確認してください。次の内容が表示されます。

  1. Gathering Facts:最初に Ansible がシステムの詳細情報を確認します。
  2. Install nginx:パッケージをインストールする必要があった場合、changed(黄色)と表示されます。
  3. Start nginx:サービスを起動する必要があった場合、changed(黄色)と表示されます。

まったく同じコマンドを 2 回目に実行すると、出力は緑色になり、ok と表示されます。これは、「すべてがすでに望ましい状態にあるため、何も変更しなかった」という意味です。

最後に、Nginx が実行中であることを手動で確認します。

systemctl status nginx

Active: active (running) と表示されることを確認してください。

まとめ

この実験では、最初の Ansible Playbook を作成しました。次の内容を学びました。

  1. YAML 構文:正しいインデントで playbook を構成する方法。
  2. Play:hosts(実行先)と become(sudo を使用する設定)を定義する方法。
  3. タスク:apt(インストール用)や service(起動用)などのモジュールを使う方法。
  4. 冪等性(Idempotency):playbook を複数回実行しても、安全で安定した状態を保てるという考え方。

手動でコマンドを実行する段階から、「Infrastructure as Code」を定義する段階へ進みました。