【無料ツール】画像をPDFに変換するPhotoPDF Appを公開しました!

【Ansible講座 第3回】Playbookの基礎。YAMLの作法と「モジュール」によるタスク定義完全ガイド

「コマンドの羅列」から「あるべき姿の定義」へ。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、インベントリと設定ファイル(ansible.cfg)を整備して、ターゲットサーバーを快適に操作する環境を整えました。

しかし、まだ私たちは「ansible ... -m ping」のように、コマンドラインで単発の命令を送っているに過ぎません。
実際のサーバー構築では、「Webサーバーを入れて、設定ファイルを書き換えて、起動して、ファイアウォールを開ける」といった一連の流れが必要です。
これを実現するのが、Ansibleの設計図である「Playbook(プレイブック)」です。

コウ君

先生、ついにPlaybookですね!
でも、ネットでサンプルを見ると、インデントだらけで読みづらくて…。
「YAML」って言語なんですか? スペースの数とか間違えると動かないって聞いてビビってます。

リナックス先生

怖がらなくて大丈夫よ。
YAML(ヤムル)は「人間が読み書きしやすい」ように作られたデータ形式なの。
ルールさえ覚えれば、シェルスクリプトよりも遥かに分かりやすくて、ミスも減るわ。
今回は、Apacheを自動インストールするPlaybookを書きながら、YAMLの書き方と主要な「モジュール」の使い方をマスターしましょう!

本記事では、AlmaLinux 9 をベースに、Playbookの基本構造、YAMLフォーマットの鉄則、そして実務で必ず使う主要モジュールの操作方法について徹底解説します。

🚀 Ansible完全攻略講座(バックナンバー)

現在地:【第3回】Playbookの基礎。YAMLの作法と「モジュール」によるタスク定義


第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

構造の解説

  1. Target Section (どこで):
    hosts: で対象を指定します。インベントリファイルに書いたグループ名(webserversなど)や、all を指定します。
    become: true を書くと、全タスクが sudo で実行されます(インストールなどはroot権限が必要なため)。
  2. Task Section (何を):
    tasks: の下に、実行したい処理をリスト形式(-)で並べます。
    各タスクには name: で「何をしているか」の説明を書くのがマナーです。実行ログにこの名前が表示されます。
  3. Module (どうやって):
    dnfsystemd など、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 の落とし穴
shellcommand は、実行するたびに必ず「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」で自分専用環境

おすすめVPSを見る

IaCスキルを年収に
「ITエンジニア転職」

転職エージェントを見る

コメント