RancherOS on XenServer

# 今回の内容

今回はXenServer上にVMをRancherOSで作成し、Xen-toolsなんかを入れるところを書きます。

# 背景

RancherServerをオンプレに構えることになったのですが、そんなに容量やパワーが必要ではないのでDockerが入った小さなVMでOKなんですよ。
RancherServer自体がコンテナなので軽量なコンテナ用OSということでRancherOSにしました。
本番でもRancherOSで行くつもりです。迷わず行けよ。行けばわかるさ。

でも大事な大事な管理サーバーなので、VMを動かす環境はちゃんと作ってホストの障害時には正常なホストにマイグレーションしてほしかったり、いちいちログインしなくてもVMの状況がパッと見られるようにしたいのです。

**そこでXenServerですよ奥さん**

# XenServerはいいぞ

何がいいって？

- 無償のOSSプロダクト。Citrixが有償サポートしてます。
- 無償版と有償版の違いが殆どなく、以下の機能は無償版でも使えます。十分でしょ？
    - 複数サーバでクラスタ構成
    - XenCenterというGUIクライアントツールでVMやクラスタの管理
    - クラスタのローリングアップデート
    - クラスタ内でVMのマイグレーション
    - VMのHA構成
    - VMの定期スナップショット
    - etc

# やってみよう

## 各バージョン

- XenServer:7.1
- RancherOS:1.0.0

## VM作成

ここからはXenCenterでの操作が前提です。

1. VMテンプレートは Other install media を選択
![2017-04-26_14h04_44.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/c7118807-5501-8ce8-0455-b33f3ec7d0c8.jpeg)

2. 名前とかは適時


3. インストールメディアはRancherOSのISOを指定。（[ここ](https://github.com/rancher/os)から入手可能）
![2017-04-26_14h33_33.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/e49080d5-47f5-619d-fa08-9a4723f78c6b.jpeg)
4. ホームサーバーの指定も適時

5. CPUとメモリも適時。[メモリは最低でも１GiB必要です。](https://docs.rancher.com/os/)
![2017-04-27_16h19_43.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/340598e5-c2b7-6e17-c28c-4da5890356d8.jpeg)

6. Diskはとりあえず30GBくらい。あとから増やせるしね。

7. NWは環境に合わせて
![2017-04-27_16h23_37.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/d3b3355e-d45f-87de-8c8b-3bc69eb80c60.jpeg)

8. そして内容を確認して**「作成！」**
![2017-04-27_16h23_45.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/6a8bc950-814f-10fe-8f95-3f92da925e06.jpeg)

しばらくするとVMがiso起動して、コンソールに牛が出てきます。可愛いよ牛


![2017-04-27_16h27_55.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/6e4d1574-2b6d-5d66-f18f-06e8d5bc0c82.jpeg)

## インストール作業

isoでbootしただけなので、ここからがインストール作業です。

このままコンソールでやってもいいんだけど、XenCenterはコピペができないので、公開鍵の入力で死ねます。

リモートでログインできるようにしましょう。

### Rancherユーザのパスワード設定（コンソールでの作業）

一時的にパスワードでログインできるようにします。

```bash
$ sudo passwd rancher
```

### IPアドレスの設定（コンソールでの作業）

DHCPが有効な環境では不要です。固定IPの環境では以下のようにしてIPアドレスとデフォゲを登録してください。

```bash
$ sudo ip addr add 192.0.2.0/24 dev eth0
$ sudo route add default gw xxx.xxx.xxx.xxx
```
しばらくすると、リモートでSSH接続できるようになります。

## yml作成

cloud-config.ymlというファイルを作成し、公開鍵の設定などを書いてインストールします。
色々と記述できるんですが、記述をミスると起動に失敗してdebugが面倒だし、OSに関する設定はインストール後でもできるので、慣れるまではあんまり書かない方がいいです。
慣れてきたらcloud-config.ymlで。環境の構成が１つのファイルで収まるので非常に便利です。

```bash
vi cloud-config.yml
```
以下が今回作ったymlです。例によって固定IPなのでその設定をしています。
hostnameやinterfacesの部分は環境に合わせて記述してください。

DHCP環境の場合は、networkの記述は不要です。

```yaml:cloud-config.yml
ssh_authorized_keys:
 - ssh-rsa AAAA....

hostname: <適時>

rancher:
 network:
  dns:
   nameservers:
    - xxx.xxx.xxx.xxx
  interfaces:
   eth*:
    dhcp: false
   eth0:
    address: xxx.xxx.xxx.xxx/xx
    gateway: xxx.xxx.xxx.xxx
    mtu: 1500

```

## RancherOSをDiskにインストール

以下のコマンドで実行

```bash
$ sudo ros install -c cloud-config.yml -d /dev/xvda
```
コマンド実行後に

`Installing from rancher/os:v1.0.0
Continue [y/N]:`

て聞かれるので y を押す。
しばらくすると

`Continue with reboot [y/N]:`

て聞かれるので、XenCenterでisoをイジェクトしてから y を押す。
イジェクトを忘れるとまたisoでbootしちゃうので気を付けてください。

無事インストールが終わると牛が出てきます。

![2017-04-27_17h05_44.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/63c9b819-c4b9-91b7-30c9-f232a043b1fc.jpeg)


eth0 のところにIPアドレスが表示されます。固定IPの場合はさっきymlに書いたIPアドレスと同じIPアドレスになるはずです。

rancherユーザで秘密鍵を使ってリモートログインしてみましょう。

## Xen-toolsのインストール

xen-toolsというのがありまして、これを入れるとですね

1. パフォーマンスの向上
2. ライブマイグレーションが可能になる
3. XenCenterからリソース使用状況をグラフで確認可能
4. メモリを含んだスナップショットの作成が可能になる

素晴らしい！入れましょう。

普通のOSだとXenCenterからisoをマウントしてinstall.sh実行すればおｋなんですが、今回はちょっと違います。

詳しくは[こちら](https://github.com/Klowner/rancher-xe-guest-utils)をご覧ください。RacnherOSにxe-guest-utilitiesを入れます。

```bash
$ sudo ros service enable https://raw.githubusercontent.com/Klowner/rancher-xe-guest-utils/master/xe-guest-utils.yml
```

cloud-config.ymlに記述することもできます。その場合は以下のように記述してください。

```yaml
#cloud-config.yml
rancher:
  services_include:
     https://raw.githubusercontent.com/Klowner/rancher-xe-guest-utils/master/xe-guest-utils.yml: true
```

今回はコマンドで入れました。

```bash
$ sudo ros service enable https://raw.githubusercontent.com/Klowner/rancher-xe-guest-utils/master/xe-guest-utils.yml
Pulling xe-guest-utils (klowner/rancher-xe-guest-utils:6.6.80)...
6.6.80: Pulling from klowner/rancher-xe-guest-utils

c52e3ed763ff: Pull complete
d50a1b57139d: Pull complete
6d0e66351103: Pull complete
fa25b714bd6c: Pull complete
Digest: sha256:86ebe9f68c62c53feaa63d3e97d0811c3bdebf3eac8778001e85d8632f346ea8
Status: Downloaded newer image for klowner/rancher-xe-guest-utils:6.6.80
```
この後再起動してください。

再起動後のコンソールで xe-guest-utils の起動を確認できます。

![2017-04-27_17h32_54.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/7092d327-f21f-62f5-4480-847d8f39bbd4.jpeg)

リソース状況もグラフ表示できるようになりました。

- 入れる前

![2017-04-27_17h26_41.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/4bb47ee5-edbc-e940-e82e-7b6d00a9ff0d.jpeg)

- 入れた後

![2017-04-27_17h33_55.jpg](https://qiita-image-store.s3.amazonaws.com/0/151399/464da8ea-1534-ad50-051d-95cd6b45a915.jpeg)


## その他の設定

### パスワード設定

ローカルコンソールからパスワードでログインできるようにします。
これをしないとNW障害時にログインできなくなって詰みます。

cloud-config.ymlに以下を追記してください。

```yaml
write_files:
  - path: /etc/ssh/sshd_config
    permissions: "0600"
    owner: root:root
    content: |
       Port 22
       ClientAliveInterval 180
       AuthorizedKeysFile .ssh/authorized_keys
       PasswordAuthentication no
       ChallengeResponseAuthentication no
       Subsystem       sftp    /usr/libexec/sftp-server
       UseDNS no
       PermitRootLogin no
       ServerKeyBits 2048
       AllowGroups docker
```

後はインストール完了後にsshで鍵を使ったログインをして。

```bash
$ sudo passwd rancher
```
で変更してください。

### TimeZone

デフォルトだとUTCになっています

```bash
$ date
Thu Apr 27 08:39:09 UTC 2017
```

JSTに変えましょう

```bash
$ sudo ros config set rancher.services.console.environment.TZ "JST-9"
```

ymlに書く場合は

```yaml
    rancher:
      services:
        console:
          environment:
            TZ: 'JST-9'
```

でおｋです。

### ntp

今回はnictと同期する設定です。環境に合わせて変更してください。

```yaml
  write_files:
    - path: /etc/ntp.conf
      permissions: 0644
      content: |
          tinker panic 0
          default kod nomodify notrap nopeer noquery
          restrict -6 default kod nomodify notrap nopeer noquery

          restrict 127.0.0.1
          restrict -6 ::1

          restrict 133.243.238.163 mask 255.255.255.255 nomodify notrap noquery
          restrict 133.243.238.164 mask 255.255.255.255 nomodify notrap noquery
          restrict 133.243.238.243 mask 255.255.255.255 nomodify notrap noquery
          restrict 133.243.238.244 mask 255.255.255.255 nomodify notrap noquery

          server ntp.nict.jp
```


### 設定の確認とバックアップ

`sudo ros config export`

で現在の設定をyml形式で確認できます。

```bash
$ sudo ros config export
EXTRA_CMDLINE: /init
hostname: ranchermg01
rancher:
  autologin: tty1
  environment:
    EXTRA_CMDLINE: /init
  network:
    dns:
      nameservers:


```

これを保存しておけば、同じ環境があっさり作れます。

僕みたいにymlに慣れないと最初は苦労しますが、慣れればコマンドをカチカチやるよりよっぽど楽です。
ymlファイルが1個なのでバージョン管理も簡単だし。

これでRancherserverの土台が出来ました。ちゃんとライブマイグレーションもします。

そう、XenServerならね。

# 参考Link

以下のサイトを参考にしました。ありがてぇ

[RancherJPの Q And A](http://www.rancher.jp/qa/)

[Rancher Meetup Tokyo #1 RancherOS のymlを書いてみる](http://qiita.com/FoxBoxsnet/items/3089857fd035eb6b5108)

[RancherOS rosコマンドを少し使ってみる [メモ]](http://qiita.com/FoxBoxsnet/items/59fbbb70c8e8e84e6408)