「コマンドの羅列」から「あるべき姿の定義」へ。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、インベントリと設定ファイル(ansible.cfg)を整備して、ターゲットサーバーを快適に操作する環境を整えました。
しかし、まだ私たちは「ansible ... -m ping」のように、コマンドラインで単発の命令を送っているに過ぎません。
実際のサーバー構築では、「Webサーバーを入れて、設定ファイルを書き換えて、起動して、ファイアウォールを開ける」といった一連の流れが必要です。
これを実現するのが、Ansibleの設計図である「Playbook(プレイブック)」です。
先生、ついにPlaybookですね!
でも、ネットでサンプルを見ると、インデントだらけで読みづらくて…。
「YAML」って言語なんですか? スペースの数とか間違えると動かないって聞いてビビってます。
怖がらなくて大丈夫よ。
YAML(ヤムル)は「人間が読み書きしやすい」ように作られたデータ形式なの。
ルールさえ覚えれば、シェルスクリプトよりも遥かに分かりやすくて、ミスも減るわ。
今回は、Apacheを自動インストールするPlaybookを書きながら、YAMLの書き方と主要な「モジュール」の使い方をマスターしましょう!
本記事では、AlmaLinux 9 をベースに、Playbookの基本構造、YAMLフォーマットの鉄則、そして実務で必ず使う主要モジュールの操作方法について徹底解説します。
🚀 Ansible完全攻略講座(バックナンバー)
現在地:【第3回】Playbookの基礎。YAMLの作法と「モジュール」によるタスク定義
- 【第1回】構成管理の革命児!エージェントレスで始める自動化入門&環境構築
- 【第2回】ターゲットを支配せよ。インベントリの書き方とansible.cfgの最適解
- 【第3回】Playbookの基礎。YAMLの作法と「モジュール」によるタスク定義
- 【第4回】変数を使いこなせ。Jinja2テンプレートによる設定ファイルの動的生成
- 【第5回】コードを整理整頓。Rolesディレクトリ構成と再利用性の最大化
- 【第6回】秘密情報の管理と通知。Ansible Vaultの暗号化とHandlers
- 【第7回】実践演習。LAMP環境(Apache+MySQL+PHP)をボタン一つで構築する
- 【第8回】GUIで管理。Ansible AWX(Tower)入門とCI/CDパイプラインへの統合
第1章:Playbook とは何か?
Playbook(プレイブック)は、Ansibleにおける「手順書」です。
「どのサーバーに(Hosts)」「何をさせるか(Tasks)」を記述したテキストファイルで、拡張子は .yml または .yaml です。
Ad-Hocコマンドとの決定的な違い
- Ad-Hocコマンド (
ansible):
ansible all -m pingのように、コマンドラインで「今すぐ1つのことを確認したい」場合に使います。
手軽ですが、履歴に残りにくく、複雑な手順(条件分岐やループなど)を実行するのには向きません。 - Playbook (
ansible-playbook):
「いつもの構築手順」をファイルとして保存します。
バージョン管理(Git)ができ、コメントを残すことができ、誰が実行しても同じ結果になります。
いわば、「インフラのコード化(IaC)」の実体そのものです。
第2章:YAML(ヤムル)フォーマット入門
Playbookを書く前に、YAML形式のルールを確実に理解しましょう。
ここを曖昧にすると、必ずエラー(Syntax Error)で躓きます。YAMLは「厳格」ですが「シンプル」です。
ルール1:インデントは「スペース2個」が標準
YAMLはインデント(字下げ)で階層構造を表現します。
Pythonと同じですが、最も重要なルールは「タブ(Tab)文字は禁止」ということです。
必ず「半角スペース」を使ってください。Ansibleコミュニティでは「スペース2個」ずらしが標準です。
key:
child-key: value # スペース2個で下げる
grand-child: value # さらに2個下げる
ルール2:リスト(配列)はハイフン「-」
一覧を表すときは、行頭に - (ハイフン+スペース)を付けます。
fruits: - apple - banana - orange
ルール3:辞書(ハッシュ)はコロン「:」
キーと値のペアは key: value で表します。
ここで初心者が最もやりがちなミスが、「コロンの後にスペースを忘れる」ことです。
# OK name: Tanaka # NG (スペースがないとエラー!) name:Tanaka
💡 開発環境のすすめ
メモ帳やサクラエディタではなく、VS Code (Visual Studio Code) を使いましょう。
「YAML」拡張機能(Red Hat提供のものなど)をインストールすれば、インデントのズレや構文エラーをリアルタイムで赤く表示してくれます。
これがあるだけで、学習効率が劇的に上がります。
第3章:Playbookの基本構造
それでは、実際のPlaybookを見てみましょう。
「WebサーバーにApacheをインストールして起動する」というシンプルなPlaybookです。
sample_web.yml
---
- name: Setup Web Server # 1. プレイの名前
hosts: webservers # 2. 対象ホスト(インベントリのグループ名)
become: true # 3. root権限(sudo)を使うか
tasks: # 4. タスク一覧
- name: Install Apache
ansible.builtin.dnf: # モジュール名
name: httpd
state: present
- name: Start Apache
ansible.builtin.systemd: # モジュール名
name: httpd
state: started
enabled: true
構造の解説
- Target Section (どこで):
hosts:で対象を指定します。インベントリファイルに書いたグループ名(webserversなど)や、allを指定します。become: trueを書くと、全タスクがsudoで実行されます(インストールなどはroot権限が必要なため)。 - Task Section (何を):
tasks:の下に、実行したい処理をリスト形式(-)で並べます。
各タスクにはname:で「何をしているか」の説明を書くのがマナーです。実行ログにこの名前が表示されます。 - Module (どうやって):
dnfやsystemdなど、Ansibleが持つ機能部品(モジュール)を呼び出して処理を行います。
第4章:主要モジュール完全ガイド
Ansibleには数千種類のモジュールがありますが、日常的に使うのはそのうちの数個です。
ここでは、サーバー構築で必ず使う「四天王」モジュールと、そのパラメータを紹介します。
1. パッケージ管理:dnf / yum / apt
ソフトウェアをインストールします。
RHEL/AlmaLinux系なら dnf、Debian/Ubuntu系なら apt を使います。
- name: Install httpd and php
ansible.builtin.dnf:
name:
- httpd
- php
state: present
- name: パッケージ名。リスト形式で複数指定も可能。
- state:
present: インストールする(バージョン不問)。最も一般的。latest: 最新版にアップデートする。absent: アンインストールする(削除)。
2. サービス管理:systemd / service
サービスの起動、停止、自動起動設定を行います。
- name: Start httpd
ansible.builtin.systemd:
name: httpd
state: started
enabled: true
- name: サービス名(httpd, mariadbなど)。
- state:
started: 起動する(既に起動していれば何もしない)。stopped: 停止する。restarted: 再起動する(常に実行されるので注意)。reloaded: 設定読み込みを行う。
- enabled:
trueで自動起動ON、falseでOFF。
3. ファイル配置:copy
手元のファイルをサーバーにアップロードします。
設定ファイルの配布などによく使います。
- name: Upload index.html
ansible.builtin.copy:
src: ./files/index.html # 手元のファイルパス
dest: /var/www/html/index.html # サーバー上の配置先
owner: apache
group: apache
mode: '0644'
backup: yes # 上書き時にバックアップを取る
- src: コピー元。Playbookがあるディレクトリからの相対パスでOK。
- dest: コピー先(フルパス)。
- mode: パーミッション(例: ‘0644’)。
- backup:
yesにすると、上書きされるファイルのバックアップを自動生成してくれます。
4. コマンド実行:command / shell
Ansibleモジュールにない処理を行いたい場合、Linuxコマンドを直接実行します。
- name: Check uptime
ansible.builtin.command: uptime
register: result # 結果を変数に入れる
- command: シンプルなコマンド実行(推奨)。パイプ
|やリダイレクト>は使えない。 - shell: シェル経由で実行。パイプなどが使えるが、セキュリティリスクや冪等性の担保が難しい。
⚠️ 注意点:command/shell の落とし穴
shell や command は、実行するたびに必ず「Changed(変更あり)」と判定されてしまいます。
「ファイルが存在しない時だけ実行する」などの制御(creates オプション)が必要になります。
可能な限り、専用モジュール(dnfやuserなど)を使うのがAnsibleの流儀です。
第5章:【実践】Webサーバー構築Playbookの実行
それでは、実際に動かしてみましょう。
カレントディレクトリに index.html を用意し、それを配布してWebサーバーを立ち上げるPlaybookを作成・実行します。
1. 準備
作業ディレクトリ(前回の ~/ansible-demo)で行います。
# index.htmlの作成 echo "Hello Ansible!
" > index.html # Playbookの作成 (site.yml) nano site.yml
site.yml の内容:
---
- name: Setup Web Server
hosts: webservers # インベントリのグループ名に合わせてね
become: true
tasks:
- name: Install Apache
ansible.builtin.dnf:
name: httpd
state: present
- name: Deploy index.html
ansible.builtin.copy:
src: ./index.html
dest: /var/www/html/index.html
mode: '0644'
- name: Start Apache
ansible.builtin.systemd:
name: httpd
state: started
enabled: true
- name: Open Firewall (http)
ansible.posix.firewalld:
service: http
permanent: true
state: enabled
immediate: true
※ ansible.posix.firewalld はファイアウォールを設定するモジュールです。immediate: true で即時反映させます。
2. 構文チェック (Syntax Check)
実行前に、YAMLの書き間違いがないかチェックします。
ansible-playbook site.yml --syntax-check
ファイル名が表示されるだけでエラーが出なければOKです。
3. ドライラン (Dry Run)
実際には変更を行わず、「何が変更されるか」だけを確認するモードです。
ansible-playbook site.yml --check
これでエラーが出ないことを確認します。
4. 本番実行 (Run)
いざ実行!
ansible-playbook site.yml
実行結果の確認
PLAY [Setup Web Server] ******************************************************** TASK [Gathering Facts] ********************************************************* ok: [192.168.1.50] TASK [Install Apache] ********************************************************** changed: [192.168.1.50] TASK [Deploy index.html] ******************************************************* changed: [192.168.1.50] ... PLAY RECAP ********************************************************************* 192.168.1.50 : ok=5 changed=4 unreachable=0 failed=0 skipped=0
- ok: 成功(変更なし)。
- changed: 変更があった(インストールされた、ファイルが置かれた)。
- failed: 失敗。
ブラウザでターゲットサーバーのIPにアクセスし、「Hello Ansible!」が表示されれば成功です!
5. 冪等性の確認(2回目の実行)
ここがAnsibleの凄いところです。
もう一度同じコマンド ansible-playbook site.yml を実行してみてください。
TASK [Install Apache] ********************************************************** ok: [192.168.1.50]
全てが緑色の ok になり、最後に changed=0 と表示されるはずです。
「Apacheはもう入ってるから何もしない」「ファイルは同じだから何もしない」とAnsibleが判断したのです。
これで、何度実行しても安全であることが確認できました。
第6章:コレクション(Collection)とモジュールの調べ方
コードの中で ansible.builtin.dnf という書き方をしましたが、単に dnf と書いても動きます。
これは何でしょうか?
Ansible 2.10以降、モジュールは「コレクション」という単位で整理されました。
- FQCN (完全修飾コレクション名):
ansible.builtin.copy - 短縮名:
copy
どちらでも動きますが、公式ドキュメントや最新のベストプラクティスでは、どこのモジュールか明確にするために **FQCN(長い名前)**で書くことが推奨されています。
特に community.general など標準以外のモジュールを使う際に重要になります。
モジュールの使い方がわからない時は?
ansible-doc コマンドを使えば、マニュアルをターミナルで見ることができます。
# copyモジュールの使い方を見る ansible-doc ansible.builtin.copy
オプションの意味や、豊富なサンプルコード(EXAMPLESセクション)が載っているので、困ったらまずこれを見る癖をつけましょう。
まとめ:コードがサーバーを作る時代の幕開け
お疲れ様でした!
ついに、Playbookを使ってWebサーバーを自動構築することができました。
今回の重要ポイント:
- PlaybookはYAML形式で書く。インデント(スペース2個)が命。
tasksの下に、やりたいことをモジュール単位で並べる。dnf,systemd,copyが基本の3大モジュール。- 2回実行して
changed=0になるのが「美しいPlaybook」。
しかし、今回のPlaybookにはまだ弱点があります。
ファイルの中に「IPアドレス」や「設定値」が直接書き込まれていませんでしたか?
テスト環境と本番環境で設定を変えたい場合、Playbookを2つ作らなければならないのでしょうか?
次回、第4回は「変数を使いこなせ。Jinja2テンプレートによる設定ファイルの動的生成」です。
Playbookを変数化(Variables)し、httpd.conf などの設定ファイルをテンプレート(Template)から動的に生成するテクニックを学びます。
Ansibleの表現力が一気に広がりますよ。お楽しみに!
▼ Playbookを実際に動かしてみる ▼
実験用サーバーを準備
「VPS」で自分専用環境
IaCスキルを年収に
「ITエンジニア転職」

コメント