Ubuntu MAAS/Juju 2.0 で OpenStack Mitaka 構築 (その1)

**ネットワーク周りの設定で積んでいるのでこの記事は参考程度に御覧ください.**

MAAS 2.0 + Juju 2.0 を使って OpenStack を構築した際の覚書.
構成が複数のマシンから成るが，以下説明においてコンソール操作はすべて Controller ノード上で行われる.

# 構成
![overview.png](https://qiita-image-store.s3.amazonaws.com/0/38708/1ad65f95-1937-52fd-01fd-28bf51990e6c.png)

必須条件として

* 全ノードが 2 枚のNICを持つ.
* Controller ノード以外のすべてのノードは OS インストール用のストレージに加え，LXDのコンテナイメージを格納するための別のストレージを持ち，それぞれ `/dev/sda`, `/dev/sdb` で認識できる.


# 1. MAAS 導入
## 1.1. 事前準備

### ネットワーク・インタフェースの設定
maas の enp8s0, enp9s0 インターフェースを設定する.

```text:/etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp8s0
iface enp8s0 inet dhcp

# The secondary network interface
auto enp9s0
iface enp9s0 inet static
  address 10.1.0.1
  network 10.1.0.0
  netmask 255.255.255.0
  broadcast 10.1.0.255
```

### Controller ノードのゲートウェイ化
Controller ノード maas を MAAS 管理下物理マシンのネットワークゲートウェイとして用いる.
※ 本来は Private Network から Public Network へのゲートウェイを別で設けるべき. MAAS ノードは各ノードからのログの収集なども行い、トラフィックが多いため.

IPv4フォワーディング有効化.

```text:/etc/sysctl.conf
# コメントアウトを外す
net.ipv4.ip_forward=1
```

IPマスカレードを有効化.

```
$ sudo iptables -t nat -A POSTROUTING -s 10.1.0.0/255.255.255.0 -j MASQUERADE
$ sudo iptables-save -c > iptables.rules && sudo mv iptables.rules /etc/iptables.rules
$ sudo vi /etc/network/if-pre-up.d/iptables_start
```

```bash:/etc/network/if-pre-up.d/iptables_start
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules
exit 0
```

```
$ sudo chmod +x /etc/network/if-pre-up.d/iptables_start
$ sudo reboot
```

## 1.2. MAAS 2.0 のインストール
apt で最新の maas をインストールする.

```
$ sudo apt-add-repository -y ppa:maas/stable
$ sudo apt update
$ sudo apt install maas
```

ユーザを作成する.

```
$ sudo maas createadmin
```

`http://<your.maas.ip>:5240/MAAS/` が開けることを確認.

## 1.3. MAAS の設定
MAAS でプライベートネットワーク (10.1.0.0/24)において DHCP サーバを提供するための設定を行う.

MAAS Web GUI にてログイン後，プライベートネットワークの "untagged" をクリックし， VLAN Summary を開く.

![MAAS1.png](https://qiita-image-store.s3.amazonaws.com/0/38708/d4bc63ef-34c7-3cdd-7f8d-740ccd69009b.png)

右上の「Take action」の欄から「Provide DHCP」を選び，適宜設定を入力して「Provide DHCP」を押す.
![MAAS2.png](https://qiita-image-store.s3.amazonaws.com/0/38708/389ca112-6b1d-230b-64ff-519f0f10fc8f.png)


## 1.4. Juju Controller 用の KVM インストール
### qemu-kvm インストール
```
$ sudo apt install qemu-kvm libvirt0 libvirt-bin virt-manager bridge-utils
```

### ブリッジネットワーク br0 を作るために設定を行う.

```
$ sudo vim /etc/network/interfaces
```

```text:/etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp8s0
iface enp8s0 inet dhcp

# The secondary network interface
auto enp9s0
#iface enp9s0 inet static
#  address 10.1.0.1
#  network 10.1.0.0
#  netmask 255.255.255.0
#  broadcast 10.1.0.255
iface enp9s0 inet manual

# Bridge br0
auto br0
iface br0 inet static
  address 10.1.0.1
  network 10.1.0.0
  netmask 255.255.255.0
  broadcast 10.1.0.255
  gateway 10.1.0.1
  dns-nameservers 10.1.0.1 8.8.8.8
  bridge_ports enp9s0
  bridge_stp off
```

### virt-manager を使って仮想マシンを作成する.

Virtual Machine Manager を起動する.

```
$ virt-manager
```

PXE ブートする VM を `juju-controller` という名前で作成.
![new_vm.png](https://qiita-image-store.s3.amazonaws.com/0/38708/8427b210-4cd0-3eb4-a228-be35078ab4b5.png)


### maas ユーザに `virsh` 操作の権限を与える.

```
$ sudo adduser maas libvirtd
```

## 1.5. MAAS へのマシンの登録

各ノード juju-controller(KVM), neutron, mountainlion, mountainlion-2, cl5 を順に電源投入し， Web GUI の Nodes に現れることを確認.
適宜名前を変更する.

すべてのノードに対し， **Power type** の設定欄を正しく設定し， **Commission** を行う.
Storage の情報が取得されるまで Commission の操作を繰り返し行う. (最低2回は必要だった)
**注意: Commission の操作は， ノードの電源が OFF の状態でないと正しく行われない.**

なお，KVM の Power 欄は以下のように設定する.

|項目|設定値|
|---|---|
|Power type|Virsh (virtual systems)|
|Power address|qemu:///system|
|Power ID|juju-controller|
|Power password (optional)| (空) |

※ MAAS サーバと KVM ホストが同一マシンでない場合は [MAAS | Add Nodes](http://maas.io/docs/en/installconfig-add-nodes) を参照

最終的にこんな感じになる.
<img width="1182" alt="Screen Shot 2016-11-02 at 11.30.40 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38708/1af6c443-3d18-0baf-5921-3c486f879440.png">


# 2. Juju 導入
## 2.1. Juju 2.0 導入
Controller ノードへ apt にて Juju 2.0 を導入する.

```
$ sudo apt-add-repository -y ppa:juju/stable
$ sudo apt update
$ sudo apt install juju-2.0
```

## 2.2. Juju に MAAS Cloud を追加
適当な場所に読み込む設定ファイルを作る.

```
$ vi ~/maas-clouds.yaml
```

```text:~/maas-clouds.yaml
clouds:
   my-maas:
      type: maas
      auth-types: [oauth1]
      endpoint: http://fqdn.of.maas:5240/MAAS
```

クラウド環境 `my-maas` を Juju に追加する.

```
$ juju add-cloud my-maas ~/maas-clouds.yaml
$ juju list-clouds
```

`my-maas` 用の認証設定を追加する.

```
$ juju add-credential my-maas
Enter credential name: my-maas
Using auth-type "oauth1".
Enter maas-oauth:
Credentials added for cloud my-maas.
```

※ Apiキーは MAAS 管理画面の アカウント > ユーザ設定 のページから取得できる.


## 2.3. Juju Bootstrap

クラウド環境 `my-maas` に OpenStack 用のコントローラを作る.

```
$ juju bootstrap my-maas openstack-controller
```

## 2.4. Juju GUI

juju-controller ノード上で juju-gui が動いているので, URL を確認する.

```
$ juju gui --no-browser
https://10.1.0.2:17070/gui/.../
```

Controller ノード上でポートフォワーディングを設定する.

```
$ sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 17070 -j DNAT --to-destination 10.1.0.2:17070
$ sudo iptables-save -c > iptables.rules && sudo mv iptables.rules /etc/iptables.rules
```

`http://<your.maas.ip>:17070/gui/...` にアクセスして Juju GUI が開けることを確認.

なお, 一応ユーザを作っておく.

```
$ juju add-user hoge
$ juju grant hoge admin default
$ juju change-user-password hoge
```


# 3. OpenStack Mitaka 構築
`openstack-base-48` の Juju Charm をデプロイすることで，my-maas 上に OpenStack を構築する.

## 3.1. MAAS にてタグと NIC の設定
`openstack-base-48` のデプロイの際に neutron-gateway のデプロイ先が neutron ノードに成るよう、 MAAS にてタグを設定する.

<img width="1316" alt="Screen Shot 2016-11-03 at 12.44.39 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38708/a2c1168d-7d2a-1cf1-aa6c-c5c6fed47759.png">

また， neutron ノードおよび compute ノードのネットワークインターフェース名を `openstack-base-48` で用いられる設定と合わせ，以下のように設定する.

|インタフェース名|ネットワーク|
|:---:|:---|
|eth0|プライベートネットワーク (10.1.0.0/24)|
|eth1|パブリックネットワーク (133.68.xxx.0/24)|

<img width="1519" alt="Screen Shot 2016-11-03 at 3.27.42 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38708/95953cc5-e017-a302-ae8a-3889dc0ec744.png">


## 3.2. Juju Charm の編集
[openstack base | Juju](https://jujucharms.com/openstack-base/) のサイトより，`cs:bundle/openstack-base-48` の archive を落としてくる.

```
$ wget https://api.jujucharms.com/charmstore/v5/openstack-base/archive
$ mv archive archive.zip
$ unzip archive.zip
```

`bundle.yaml` を適宜変更する.

```yaml:bundle.yaml
machines:
  '0':
    constraints: arch=amd64
    series: xenial
    tags: gateway # 追加
...
```
※ 本来はこの constraint で十分なはずだが，2度目以降のデプロイで何故か `tags` constraint が無視されるようになったため，`mem` の項目を追加して意図的に neutron が machine 0 に割り当てられるようにした.

## 3.3. Juju Charm デプロイ

2.3 節で bootstrap した `openstack-controller` が選択されていることを確認.

```
$ juju switch
openstack-controller:admin/default
```

openstack-base の charm をデプロイ.

```
$ juju deploy bundle.yaml
```

しばらくするとデプロイが完了する.
<img width="962" alt="Screen Shot 2016-11-30 at 3.26.36 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38708/c035517c-0139-dba2-0217-7cc84fec7879.png">


OpenStack ダッシュボードを公開する.

```
$ juju expose openstack-dashboard
```

上に記載されている通り，プライベートネットワーク内の
　`http://10.1.0.16/horizon`
にアクセスして、ユーザ名 admin , パスワード openstack でログインができることを確認.

あとは apache 等でリバースプロキシを建てるなりしてパブリックネットワークからも OpenStack ダッシュボードへアクセスできるようにするなどできる.


**続く→** [Ubuntu MAAS/Juju 2.0 で OpenStack Mitaka 構築 (その2)](http://qiita.com/tglovernuppy/items/f16c73ef5280dbb0cafc)

# 参考文献
* [Ubuntu 14.04のルーター化 - Qiita](http://qiita.com/Kshi-Kshi/items/2fa1436248f1d4938861)
* [openstack base | Juju](https://jujucharms.com/openstack-base/)
* [MAAS Documentation](http://maas.io/docs/en/)