当記事はケーススタディの連載となっています。目次は【こちら】です。
最新のソースコードは【GitHub】で公開中です。
前回までの連載記事(01.Vagrant-Ansible-Serverspecによるサーバ構築とサーバテスティング~08.最小構成CentOS7からAnsibleに制御されるCentOS7を構築する (On Vagrant))でVagarantを使用してAnsible管理端末、各種サーバ群(apserv01,dbserv01,adminserv01)の構築をしました。
今回の連載ではAnsible管理端末から以下のサーバの設定をします。
・apserv01(WEB/Applicationサーバ)
・dbserv01(Maridadb(Mysql))
・adminserv01(SVNやJenkins等)
これらサーバ群の責務は以下の通りです。
途中Vagrantのプラグインを使用してサーバのコミット/ロールバックも行います。
サーバ設定ソフトウェア(サーバープロビジョニングツール)は設定するとサーバ設定が確定してしまい、データベースやプログラミング等と違い、戻す(ロールバック)ことや確定(コミット)などが出来ない為です。
実際にAnsibleを使用してしてサーバ設定する前にサーバ構成について復習。
詳細は、
「Vagrant-Ansible-Serverspecによるサーバ構築とサーバテスティング」
Windowsのフォルダ構成は、
「VirtualBox LinuxイメージをVagrantBoxファイルに変換する」
を参照ください。
###1.Ansible管理端末(manageterm)を起動する
####1-1.Vagrantのルートに移動
cd D:\_BLOG\BG001\vagrant_box
####1-2.管理端末の起動
vagrant up manageterm
実行結果コンソール:
PS D:\_BLOG\BG001\vagrant_box> vagrant up manageterm
Bringing machine 'manageterm' up with 'virtualbox' provider...
==> manageterm: Clearing any previously set network interfaces...
==> manageterm: Preparing network interfaces based on configuration...
manageterm: Adapter 1: nat
manageterm: Adapter 2: hostonly
manageterm: Adapter 3: bridged
==> manageterm: Forwarding ports...
manageterm: 22 => 2222 (adapter 1)
==> manageterm: Running 'pre-boot' VM customizations...
==> manageterm: Booting VM...
==> manageterm: Waiting for machine to boot. This may take a few minutes...
manageterm: SSH address: 127.0.0.1:2222
manageterm: SSH username: vagrant
manageterm: SSH auth method: private key
manageterm: Warning: Connection timeout. Retrying...
manageterm: Warning: Remote connection disconnect. Retrying...
==> manageterm: Machine booted and ready!
==> manageterm: Checking for guest additions in VM...
==> manageterm: Setting hostname...
==> manageterm: Configuring and enabling network interfaces...
==> manageterm: Mounting shared folders...
manageterm: /vagrant => D:/_BLOG/BG001/vagrant_box
==> manageterm: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> manageterm: flag to force provisioning. Provisioners marked to run always will still run.
##manageterm(Linux)での操作(Ansible管理仮想端末)
###1.SELINUXの無効化
####1-1.selinuxファイルをコピーしてバックアップ
cp /etc/sysconfig/selinux /etc/sysconfig/selinux.org
vi /etc/sysconfig/selinux
####1-2.selinuxの編集
SELINUX=enforcing => SELINUX=disabled に変更
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
# ******* SELINUX=enforcingをSELINUX=disabledに変更する***************
#SELINUX=enforcing
SELINUX=disabled
####1-3.変更箇所の確認
diffコマンドで変更後と変更前のファイルを比較する。
diff /etc/sysconfig/selinux /etc/sysconfig/selinux.org
7,8c7
< #SELINUX=enforcing
< SELINUX=disabled
---
> SELINUX=enforcing
####1-4.reboot
rebootしてSELINUXを適用する。
reboot
※後で再起動を行う場合は、とりあえず下記コマンドを実行。
setenforce permissive
###2.Ansibleルートディレクトリの確認
cd /etc/ansible/
ls -la
実行結果コンソール:
[root@manageterm ansible]# cd /etc/ansible/
[root@manageterm ansible]# ls -la
合計 28
drwxr-xr-x. 3 root root 48 12月 26 01:01 .
drwxr-xr-x. 76 root root 8192 12月 26 01:07 ..
-rw-r--r--. 1 root root 8625 10月 11 03:36 ansible.cfg
-rw-r--r--. 1 root root 965 10月 11 03:36 hosts
drwxr-xr-x. 2 root root 6 10月 11 03:36 roles
[root@manageterm ansible]#
###3.Ansibleのhostsファイル(/etc/ansible/hosts)の設定
vi /etc/ansible/hosts
以下を記述
#管理するサーバの一覧
apserv01
dbserv01
adminserv01
#WEB/APサーバ用のグループを設定
#ここでは一台だがWEB/APサーバ群に一括して設定したい場合の為
[apservers]
apserv01
#DBサーバ用のグループを設定
[dbservers]
dbserv01
#adminserv01サーバ用のグループを設定
[adminservs]
adminserv01
#apserv01とadminserv01をグループ化
[ap_admin]
apserv01
adminserv01
#dbserv01とadminserv01をグループ化
[db_admin]
dbserv01
adminserv01
###4.OSのhostsファイルの設定
以下を追記
#サーバの一覧
192.168.102.195 manageterm
192.168.102.196 apserv01
192.168.102.197 dbserv01
192.168.102.198 adminserv01
具体的なIPアドレスは
「最小構成CentOS7からAnsibleに制御されるCentOS7を構築する(On Vagrant)」に設定したpublic_networkのURLを指定する。
###5.Ansible用ユーザーの作成
useradd ansible
passwd ansible
※任意のパスワードを設定する。
###6.Ansibleルート(/etc/ansible)の所有者と権限の変更
#rootユーザとansibleグループに77権限を与える
chown -R root:ansible/etc/ansible
#rootとansibleに77権限を与える
chmod -R 775 /etc/ansible
# /etc/ansible/hostsのみ-xする
chmod -x /etc/ansible/hosts
###7.公開鍵作成
ssh-keygen -t rsa -N ""
実行結果コンソール:
[root@manageterm ~]# ssh-keygen -t rsa -N ""
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
74:f5:b8:c9:63:a5:3a:44:96:b9:1f:84:22:13:f3:13 root@manageterm
The key's randomart image is:
+--[ RSA 2048]----+
| o E . |
| + . = o |
| o = B o o |
| + * + = |
| S o O |
| . + o |
| o . |
| . |
| |
+-----------------+
###8.作成された鍵情報の確認
ls -la /root/.ssh
以下の2ファイルが作成されている
/root/.ssh/id_rsa
/root/.ssh/id_rsa.pub
KEY情報をSSH-Agentプロセスに保存する。
毎回パスフレーズを入力せずに他のSSHサーバに対して接続するようにする。
AnsibleはSSHを使用して自動で他のサーバの設定を行う為、SSH公開鍵パスフレーズをssh-agentプロセスに保存しておく。
※eval `ssh-agent`を実行すると「Agent pid XXXX」と表示される。XXXXを psで確認してみるとssh-agentが起動しているのがわかる
eval `ssh-agent`
ssh-add
##Windowsでの操作
apserv01、dbserv01、adminserv01(Ansible管理端末(manageterm)により操作されるサーバの起動)
managetermの準備が完了した為、操作されるサーバをVagrantより起動する。
###1.Vagrantのルートに移動
cd D:\_BLOG\BG001\vagrant_box
###2.サーバ群(apserv01、adminsev01、dbserv01)の起動
vagrant up apserv01 dbserv01 adminserv01
実行結果コンソール:
Bringing machine 'apserv01' up with 'virtualbox' provider...
Bringing machine 'dbserv01' up with 'virtualbox' provider...
Bringing machine 'adminserv01' up with 'virtualbox' provider...
==> apserv01: Fixed port collision for 22 => 2222. Now on port 2201.
==> apserv01: Clearing any previously set network interfaces...
==> apserv01: Preparing network interfaces based on configuration...
apserv01: Adapter 1: nat
apserv01: Adapter 2: hostonly
apserv01: Adapter 3: bridged
==> apserv01: Forwarding ports...
apserv01: 22 => 2201 (adapter 1)
==> apserv01: Booting VM...
==> apserv01: Waiting for machine to boot. This may take a few minutes...
apserv01: SSH address: 127.0.0.1:2201
apserv01: SSH username: vagrant
apserv01: SSH auth method: private key
apserv01: Warning: Connection timeout. Retrying...
apserv01: Warning: Remote connection disconnect. Retrying...
==> apserv01: Machine booted and ready!
==> apserv01: Checking for guest additions in VM...
==> apserv01: Setting hostname...
==> apserv01: Configuring and enabling network interfaces...
==> apserv01: Mounting shared folders...
apserv01: /vagrant => D:/_BLOG/BG001/vagrant_box
==> apserv01: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> apserv01: flag to force provisioning. Provisioners marked to run always will still run.
==> dbserv01: Clearing any previously set forwarded ports...
==> dbserv01: Fixed port collision for 22 => 2222. Now on port 2202.
==> dbserv01: Clearing any previously set network interfaces...
==> dbserv01: Preparing network interfaces based on configuration...
dbserv01: Adapter 1: nat
dbserv01: Adapter 2: hostonly
dbserv01: Adapter 3: bridged
==> dbserv01: Forwarding ports...
dbserv01: 22 => 2202 (adapter 1)
==> dbserv01: Booting VM...
==> dbserv01: Waiting for machine to boot. This may take a few minutes...
dbserv01: SSH address: 127.0.0.1:2202
dbserv01: SSH username: vagrant
dbserv01: SSH auth method: private key
dbserv01: Warning: Connection timeout. Retrying...
dbserv01: Warning: Remote connection disconnect. Retrying...
==> dbserv01: Machine booted and ready!
==> dbserv01: Checking for guest additions in VM...
==> dbserv01: Setting hostname...
==> dbserv01: Configuring and enabling network interfaces...
==> dbserv01: Mounting shared folders...
dbserv01: /vagrant => D:/_BLOG/BG001/vagrant_box
==> dbserv01: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> dbserv01: flag to force provisioning. Provisioners marked to run always will still run.
==> adminserv01: Clearing any previously set forwarded ports...
==> adminserv01: Fixed port collision for 22 => 2222. Now on port 2200.
==> adminserv01: Clearing any previously set network interfaces...
==> adminserv01: Preparing network interfaces based on configuration...
adminserv01: Adapter 1: nat
adminserv01: Adapter 2: hostonly
adminserv01: Adapter 3: bridged
==> adminserv01: Forwarding ports...
adminserv01: 22 => 2200 (adapter 1)
==> adminserv01: Booting VM...
==> adminserv01: Waiting for machine to boot. This may take a few minutes...
adminserv01: SSH address: 127.0.0.1:2200
adminserv01: SSH username: vagrant
adminserv01: SSH auth method: private key
adminserv01: Warning: Connection timeout. Retrying...
adminserv01: Warning: Remote connection disconnect. Retrying...
==> adminserv01: Machine booted and ready!
==> adminserv01: Checking for guest additions in VM...
==> adminserv01: Setting hostname...
==> adminserv01: Configuring and enabling network interfaces...
==> adminserv01: Mounting shared folders...
adminserv01: /vagrant => D:/_BLOG/BG001/vagrant_box
==> adminserv01: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> adminserv01: flag to force provisioning. Provisioners marked to run always will still run.
PS D:\_BLOG\BG001\vagrant_box>
###3.起動確認
vagrant status
以下が出力されていればOK。
PS D:\_BLOG\BG001\vagrant_box> vagrant status
Current machine states:
apserv01 running (virtualbox)
dbserv01 running (virtualbox)
adminserv01 running (virtualbox)
manageterm running (virtualbox)
##manageterm(Linux)での操作(Ansible管理仮想端末)
###1.鍵のあるディレクトリに移動
cd /root/.ssh
###2.manageterm(Ansible)からサーバ群へ公開鍵を配布
それぞれ2回パスワードを求められる。
以降は公開鍵暗号方式による接続となりパスワードを求められる事がなくなる。
- apserv01への配布
#SSHで対象のサーバに接続して.sshフォルダを作成する。すでにある場合は何もしない
ssh root@apserv01 "mkdir ~/.ssh > /dev/null 2>&1;touch ~/.ssh/authorized_keys;exit"
#SSHで対象のサーバに接続してansible実行端末の公開キーを信頼するサーバ群として登録する
cat /root/.ssh/id_rsa.pub | ssh root@dev_apserv01 "cat > .ssh/authorized_keys && chmod 600 .ssh/authorized_keys"
- dbserv01への配布
#SSHで対象のサーバに接続して.sshフォルダを作成する。すでにある場合は何もしない
ssh root@dbserv01 "mkdir ~/.ssh > /dev/null 2>&1;touch ~/.ssh/authorized_keys;exit"
#SSHで対象のサーバに接続してansible実行端末の公開キーを信頼するサーバ群として登録する
cat /root/.ssh/id_rsa.pub | ssh root@dbserv01 "cat > ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
- adminserv01への配布
#SSHで対象のサーバに接続して.sshフォルダを作成する。すでにある場合は何もしない
ssh root@adminserv01 "mkdir ~/.ssh > /dev/null 2>&1;touch ~/.ssh/authorized_keys;exit"
#SSHで対象のサーバに接続してansible実行端末の公開キーを信頼するサーバ群として登録する
cat /root/.ssh/id_rsa.pub | ssh root@adminserv01 "cat > ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
これでAnsibleに接続するすべてのサーバへ公開鍵の配布が完了。
apserv01、dbserv01、adminserv01に接続確認を行う。
ansible all -m ping
実行結果コンソール:
apserv01 | success >> {
"changed": false,
"ping": "pong"
}
dbserv01 | success >> {
"changed": false,
"ping": "pong"
}
adminserv01 | success >> {
"changed": false,
"ping": "pong"
}
##Windowsでの操作
###Ansible管理端末(manageterm)/サーバ群(adminserv01、apserv01、dbserv01)のコミット
以上でAnsible管理端末の接続設定は完了。
折角なのでVagrantにてサーバ状態をコミットしておく。
####1.Vagrantのルートに移動
cd D:\_BLOG\BG001\vagrant_box
####2.Vagrant saharaプラグインのインストール
書式:
vagrant plugin install sahara
例:
vagrant plugin install sahara
実行結果コンソール:
PS D:\_BLOG\BG001\vagrant_box> vagrant plugin install sahara
Installing the 'sahara' plugin. This can take a few minutes...
Installed the plugin 'sahara (0.0.17)'!
####3.プラグインの確認
書式:
vagrant plugin list
例:
vagrant plugin list
実行イメージ:
PS D:\_BLOG\BG001\vagrant_box> vagrant plugin list
sahara (0.0.17)
vagrant-share (1.1.5, system)
####4.Vagrant sahara sandboxモードの有効化
saharaはVirtualBoxのスナップショットモードを利用することによりコミットとロールバックを行う。
まずsaharaのsandboxモードを有効化する。
書式:
vagrant sandbox on
例:
vagrant sandbox on
実行イメージ:
PS D:\_BLOG\BG001\vagrant_box> vagrant sandbox on
[manageterm] Starting sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
[adminserv01] Starting sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
[dbserv01] Starting sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
[apserv01] Starting sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
####5.サーバの一括コミット(VirtualBoxスナップショット作成)
書式:
vagrant sandbox commit
例:
vagrant sandbox commit
実行イメージ:
PS D:\_BLOG\BG001\vagrant_box> vagrant sandbox commit
[manageterm] Committing the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
[adminserv01] Committing the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
[dbserv01] Committing the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
[apserv01] Committing the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
エクスプローラの状態
- サーバを指定してコミットしたい場合
書式:
vagrant sandbox commit ${仮想サーバ名}
例:
vagrant sandbox commit adminserv01
- 一括ロールバックしたい場合
書式:
vagrant sandbox rollback
例:
vagrant sandbox rollback
- サーバを指定してロールバックしたい場合
書式:
vagrant sandbox rollback ${仮想サーバ名}
例:
vagrant sandbox rollback adminserv01
※Vagrant saharaでは、残念ながらGITのようなソース管理ツールで使用できる過去の複数の世代コミット/ロールバックができない。
イメージとしてはデータベースのコミット/ロールバック(直近のトランザクションの確定または破棄)と同じと思ってもらったらわかりやすいです。
GITのように複数の世代を持ちたい場合は(少々面倒ですが)サーバ設定がある程度完了した段階でboxファイルを作成しておくのがおすすめ。
書式:
vagrant package ${名前} --output ${出力パス}
例:
vagrant package adminserv01 --output ..\vagrant_boxfiles\adminserv01_XXXXX.box
上記でboxファイルを作成した断面に戻りたい場合は、「vagrant sandbox rollback」ではもどれないので以下の手順をたどる。
(1)完成形をBOXファイルへパッケージ化
vagrant package adminserv01 --output ..\vagrant_boxfiles\adminserv01_XXXXX.box
(2)BOXから対象仮想マシン情報を削除
vagrant box remove adminserv01
(3)仮想マシン自体を削除
vagrant destroy adminserv01
(4)BOXの仮想マシンを追加(情報のみ) ※ここで(1)で作成したboxファイルを指定して再構築
vagrant box add adminserv01 ..\vagrant_boxfiles\adminserv01_XXXXX.box
(5)BOX起動(仮想サーバは初回にアンパックされて作られる)
vagrant up adminserv01
(6)SandboxをONにする
vagrant sandbox on
次回は「Ansible実行端末からのCentOSサーバ群を構築する(Ansible準備編)」について。
連載の目次は【こちら】です。