Edited at

【連載01】201.AnsibleでCentOS7サーバ群に接続し、サーバの状態をコミットするまで

More than 3 years have passed since last update.

当記事はケーススタディの連載となっています。目次は【こちら】です。

最新のソースコードは【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ファイルに変換する

を参照ください。


Windowsでの操作


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 に変更


selinux

# 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

以下を記述


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ファイルの設定

以下を追記


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準備編)」について。

連載の目次は【こちら】です。