Hyper-VでCentOS7立ててAnsibleでPing打つまでやってみた

※この記事自体ははてなブログの過去記事（2015年）から移転しました。内容古めなのでご注意ください。

# 構想

Immutable Infrastructureという言葉が一通り流行り、もはや定着し、次の概念に移りつつあります。概念がツールを作り、ツールが概念を作り…といった状況で、相変わらずIT業界は流れが早いです。

[http://www.publickey1.jp/blog/14/immutable_infrastructure_1.html:embed:cite]

さて、そんな中で手軽に使えるCentOSのテスト環境が欲しくなってきました。CakePHP用のテスト環境を作りたいのですが、どうせならImmutable Infrastructureも体感しながらやれるテスト環境が欲しいと思い、とりあえずAnsibleにまで手を出そうと思います。

[http://www.1x1.jp/blog/2014/10/automate-server-tasks-with-ansible.html:embed:cite]

Immutable Infrastructureなら仮想マシンでしょ。ということで今回はあまりネット上で騒がれていないHyper-Vを使っていきたいと思います。巷で話題のVatualBox－Vagrant構成も良いのですが、手元のPCはWindowsですし、別にHyper-VでいいじゃないかということでWindows8.1＆Hyper-V構成でいくことにします。

クライアントはWindows、クラウドはAzureで、サーバーもWindows Serverが多い状況なので、その検証環境も含めて色々やりたいなーとなると、Hyper-V使う方が速度や互換性など気にせずにやりやすそうです。それにHyper-VマネージャーはGUIとしては割と使いやすい方なので、初心者でも抵抗感なく入ることが出来ます。

Hyper-Vについての詳しい解説はこちらが分かりやすいです。

[http://www.atmarkit.co.jp/ait/articles/1212/06/news103.html:embed:cite]


仮想マシンをせっかく使うので、構成としてはCentOS7のVMイメージ（VHD）を作成し、それを立てては消して立てては消してを繰り返すような感じにしましょう。Hyper-VではVMイメージを作る他、チェックポイントを作成して、その時の状態を保存し、戻せるようにすることも出来ます。


# 構成

- ホストOS
    - Windows8.1
    - Hyper-V
- AnsibleServer（VM）
    - CentOS 7.1
    - Ansible 1.9.2
- Client（VM）
    - CentOS 7.1


# 仮想マシンの作成

まずはHyper-Vを使えるようにし、VM用の箱を作っていきます。
箱が出来たら次にCentOS7をインストールします。


## Windows8.1のHyper-VをONにする

先ほどのHyper-V解説記事の方が詳しいので軽く手順だけ載せておきます。

1. 「コントロール パネル\すべてのコントロール パネル項目\プログラムと機能」を表示します。
2. 「Windowsの機能の有効化または無効化」をクリックします。
3. 「Hyper-V」にチェックを入れ、「OK」ボタンをクリックします。
4. 必要に応じて再起動すれば完了です。

[http://www.atmarkit.co.jp/ait/articles/1212/06/news103.html:embed:cite]


## Hyper-Vマネージャーで新規仮想マシンを作成

こちらも先ほどの記事の方が詳しいです。

1. Hyper-Vマネージャーを起動します。
2. Hyper-Vマネージャー左側に自身のHyper-V（PC名）が表示されていると思います。これをクリックして選択します。
3. Hyper-Vマネージャー右側の「仮想スイッチマネージャー」を選択します。
4. 仮想スイッチを作成します。表示されている選択肢から、「外部」を選んで「仮想スイッチの作成(S)」をクリックします。
5. 仮想スイッチの名前だけ変更し、「OK」を押してダイアログを閉じます。
6. Hyper-Vマネージャー右側の「新規」から「仮想マシン(M)...」を選択します。
7. ウィザードに従って仮想マシンを作成します。


ウィザードでポイントになるのはこんなところでしょうか。

- 世代は第一世代を選ぶ（第二世代はWindows8やWindows Server 2012などでしか使えません）
- ネットワークの構成で4番で作成した仮想スイッチを選ぶ（これでインターネットに接続出来るようになります。）
- 仮想ハードディスクは新しいものを作成する（テスト用であればサイズは数十GBあれば十分すぎると思います。）
- インストールオプションは「後でオペレーティングシステムをインストールする(L)」を選択する


Hyper-Vのネットワークについてはこちらの記事が分かりやすいです。


[http://ebi.dyndns.biz/windowsadmin/2013/04/18/hyper-v%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B-%E5%A4%96%E9%83%A8%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF/:embed:cite]


# CentOSのインストール

VM用の箱が出来たので、CentOS7をインストールしましょう。
CentOS7がインストール出来たら、それをVHDイメージ化して、VMを大量生産出来るようにします。

## CentOS7イメージのダウンロード

Hyper-Vの準備が出来たので、仮想マシンにインストールするCentOS7のイメージをダウンロードしてきます。


下記のページから良さそうなCentOS7のISOファイルをダウンロードします。
[https://www.centos.org/download/]


今回はminimalを使うので、下記のページからダウンロードしておきます。
[http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso]


## CentOS7イメージのインストール

1. 先ほど作成した仮想マシンを選択し、Hyper-Vマネージャーの右下にある「設定...」を選択します。
2. 設定ダイアログの左にあるメニューから「DVDドライブ」を選択します。
3. イメージファイルを選択し、先ほどダウンロードしたCentOSのISOイメージを選択し、「OK」ボタンを押します。
4. Hyper-Vマネージャーの右下にある「起動」を選択します。
5. Hyper-Vマネージャーの右下にある「接続...」を選択します。
6. CentOS7のインストールが開始します。


CentOS7のインストールについては下記の記事が詳しいです。
今回はminimalなので初期セットアップなどいくつか省けるところもあります。起動すると、CUIで立ち上がります。

[http://kajuhome.com/centos7_inst.shtml:embed:cite]


## CentOS7のVHDイメージの作成

テストを行うのに、毎回CentOS7をインストールし、更新をかけるのは面倒です。
そこで、更新などの初期セットアップが終わったものをVHDファイルとしてエクスポートしておきましょう。

1. CentOS7の初期セットアップを行う。
    - sudo yum upgrade
    - 標準で入れておきたいものや設定などあれば入れる
2. Hyper-Vマネージャーの右下にある「エクスポート」を選択します。
3. 保存先を指定して保存しておきます。

# 各VMの作成とSSHの設定

VHDイメージが出来たので、これを基に各VMを作成します。
VMを作成したら、秘密鍵を使ったSSHで通信が出来るよう、設定します。

## テスト用VMの作成

今回はテスト用に2台のVMを作成しましょう。先ほど作成したCentOS7のVHDを使って2台分のVMを作っていきます。
作成するマシン名は分かりやすく、AnsibleServerとClientとでも名付けておきます。AnsibleServerにAnsibleを立て、Clientに命令を投げClient環境を構築するといったイメージです。

1. Hyper-Vマネージャーの右にある「仮想マシンのインポート...」を選択します。
2. ウィザードに従って仮想マシンを作成します。
3. 作成後、仮想マシン一覧から作成した仮想マシンを右クリックして、「名前の変更(N)...」を選択し、適当な名前に変えます。
4. 仮想マシンに接続し、「ip addr」でIPアドレスを確認します。

ポイントは下記のようなところでしょうか。

- インポートするイメージはフォルダ単位で指定して検索させます。先ほどVHDイメージを作成した時に指定した保存先を指定すると良いと思います。
- インポートの種類は「仮想マシンをコピーする（新しい一意なIDを作成する）(o)」を選びます。
- 仮想マシンの格納場所は各マシンの名前でフォルダを作成し、そこに入れておくと良いでしょう。
- 出来ればnmtuiなどで固定IPやホスト名を設定しておくと良いのですが、テストなのでDHCPでも良い気がします。
- 毎回作成するのが面倒であればチェックポイントを作成しておくと便利です。


## SSHの設定（秘密鍵の作成と配置）

AnsibleServerからClientにはsshで接続します。
そこで、双方に秘密鍵の設定を行います。


1. AnsibleServer側で「ssh-keygen」を実行し、秘密鍵と公開鍵を作成します。
2. AnsibleServer側で「ssh-copy-id」を実行し、Client側へ公開鍵を送信します。


AnsibleServer側
```ssh
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
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:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX root@AnsibleServer
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+-----------------+

# ssh-copy-id root@＜ClientのIPアドレス＞
The authenticity of host '＜ClientのIPアドレス＞ (＜ClientのIPアドレス＞)' can't be established.
ECDSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@＜ClientのIPアドレス＞'s password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@＜ClientのIPアドレス＞'"
and check to make sure that only the key(s) you wanted were added.

```

毎回パスワードを入力するのが面倒であればssh-agentを使って登録しておくと楽です。


SSH周りはこの記事が詳しいです。

[http://www.momonga-linux.org/docs/OpenSSH-HOWTO/ja/Clients.html#KeyGenerate:title]

[http://qiita.com/tag1216/items/5d06bad7468f731f590e:embed:cite]



# AnsibleでPing！

さて、各VMが出来たので、いよいよAnsibleをインストールし、Pingテストをしてみましょう。

## Ansibleのインストール

Ansibleをインストールするためにrpmを追加します。
その後、yumでインストールすればOKです。

AnsibleServer
```ssh
# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# sudo yum install ansible
```

## Ansibleの設定

とりあえずPingを打つだけなのですが、hostの設定くらいは見ておきましょう。
「/etc/ansible/hosts」が管理対象の設定です。ひとまずこのファイルの末尾にClientのipアドレスを入力し、保存しておきます。

## Ping

あとはコマンドを打つだけです。

AnsibleServer
```ssh
# ansible ＜ClientのIPアドレス＞ -m ping
Enter passphrase for key '/root/.ssh/id_rsa':
＜ClientのIPアドレス＞ | success >> {
    "changed": false,
    "ping": "pong"
}
```

いかがでしょうか。Pongされたら成功です。