こんにちは!インフラエンジニアの先輩です。
日々のサーバー構築や設定変更、手作業でポチポチとコマンドを叩いていませんか?「あっちのサーバーは設定したのに、こっちのサーバーには設定し忘れた……」なんてヒヤッとした経験、誰しも一度や二度はあるはずです。
そんなインフラ管理の絶望から私たちを救い出してくれるのが、構成管理ツール「Ansible(アンシブル)」です。
今回は、Ansibleの心臓部である「Playbook(プレイブック)」の書き方について、YAMLの基本から実戦で使えるサンプルコードまで、徹底的に解説していきます。これをマスターすれば、あなたのインフラ管理は劇的に楽になり、手作業のミスとは永久におさらばできますよ。
—
1. AnsibleとPlaybookってそもそも何をするもの?
Ansibleは、一言で言うと「エージェントレスの自動化ツール」です。
管理対象のサーバーに特別な常駐プログラム(エージェント)を入れる必要がなく、手元のPCからSSH経由でサクッとサーバーの望ましい状態(Desired State)を作り上げてくれます。
そのAnsibleに「どのサーバーに、どんな手順で、何をするか」を指示するための台本(シナリオ)がPlaybookです。YAMLという人間にも読みやすい形式で記述するのが特徴です。
なぜ「シェルスクリプト」じゃダメなの?
「シェルスクリプトでも自動化できるじゃん」と思うかもしれません。しかし、シェルスクリプトで「Nginxがインストールされていなければインストールし、起動していなければ起動する」という処理を書こうとすると、if文だらけの複雑なコードになりがちです(そして何度も実行すると壊れる)。
一方、AnsibleのPlaybookは「冪等性(べきとうせい)」が担保されています。これは、「何度同じPlaybookを実行しても、サーバーの状態は同じ(正しい)結果になり、すでに設定済みの部分は安全にスキップされる」という、インフラ管理において神のようにありがたい性質です。
—
2. 開発環境のセットアップ(最短ルート)
まずは手元でAnsibleを動かせる環境を作りましょう。MacやLinuxであれば、Pythonのパッケージ管理システムであるpipを使うのが一番確実です。
Ansibleのインストール
pip install ansible
インストール確認
ansible –version
これだけで準備は完了です。コンテナや複雑なミドルウェアのインストールは不要。Pythonさえあれば、今すぐ世界を自動化できます。
—
3. 陥りやすい罠!YAMLのインデント(インデントエラー)の鉄則
初心者エンジニアがAnsible(Playbook)で最初に直面する最大の壁、それが「YAMLの構文エラー(IndentationError)」です。
YAMLは見た目がシンプルゆえに、ちょっとしたスペースのズレで容赦なくエラーを吐きます。以下の鉄則を体に叩き込んでください。
1. タブ(Tab)は絶対に使わない!(必ず半角スペースを使用する)
2. インデントは基本「2文字」または「4文字」で統一する(途中で混ぜない。迷ったら2文字がおすすめ)
3. コロン(`:`)の後には必ず半角スペースを入れる(例: `name: サーバーのセットアップ`)
これだけ守れば、YAMLのパースエラーの9割は防げます。
—
4. 【実践】Hello Worldとしての基本Playbook
それでは、実際に動くPlaybookを書いてみましょう。
今回は、ローカルの自分自身(localhost)に対して、Apache(httpd)をインストールし、カスタムの「Hello World」ページを配置するという実用的なタスクを実行します。
以下の内容を `site.yml` という名前で保存してください。
Playbookの全体像(`site.yml`)
—
=====================================================================
Playbook名: Webサーバーの基本構築サンプル
概要: localhostに対してHTTPDをインストールし、静的ページを配置する
=====================================================================
- name: 開発環境のWebサーバー自動構築
hosts: localhost # 対象となるホスト(今回は自分自身)
connection: local # SSHではなくローカル実行を指定
become: yes # root権限(sudo)に昇格して実行する
# 1. サーバーで事前に定義しておきたい変数
vars:
web_message: “こんにちは!Ansibleの世界へようこそ!”
# 2. 実際に実行するタスクのリスト
tasks:
- name: 1. Apache (httpd) パッケージがインストールされていること
ansible.builtin.yum:
name: httpd
state: present
- name: 2. Apacheサービスが起動しており、自動起動が有効であること
ansible.builtin.service:
name: httpd
state: started
enabled: yes
- name: 3. カスタムのindex.htmlを配置する
ansible.builtin.copy:
content: |
{{ web_message }}
このページはAnsibleによって自動生成されました。
dest: /var/www/html/index.html
owner: root
group: root
mode: ‘0644’
—
5. 構成要素の解説:これがPlaybookの骨組みだ!
先ほどのコードを細かく分解して、プロの視点で解説します。
- `hosts`: どこに対してこの処理を行うかを指定します。今回は `localhost` ですが、実務では `web_servers` のようなグループ名を指定します。
- `become: yes`: システムの奥深くに触れる設定(パッケージのインストールやサービスの有効化)には管理者権限が必要です。これを宣言するだけで、内部でスマートに `sudo` を実行してくれます。
- `tasks`: 実行する処理を上から順番に並べたものです。
- モジュール(`ansible.builtin.yum`, `ansible.builtin.service` など): Ansibleの最大の武器です。「どうやってインストールするか(コマンド)」ではなく、「どういう状態にしたいか(状態の宣言)」を記述します。
- `state: present` → 「存在していなければインストールする(あれば何もしない)」
- `state: started` → 「起動していなければ起動する(起動中なら何もしない)」
まさに、これが冪等性の正体です。
—
6. 実行と動作確認
書いたPlaybookを実際に動かしてみましょう。以下のコマンドを実行します。
ansible-playbook site.yml
実行すると、ターミナルにカラフルなログが流れます。
PLAY [開発環境のWebサーバー自動構築]
TASK [Gathring Facts]
ok: [localhost]
TASK [1. Apache (httpd) パッケージがインストールされていること]
changed: [localhost]
TASK [2. Apacheサービスが起動しており、自動起動が有効であること]
changed: [localhost]
TASK [3. カスタムのindex.htmlを配置する]
changed: [localhost]
PLAY RECAP
localhost : ok=4 changed=3 unreachable=0 failed=0 skipped=0
- `changed`: 実際にサーバーの状態を変更したタスク
- `ok`: すでに望ましい状態だったため、何もしなかった(安全にスキップされた)タスク
ここで、もう一度同じコマンド(`ansible-playbook site.yml`)を実行してみてください。
今度は、すべてのタスクが `ok` に変わり、`changed` が 0 になるはずです。これが「何度実行しても安全(冪等)」という感動の瞬間です。
—
7. おわりに:明日から使える自動化の第一歩
今回は、Ansible Playbookの基本構造とYAMLの作法、そして実際に動くサンプルコードを通じて、インフラ自動化の基礎を解説しました。
「サーバーの構築手順をドキュメントに書いて、手作業でコピペする」という泥臭い時代はもう終わりです。Playbookという「コード化された台本」があれば、ボタン一つでいつでも何度でも、寸分狂わぬクオリティでインフラを再現できます。
これをマスターすれば、あなたの毎日の作業は劇的に楽になり、残業時間も減り、何より夜間に「あのサーバーの設定、大丈夫だっけ……」と冷や汗をかくことがなくなります。
さあ、次は複数のサーバーグループに対するグループ変数の適用や、ロール(Roles)を使った高度なモジュール分割に挑戦してみましょう。インフラエンジニアの新しい扉が、今、開きます!