【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

はじめてのIaC ~AnsibleでLAMP環境構築してみよう編~

どうも。去年新卒で入りました、大明神ちくわです。

時が流れるのは早いですね。

去年の8月くらいにブログ書くぞーと意気込んだ気がします。

てことでAnsibleを用いてLAMP環境をセットアップしましたので、本記事ではその紹介を軽く行います。

深い知識などはまだ私も持ち合わせておりませんので、ざっくりと、こうしたらAnsibleが動きますよ~くらいの温度感で書けたらと思います。

Ansibleを実行してみよう

前提

環境

Virtualbox: バージョン 7.0.20

Vagrant: バージョン 2.4.1

Vagrant box: AlmaLinux 9

Ansible: バージョン2.14.17

 

Ansibleは構成管理ツールの1種で、仮想環境はもちろんAWSなどのクラウドの構築等も利用できます。

今回は仮想環境を3台用意し、1台をAnsible実行サーバーとして、他2台をLAMP環境セットアップするサーバーにします。

インストール方法やAnsibleの詳細に関しては、偉大な先輩が執筆してくださっている記事があるのでご覧ください。

Ansibleの構成

Ansibleの基本的な構成は下記のようになっております。

1
2
3
4
5
/etc/ansible
          └── roles
          ├── hosts
          ├── playbook.yml
          └── ansible.cfg
hosts
  • 名称: インベントリファイル
  • 役割:Ansibleが管理するターゲットホストを定義します。
  • 内容: ホスト名やIPアドレスをグループ化して記述できます。Webサーバーやデータベースサーバーなどのカテゴリごとにホストを分類などもできます。今回は前述のAnsible適応サーバーのIPを記述します。
playbook.yml
  • 名称:プレイブックファイル
  • 役割:具体的な操作やタスクを定義します。
  • 内容:特定のホストに対して一連のタスクをどのように実行するかを定義します。インストールすべきパッケージや開始すべきサービスなど、具体的な命令を含むことが多いです。こちらにLAMP環境を導入するための命令を記述していきます。
ansible.cfg
  • 役割: Ansibleの設定ファイルで、Ansible全体の動作を制御します。
  • 内容:インベントリのパス、リモートユーザー、SSHキーのパス、ホストキーの確認を行うかどうかなど、様々なオプションを指定できます。今回は特に触りません。

基本的には上記3つのファイルが存在していれば、Ansibleは動作します。

rolesディレクトリについては後で解説します。

インベントリファイルの書き方

この節では、インベントリファイルの書き方を確認します。

今回、こちらは簡単なのでサクッと終わらせます。

1
2
3
4
5
6
7
8
9
10
[all:vars]
ansible_user=vagrant
ansible_password=vagrant
 
[test_ansibleclient]
ansibleclients_host=192.168.33.10
 
[ansibleclients]
ansibleclients_host1 ansible_host=192.168.33.30
ansibleclients_host2 ansible_host=192.168.33.40

インベントリファイルは上記のような形で記述を行います。

  • グループ定義:ホストを[XXX]という形式でグループ化できます。今回対象とする2つのサーバーを[ansibleclients]でグループ化しています。
  • グループ変数: :varsセクションを使って、そのグループ内のすべてのホストに適用される変数を定義できます。今回はユーザー名、パスワードに関して記述しています。加えて [all:vars]を指定して全ホストに共通の設定としています。

プレイブックの書き方

基本的なプレイブックの構造は以下の通りです。

  • hosts:インベントリファイルにてグループ定義したものを指定し、以降の処理を適応します。
  • vars:変数を定義することが出来ます。なくても問題ありません。
  • tasks:対象のサーバーに適応する処理を記述します。こちらに記述した処理は上から順に実行されていきます。プレイブックの核となる部分です。
  • handlers:tasksとは別枠で処理を記述することが出来ます。○○の結果が▼▼だった場合、など処理の実行に条件を付けたい場合等に使えます。なくても問題ありません。

上記4つのまとまりを1playとします。

そして複数のplayの集合体がプレイブックファイルとなります。

 

では具体的な処理についてみていきましょう。

1
2
3
4
5
6
7
8
9
10
---
#hosts
- hosts: ansibleclients
  become: yes
#tasks
  tasks:
     - name: install Apache
        yum:
          name: httpd
          state: latest

yaml形式で書かれているのでとても分かりやすいですね。何の知識が無くても読めばやりたいことが分かります。

▼#hosts部分

  • hosts前節で解説したインベントリファイルの対象となるホストまたはグループを指定します。
  • becomeタスクを管理者権限で実行するかどうかを指定します。

▼#tasks部分

  • tasks以降に実行するタスクを記述します。
  • name タスクの名前を記述します。
  • yum:使用するモジュールを指定します。今回はApacheをインストールしたいので、yumを使用します。Ubuntu等の場合はaptを指定します。
  • name インストールするパッケージ名を指定します。
  • state パッケージの状態を指定します。

つまりこの処理は最新のApacheを管理者権限でインストール、という内容になります。

 

他にも使用するモジュールを変更すればキーの取得や権限の変更等も出来ます。

▼キーの取得

1
2
3
4
- name: Install MySQL GPG key
  rpm_key:
    state: present

▼権限&所有者の変更

1
2
3
4
5
6
7
8
9
- name: chmod and chown for HTML and PHP files
  file:
    path: "/var/www/html/{{ item }}"
    owner: apache
    group: apache
    mode: '0644'
  loop:
    - test.html
    - test.php

 

Ansibleで使えるモジュールについては、公式の一覧があります。

https://docs.ansible.com/ansible/2.9_ja/modules/modules_by_category.html#modules-by-category

こちらを参考に処理を書いていけば良いでしょう。

…と言いたいところですが、数が多すぎるので、「Ansible モジュール」等で検索し、汎用性のあるモジュールを紹介しているブログを参考にするほうがよいと思います。

実際につかってみよう

実機確認

では実際にAnsibleを実行してみます。

使用するプレイブックファイルは以下になってます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
- hosts: ansibleclients
  become: true
  tasks:
    - name: install httpd
      yum: name=httpd state=latest
    - name: Apache start / enable
      service: name=httpd state=started enabled=yes
    - name: Add MySQL repository
      get_url:
        dest: /tmp/mysql80-community-release-el9-5.noarch.rpm
    - name: Install MySQL GPG key
      rpm_key:
        state: present
      yum:
        name: /tmp/mysql80-community-release-el9-5.noarch.rpm
        state: present
    - name: Install MySQL server
      yum:
        name: mysql-community-server
        state: latest
    - name: Start MySQL service
      service:
        name: mysqld
        state: started
        enabled: yes
    - name: Import Remi GPG key
      rpm_key:
        state: present
    - name: Install Remi repository
      yum:
        state: present
    - name: Install PHP and related packages
      yum:
        name:
          - php
          - php-devel
          - php-mbstring
          - php-mysqli
          - php-gd
        state: present
      notify:
        - httpd restart
    # テスト用のhtmlとPHPスクリプトをコピー
    - name: html copy
      copy:
        src: /etc/ansible/test.html
        dest: /var/www/html
    - name: PHP copy
      copy:
        src: /etc/ansible/test.php
        dest: /var/www/html
 
    - name: chmod and chown for HTML and PHP files
      file:
        path: "/var/www/html/{{ item }}"
        owner: apache
        group: apache
        mode: '0644'
      loop:
        - test.html
        - test.php
  handlers:
    - name: httpd restart
      service: name=httpd state=restarted

Ansible を実行する際、ssh接続が出来ないとエラーが出てしまいますので、あらかじめkeyscanで登録しておきましょう。

1
ssh-keyscan XXX.XXX.XXX.XXX  /root/.ssh/known_hosts

プレイブックの実行コマンドはこちら。

1
ansible-playbook /プレイブックのパス

正常に終了したら、下記のような結果が出力されます。

1
2
3
PLAY RECAP ******************************************************************************************************************************************************************************************************
ansibleclients_host1 : ok=15 changed=14 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansibleclients_host2 : ok=16 changed=14 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

failedやunreachableが0であれば問題ないです。

後はテスト用のhtml及びPHPスクリプトの動作確認や、MySQLにログイン可能かどうかを見て終了です。

処理をディレクトリごとに分けてみる

さて、前節のプレイブックを見て、1ファイルにまとめると小回りが利かないな、と思った人もいると思います。

Apacheは入れたいけど、MySQLはいらない、みたいな場合もありますしね。

でもプレイブックを何個も作るのも面倒…。

はい。もちろんそういう方のために、処理を小分けにして活用する方法があります。

rolesを活用して処理を分けてみる

Ansibleの構成の章で後程としていたrolesを使用します。

rolesを活用すれば下記のようにプレイブックの処理を分割することが出来ます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
roles
 └──httpd_install
         └──tasks
               └──main.yml
 └──mysqld_install
         └──tasks
               └──main.yml
 └──php_install
          └──tasks
                └──main.yml
          └──handlers
                └──main.yml
 └──remi_repo
         └──tasks
               └──main.yml

roles配下で処理ごとのディレクトリを作成し、さらにその配下でtasksやhandlersなどのディレクトリを作成。

最終的にmain.ymlに実際の処理を記述します。

下記は /roles/httpd_install/tasks/main.yml の処理の内容です。

1
2
3
4
5
---
 - name: install httpd
   yum: name=httpd state=latest
 - name: Apache start / enable
   service: name=httpd state=started enabled=yes

そして下記のようにプレイブックを記述することにより、適応したい処理を調節します。

1
2
3
4
5
6
7
8
9
10
---
- name: select roles
  hosts: ansibleclient3
  remote_user: vagrant
  become: yes
  roles:
    - httpd_install
    - mysqld_install
    #- remi_repo
    #- php_install

これだとhttpdとMySQLの処理は適応、その他はコメントアウトしている処理は適応せずという形になりますね。

rolesを活用すれば、一枚のプレイブックを作成するよりも小回りが利くようになり、管理も簡単になります。

一度プレイブックを全部作ってからでも良いので、意識してrolesで分割していくと後からでも使いまわしが出来るのでおススメです。

まとめ

いかがでしたか。

自分自身 Ansible を使い始めて浅いので、まだまだ分からない事が多いですが、そんな自分でも使えるくらいAnsibleは簡単です。

皆様も散歩に行くくらい気軽な感じで初めてはいかがでしょうか。

最後までご覧いただきありがとうございました。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
2
読み込み中...
2 票, 平均: 1.00 / 12
27
X facebook はてなブックマーク pocket
【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

大明神ちくわ

溶けます
冷えます
適切な温度で飼ってください