## 背景
Ansibleを業務ツールで利用しているが触ったことがなかったのでVagrantを利用して最低限のLAMP環境を用意する検証をしてみました。(チュートリアルっぽく作りました。)
## ゴール
以下のようにAnsibleサーバーから二台のリモートサーバーにLAMP環境を展開し、phpの画面が表示されることを目指す。
## 事前に準備すること
VirtualBox / Vagrant
## 1. VMを立ち上げる
下記をcloneしてサーバーを3台用意し、一台をAnsible専用、残り二台は構築するLAMP環境用として用意する。
$ git clone https://github.com/kosa3/ansible-tutorial
$ cd server // LAMP環境用のVMを立ち上げる
$ vagrant up
$ vagrant ssh server1
$ vagrant ssh server2$ cd ansible // Ansible用のVMを立ち上げる
$ vagrant up
$ vagrant ssh
無事に立ち上がることが確認でたら次の手順にうつる。
※VMとホスト間でマウントがうまくいかない場合はvirtualboxとvagrantのバージョンの相性が問題なので vbguest
などのプラグイン を入れ解消する。
## 2. Ansibleサーバーからリモートサーバーへ接続できるようにする
Ansibleから構成をリモートサーバーへ展開する際にssh接続ができるようにするため、鍵認証を登録する。
Ansibleサーバーにて鍵を生成し、公開鍵を各リモートサーバーへ設定する。
$ ssh-keygen -t rsa
$ ssh-copy-id vagrant@192.168.33.11
$ ssh-copy-id vagrant@192.168.33.12
上記の設定が終わればssh接続して鍵認証でログインできることを確認する。
また、ansibleコマンドでリモートサーバーへの接続を確認することができるます。ansibleのinventoryという機能で複数のサーバーの設定を行うことができます。
inventory/hostsファイルにリモートサーバーを記載する。
[target]
192.168.33.11
192.168.33.12
記載ができれば接続を確認します。以下のコマンドで各サーバーにpingを送った結果が返ってきます。
SUCCESSがでていれば成功していることがわかります。
$ ansible all -i inventory/hosts -m ping
192.168.33.11 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.33.12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
## 3. ansible playbookを実行する
構成を記述するplaybook.ymlにapache, php, mysqlをそれぞれインストールする設定を記載しますのでそのファイルを実行します。
$ ansible-playbook -i inventory/hosts playbook.yml
各サーバーの /var/www/html
にphpinfo表示するindex.phpを配置すると各サーバーにアクセスすると以下のようにphpの画面が表示されていることができれば構成ができていることがわかります。
## 詰まったところ
・CentOS7からだがパスワード認証がオフになっているためオンにする必要があった。
・CentOS8からパッケージ管理はyumではなくdnfに変わっていること(yumコマンドを打ってもバックグラウンドでdnfが動いていること)を知らなかったのでAnsible設定にもdnfで対応した。
※ミドルウェアのインストールコマンド(dnf module ~~)がAnsibleのymlに対応していないためshellでの記載になっています。
## まとめ
最低限の設定だけなのでansibleのroleの設定がシンプルになりましたが大きくなることでより威力を発揮しそうだなと感じました。
(これぐらいならVagrantfileで完結できそう。。)
シェルスクリプトに比べて冪等性があることで構成管理をシンプルに安心して実行できることからAnsibleの良さを少しは理解できました。