はじめての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は簡単です。
皆様も散歩に行くくらい気軽な感じで初めてはいかがでしょうか。
最後までご覧いただきありがとうございました。