【連載01】107.最小構成CentOS7からAnsible実行可能な操作用CentOS7を作成する（On Vagrant）

<b><font color="#ff6633">当記事はケーススタディの連載となっています。目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
<b><font color="#ff6633">最新のソースコードは[【GitHub】](https://github.com/csfactorygihubblog001/blogvagrant)で公開中です。</font></b>

今回は赤く囲んだ部分のサーバ構成(manageterm)をVagrantで構築し、「manageterm」からAnsibleが実行可能なLinuxを構築するところまでを実装します。

必要に応じて過去の記事を参照ください。

- 全体像について
[Vagrant-Ansible-Serverspecによるサーバ構築とサーバテスティング](http://qiita.com/CsFactoryitter/items/35977a5d18aa121bb24c)

- Windows構成は、
[VirtualBox内のLinuxイメージをVagrantBoxファイルに変換する](http://qiita.com/CsFactoryitter/items/60b65ae685a3ea4ee16f)

- Vagrantの基本的な操作の流れは、
[VagrantBoxの初期化から複数サーバ起動までの一般的な流れ](http://qiita.com/CsFactoryitter/items/1f3935d3b0f04c1ad49d)

![サーバ構成](https://qiita-image-store.s3.amazonaws.com/0/98085/76e68879-fb25-806f-fd8f-0f3f8f5a0345.png)

---
#Vagrantコマンドで「basecent7」(ベースとなる最小構成CentOS7)からVagrantBoxファイルを作成する

##Windows設定編(主にPowershell操作)

###1.VagrantfileのDIRに移動
Vagrant実行のルートDIRに移動する。

```ps1:
cd D:\_BLOG\BG001\vagrant_box
```

###2.VirtualBoxに作成したサーバをVagrantBoxファイルとして保存
作成した「basecent7」の仮想マシンイメージをVagrantBoxファイルにパッケージングする。

書式：
>vagrant package --base \${VirtualBox仮想マシン名(Path)} --output ${boxファイル名(Path)}

例：

```ps1:
vagrant package --base basecent7 --output ../vagrant_boxfiles/basepackage.box
```

実行結果イメージ：
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/704558d2-9c3c-d0de-ca00-447bdb9b420b.png)

###3.[Vagrantにboxを追加する](http://qiita.com/CsFactoryitter/items/d4d16f6fcd328c97ebc8#1box-add)
上記2.で作成したboxファイル(パッケージングしたVirutalbox)をベースにVagrantBoxに「manageterm」(Ansible操作用端末)を作成する。

書式：
>vagrant box add \${box内での名前} {$ベースとなる.boxファイル}

例：

```ps1:
vagrant box add manageterm ../vagrant_boxfiles/basepackage.box
```

実行結果イメージ：
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/4400b2cb-a016-8d5b-4e12-c7a1561bb4b6.png)

###4.[boxファイルの登録を確認](http://qiita.com/CsFactoryitter/items/d4d16f6fcd328c97ebc8#2box-list)
boxの一覧を表示し、Vagrantに登録されたかを確認する。

書式：

>vagrant box list

具体例：

```ps1:
vagrant box list
```

実行イメージ：
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/4e4ebada-7f6f-f128-74c1-4335ef9e5d01.png)

###5.[Vagrantfileの作成](http://qiita.com/CsFactoryitter/items/c3a5a23a38cf44ffdc40)
Vagrant起動用のVagrantfileを作成する。
以下のコマンドで実行後カレントフォルダに「Vagrantfile」が作成される。

書式：

>vagrant init \${box内での名前} 

例：

```ps1:
vagrant init manageterm
```

実行イメージ：
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/a7db6ff6-43ce-3ea8-9ebe-d2c5fb924b27.png)

###6.Vagrantfileの修正
(GUIを見える設定/ホストOSと同一ネットワーク内への設定)

Vagrantを実行するとVirtualBoxが起動するが、デフォルトではプロセスのみ起動してGUIでの状態が見えない。
またネットワークもVirtualBoxとの通信がNATになり、ホストOS(この場合Windows8)からゲストOS(この場合manageterm)へのアクセスが出来ない。（ゲストからルーティングしてホスト経由でインターネットに出る事は可能。）

Vagrantfileを編集して以下を設定する。

- 起動時にVirtualBoxを表示する

- ホストOSとゲストOSを同一セグメントに配置し通信可能にする

```bash:vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "manageterm"
  #ホスト名の設定
  config.vm.hostname = "manageterm"
  #ネットワークの設定(ホストとゲスト間のプライベートネットワーク（不要ならコメント)
  config.vm.network "private_network", ip: '192.168.134.195'
  #ネットワークの設定(ホストと同じセグメントのネットワークに入る設定)
  config.vm.network "public_network", ip: '192.168.102.195'

  config.vm.provider "virtualbox" do |vb|
  #VirtualBoxが起動している時にGUIで表示する
  vb.gui = true
  #メモリを1Gに設定
  vb.memory = "1024"
  end
end
```

###7.[Vagrantを起動](http://qiita.com/CsFactoryitter/items/364bfeb65700cf3db8a4)

書式：

>vagrant up

例：

```ps1:
vagrant up
```

実行イメージ：
![031.png](https://qiita-image-store.s3.amazonaws.com/0/98085/5832aef9-6eaa-02b1-c036-272aaa88d480.png)

(注釈)
*1.初回のみ「manageterm」のVirtualBoxイメージを作成している。
*2.Vagrantfileのネットワーク設定部分
【#ネットワークの設定(ホストとゲスト間のプライベートネットワーク（不要ならコメント)】がadapter2として設定されている
【#ネットワークの設定(ホストと同じセグメントのネットワークに入る設定)】がadapter3として設定されている
*3.起動直後の為、通信が間に合っていないだけなので無視する。ネットワーク設定が間違っている場合はこのログが出続ける
（その場合ネットワーク設定に誤りがある）
*4.Vagrantfileファイルのネットワーク設定部分
\#ホスト名の設定

```ps1:
Bringing machine 'default' up with 'virtualbox' provider…
==> default: Importing base box 'manageterm'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_box_default_1450866560619_16623
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
    default: Adapter 3: bridged
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => D:/_BLOG/BG001/vagrant_box
PS D:\_BLOG\BG001\vagrant_box>
```

Vagrantfileにて「GUI=true」の設定をしている為、VirtualBoxの画面が表示される。
「GUI=false」(もしくは設定しない)の場合でも表示されないだけで、プロセスとしては起動している為、起動確認がとれる。邪魔になった場合はfalseに設定しても良い。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/497e5246-2499-8b4e-b363-e1dbf2fdb607.png)

実際にVagrantを実行する、といってもVagrantは仮想ソフトウェアではないので、仮想化ソフトウェア（VirtualBox)を管理し起動するだけである。

今回は初回起動の為、

- boxファイル(D:\_BLOG\BG001\vagrant_boxfiles\basepackage.box)を元にVirtualBox用のイメージファイル(D:\_BLOG\BG001\vb\配下)の新規作成

- 作成したVirtualBoxの起動

を行ったが、2回目以降の起動時は、VirtualBox用のイメージ作成フェーズがない為、素早く起動する。
上記の通りVagrantは仮想マシンの管理ソフトウェアであり、仮想化自体は仮想化ソフトウェアにお任せという事がわかる。

##Linux設定編(SSHにて)

ここではWindows設定編にてVagrantを使用して起動した「manageterm」をAnsibleが使用できるように設定する。
 
Ansibleは標準のYUMリポジトリには入っていない。
今回の「manageterm」にはVagrantが利用できるよう、既にEPELリポジトリ利用可能な設定のLinuxからスタートしているが、Vagrantを使わずにAnsibleを利用する場合は、再帰EPELリポジトリを導入すること。

※(必要であれば)epel-releaseをインストール

```bash:
cd /tmp
wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum localinstall epel-release-7-5.noarch.rpm
```

<b>Ansibleのインストール</b>

AnsibleをEPELリポジトリよりインストールする。

書式：

```bash:
yum -y install ansible
```

実行結果イメージ：
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/c5bed93e-a4f0-3e9e-bcf1-7b405f708d2c.png)

```bash:
Running transaction
  インストール中          : python-crypto-2.6.1-1.el7.centos.x86_64                                                       1/17
  インストール中          : sshpass-1.05-5.el7.x86_64                                                                     2/17
  インストール中          : python-babel-0.9.6-8.el7.noarch                                                               3/17
  インストール中          : python-pyasn1-0.1.6-2.el7.noarch                                                              4/17
  インストール中          : python-keyczar-0.71c-2.el7.noarch                                                             5/17
  インストール中          : python-six-1.9.0-2.el7.noarch                                                                 6/17
  インストール中          : python-ecdsa-0.11-3.el7.centos.noarch                                                         7/17
  インストール中          : python-paramiko-1.15.1-1.el7.noarch                                                           8/17
  インストール中          : python-backports-1.0-8.el7.x86_64                                                             9/17
  インストール中          : python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch                                     10/17
  インストール中          : python-setuptools-0.9.8-4.el7.noarch                                                         11/17
  インストール中          : python-httplib2-0.7.7-3.el7.noarch                                                           12/17
  インストール中          : python-markupsafe-0.11-10.el7.x86_64                                                         13/17
  インストール中          : python-jinja2-2.7.2-2.el7.noarch                                                             14/17
  インストール中          : libyaml-0.1.4-11.el7_0.x86_64                                                                15/17
  インストール中          : PyYAML-3.10-11.el7.x86_64                                                                    16/17
  インストール中          : ansible-1.9.4-1.el7.noarch                                                                   17/17
  検証中                  : python-keyczar-0.71c-2.el7.noarch                                                             1/17
  検証中                  : libyaml-0.1.4-11.el7_0.x86_64                                                                 2/17
  検証中                  : python-jinja2-2.7.2-2.el7.noarch                                                              3/17
  検証中                  : python-setuptools-0.9.8-4.el7.noarch                                                          4/17
  検証中                  : python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch                                      5/17
  検証中                  : python-markupsafe-0.11-10.el7.x86_64                                                          6/17
  検証中                  : python-httplib2-0.7.7-3.el7.noarch                                                            7/17
  検証中                  : python-backports-1.0-8.el7.x86_64                                                             8/17
  検証中                  : python-six-1.9.0-2.el7.noarch                                                                 9/17
  検証中                  : python-crypto-2.6.1-1.el7.centos.x86_64                                                      10/17
  検証中                  : python-pyasn1-0.1.6-2.el7.noarch                                                             11/17
  検証中                  : PyYAML-3.10-11.el7.x86_64                                                                    12/17
  検証中                  : ansible-1.9.4-1.el7.noarch                                                                   13/17
  検証中                  : python-babel-0.9.6-8.el7.noarch                                                              14/17
  検証中                  : sshpass-1.05-5.el7.x86_64                                                                    15/17
  検証中                  : python-ecdsa-0.11-3.el7.centos.noarch                                                        16/17
  検証中                  : python-paramiko-1.15.1-1.el7.noarch                                                          17/17
 
インストール:
  ansible.noarch 0:1.9.4-1.el7
 
依存性関連をインストールしました:
  PyYAML.x86_64 0:3.10-11.el7                                            libyaml.x86_64 0:0.1.4-11.el7_0
  python-babel.noarch 0:0.9.6-8.el7                                      python-backports.x86_64 0:1.0-8.el7
  python-backports-ssl_match_hostname.noarch 0:3.4.0.2-4.el7             python-crypto.x86_64 0:2.6.1-1.el7.centos
  python-ecdsa.noarch 0:0.11-3.el7.centos                                python-httplib2.noarch 0:0.7.7-3.el7
  python-jinja2.noarch 0:2.7.2-2.el7                                     python-keyczar.noarch 0:0.71c-2.el7
  python-markupsafe.x86_64 0:0.11-10.el7                                 python-paramiko.noarch 0:1.15.1-1.el7
  python-pyasn1.noarch 0:0.1.6-2.el7                                     python-setuptools.noarch 0:0.9.8-4.el7
  python-six.noarch 0:1.9.0-2.el7                                        sshpass.x86_64 0:1.05-5.el7
 
完了しました!
```

Ansibleは、「/etc/ansible/」配下の「ansible.cfg」、「hosts」で変更及び設定を行う。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/11742cba-9e2e-dce3-2914-e824fa073226.png)

```bash:
[root@manageterm ~]# cd /etc/ansible/
[root@manageterm ansible]# ll
合計 16
-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
```

Ansibleを実際に動かす前に、Ansibleによって設定されるサーバ群をVagrantを使って先に作成していきます。

次回は「[最小構成CentOS7からAnsibleに制御されるCentOS7を構築する（On Vagrant）](http://qiita.com/CsFactoryitter/items/23fde5761f1243bcead6)」について。

<b><font color="#ff6633">連載の目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>