OPNFV Apex (Release Colorado)を使ってCentOS7上にlibvirt/OpenStack (RDO版newton)/OpenDaylightの環境を構築する

#はじめに
本記事ではCentOS7をインストールした状態から、Apexというインストーラを使って一台のサーバにOpenStackとOpenDaylightをvirsh/qemu環境にインストールするまでを主に説明します。その後に簡単な使い方を説明します。

#OPNFV Apexとは (超簡単説明)
[OPNFV](https://www.opnfv.org/)とはNFVをオープンソースのプラットフォームで実現しようぜ! というプロジェクトで、ApexとはOPNFVの中でRed Hatが主導しているCentOS/TripleOを使ったOPNFVの実装(インストーラ)のプロジェクトです。

OPNFVのリリースでは名前にアルファベット順に川の名前が使われており、最新バージョンはColoradoとなっています。

Apexを使用すると以下のような環境を簡単に立ち上げることが可能です。

- Undercloud (TripleO用OpenStackインストール用VM) x 1
- OpenStack Controller+OpenDaylight x 1 (HAの場合は2台)
- Compute x 2

それぞれのVMは4つのネットワークと以下のように接続されます

- admin_network (インストール時に使用)
- public_network
- private_network (Controller, Computeのみ)
- storage_network (Controller, Computeのみ)

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/2291/dfca0180-dfd1-da1b-c38d-e1cab1b95a67.png)



##Apexのインストールの必要条件
Apexのインストールに必要なサーバの条件は以下となります(正直かなり厳しめです…)

- CPUコア 16以上が理想 (仮想VM用, それより低い場合はover subscriptionになります)
- メモリ 64G以上 (実際はもうちょっと減らせます)
- HDD 100G以上

#インストールについて

##CentOS7のインストール・設定

CentOS7を普通にインストールした後に以下のコマンドで各種必要なパッケージをインストールします。
もしOpenStack,OpenDaylightのweb UIを他のマシンから使いたい場合はtinyproxyもインストールします。

###補足
もし既存にインストールして使っているCentOS7がある場合それを使用することも可能ですがlibvirtの設定などが競合する可能性があります。

ちなみに筆者はインストール時はcore packageのみの構成(デフォルトで何も特殊なパッケージを入れない状態)でインストールしました。


```bash
yum update -y
yum groupinstall -y "Virtualization Host" "Development Tools"
yum install -y python-setuptools docker-io 

# Epel, RDOの登録
yum install -y https://www.rdoproject.org/repos/rdo-release.rpm epel-release
yum install -y python34 libvirt-python tinyproxy

systemctl enable libvirtd.service
systemctl enable docker.service
systemctl enable firewalld.service

#tinyproxyの設定、OpenStack/ODLのGUIをリモートで見ないならば不要
cp /etc/tinyproxy/tinyproxy.conf{,.orig} 
cat << EOF  >> /etc/tinyproxy/tinyproxy.conf
Allow <アクセスを許したい IPアドレス>
Listen <このサーバーのIP>
# noVNC
ConnectPort 6080
# ODL web UI
ConnectPort 8181
EOF
systemctl start firewalld.service
firewall-cmd --add-port=8888/tcp --zone=public --permanent
systemctl enable tinyproxy.service
```

ここで各種サービスの起動のために再起動します。`systemctl restart`でサービス毎に再起動をかけてももちろん構いません。

```bash
reboot
#または
systemctl restart libvirtd.service
systemctl restart docker.service
systemctl restart tinyproxy.service
```

##Apexの取得・インストール
Apexに必要なパッケージを取得・インストールします。"apexのパッケージのダウンロード"の箇所については[Apexのダウンロードページ(最新stable)](https://www.opnfv.org/opnfv-colorado-tripleo-users-20)や[スナップショットの保存場所](http://artifacts.opnfv.org/apex.html)を参照して最新のRPMを取得するといいと思います。

```bash
wget \
http://artifacts.opnfv.org/apex/dependencies/python3-ipmi-0.3.0-1.noarch.rpm \
http://artifacts.opnfv.org/apex/dependencies/python3-jinja2-2.8-5.el7.centos.noarch.rpm \
http://artifacts.opnfv.org/apex/dependencies/python34-markupsafe-0.23-9.el7.centos.x86_64.rpm

yum install -y python3-ipmi-0.3.0-1.noarch.rpm \
python34-markupsafe-0.23-9.el7.centos.x86_64.rpm \
python3-jinja2-2.8-5.el7.centos.noarch.rpm

# apexのパッケージのダウンロード (*1)
# https://www.opnfv.org/opnfv-colorado-tripleo-users-20 から最新の安定版を、
# http://artifacts.opnfv.org/apex.html から開発中のスナップショットを取得可能です
wget \
http://artifacts.opnfv.org/apex/colorado/opnfv-apex-3.0-20161112.noarch.rpm \
http://artifacts.opnfv.org/apex/colorado/opnfv-apex-common-3.0-20161112.noarch.rpm \
http://artifacts.opnfv.org/apex/colorado/opnfv-apex-undercloud-3.0-20161112.noarch.rpm 

yum install -y opnfv-apex*.rpm
```

##Apexの設定
Apexではインストールの設定ファイルとして`deploy_settings.yaml`(インストール構成用)と`network_settings.yaml`(ネットワーク構成用)の2つのファイルを使用します。まずはそれらのサンプルファイルをベースに設定を変更していきます。

```bash
cp /usr/share/doc/opnfv/deploy_settings.yaml.example ~/deploy_settings.yaml
cp /usr/share/doc/opnfv/network_settings.yaml.example ~/network_settings.yaml
```

###インストール構成の設定
Apexではインストール時にどのようなソフトウェアでインストールするか(tacker, congressの有無)、HA構成にするか等の構成を変えることができます。それらの設定は先程コピーしたYAMLファイル`~/deploy_settings.yaml`を修正することで可能です。その他に[設定済みシナリオ](http://artifacts.opnfv.org/apex/colorado/2.0/docs/installationprocedure/index.html#opnfv-scenarios-in-apex)のdeploy_settings.yamlファイルが`/etc/opnfv-apex/`配下にありますので、これらを使うことも可能です。


###ネットワーク構成の設定
ネットワーク構成ではDNSサーバーのアドレスやインストールするOpenStackのネットワーク構成を変更することが可能です。設定例は`/usr/share/doc/opnfv/`と`/etc/opnfv-apex`に存在しますので参考に先程コピーした`~/network_settings.yaml`を修正して下さい。

##Apexのインストールの実行
以下の`opnfv-deploy`コマンドを実行することでOpenStack/OpenDaylightのインストールが開始されます。インストールに必要な時間は構成によってことなりますが、けっこう時間がかかります(HA構成なしの状態で1時間程度)。

```bash
opnfv-deploy -v -n ./network_settings.yaml -d ./deploy_settings.yaml
```

###補足
たまにterminalが変なところで固まったように見えるときもありますが、処理は続いています。

```
2016-11-15 13:54:50 [overcloud-BlockStorageNodesPostDeployment-qtvp3rubcq4p-VolumeDeployment_Step1-glhht56fjrmg]: CREATE_IN_PROGRESS Stack CREATE started
2016-11-15 13:54:50 [overcloud-BlockStorageNodesPostDeployment-qtvp3rubcq4p-VolumeDeployment_Step1-glhht56fjrmg]: CREATE_COMPLETE Stack CREATE completed successfully
2016-11-15 13:54:50 [overcloud-CephStorageNodesPostDeployment-sv2ldhyihu4o-CephStorageDeployment_Step1-m67z3q3xitux]: CREATE_COMPLETE Stack CREATE completed successfully
2016-11-15 13:54:51 [VolumeDeployment_Step1]: CREATE_COMPLETE state changed
2016-11-15 13:54:51 [ExtraConfig]: CREATE_IN_PROGRESS state changed
2016-11-15 13:54:51 [overcloud-BlockStorageNodesPostDeployment-qtvp3rubcq4p-ExtraConfig-23w6y5uyyjvx]: CREATE_IN_PROGRESS Stack CREATE started
2016-11-15 13:54:51 [overcloud-BlockStorageNodesPostDeployment-qtvp3rubcq4p-ExtraConfig-23w6y5uyyjvx]: CREATE_COMPLETE Stack CREATE completed successfully
2016-11-15 13:54:51 [CephStorage
```

##Apexのインストール完了
以下のようなメッセージが出るとインストールが完了です。

```shell-session
INFO: Undercloud VM has been setup to NAT Overcloud public network
Undercloud IP: 192.168.122.140, please connect by doing 'opnfv-util undercloud'
Overcloud dashboard available at http://192.168.37.10/dashboard
INFO: Post Install Configuration Complete
[root@opnfv-test ~]# 
```

#Apexの操作
これ以降はインストールしたApexを使って簡単にVMを起動しながら、OpenStack, ODLそれぞれの動作の仕方について説明していきます。

##各種コンソールへのアクセス方法
Apexでインストールしたそれぞれのコンポーネント(OpenStack, ODL)については以下のコマンドでアクセス可能です。

| アクセス対象 | 何が可能か | アクセス方法  |
|:-------------:|:------------------------:|:-----------------------------|
| undercloud    | OpenStackのコマンドの実行   | `opnfv-util undercloud           `  |
| controller0/1 |  -                       |  `opnfv-util overcloud controller0` |
| compute0/1    |  -                       |  `opnfv-util overcloud compute0   ` |
| OpenDaylight console | OpenDaylightの操作 (password='karaf') | `opnfv-util opendaylight          ` |

###OpenStackのコマンド操作
Undercloudにある`~/overcloudrc`というファイルを読むことでOpenStackをコマンドから操作することが可能です。

```shell-session
[root@opnfv-test ~]# opnfv-util undercloud
[stack@undercloud ~]$ . overcloudrc 
[stack@undercloud ~]$ nova list
+----+------+--------+------------+-------------+----------+
| ID | Name | Status | Task State | Power State | Networks |
+----+------+--------+------------+-------------+----------+
+----+------+--------+------------+-------------+----------+
```

##各種WebUIへのアクセス方法
先程のコマンド完了時に出ているIPアドレスでOpenStack, OpenDaylightのWebUIにアクセス可能です。
インストールしたサーバーの外側からアクセスする場合は上でインストールしたproxyを経由するとアクセスが可能です。

```bash
INFO: Undercloud VM has been setup to NAT Overcloud public network
Undercloud IP: 192.168.122.140, please connect by doing 'opnfv-util undercloud'
Overcloud dashboard available at http://192.168.37.10/dashboard
INFO: Post Install Configuration Complete
[root@opnfv-test ~]# 
```
 
- OpenStack : http://\<上のIP\>/dashboard
    - user/passはundercloudの`~/overcloudrc`を参照
- OpenDaylight : http://\<overcloudrcの中のSDN_CONTROLLER_IPのIP\>:8181/index.html 
    - user/pass = admin=admin
    - 同様にREST APIにもアクセス可能です 
        - 例:http://\<上のIP\>:8181/controller/nb/v2/neutron/networks

###IPを忘れてしまった場合
以下のコマンドで上のIPを再度確認することが可能です。

```shell-session
[root@opnfv-test ~]# opnfv-util undercloud
(snip)
[stack@undercloud ~]$ . stackrc 
[stack@undercloud ~]$ heat output-show overcloud PublicVip #PublicVipは大文字・小文字注意
"192.168.37.10"
```

###overcloudrcを消してしまった場合
以下のコマンドでOpenStackのadminのパスワードを確認することが可能です

```shell-session
[root@opnfv-test ~]# opnfv-util overcloud controller0
(snip)
[heat-admin@overcloud-controller-0 ~]$ sudo hiera keystone::roles::admin::password
XXXXXX ← パスワード
```
##OpenDaylightの情報採取

OpenDaylightのWebUIでOpenStackのController node, Compute nodeのOVSが以下のように参照できます。ですが、OvSのNode Idが16進数に対してOpenDaylightは10進数表記なので、一度変換して対応するノードを探す必要があります。

![opnfv-sc1.png](https://qiita-image-store.s3.amazonaws.com/0/2291/c8ff25c4-9805-7f1a-1c61-81cf2e1d7c1c.png)

簡単に取得できるスクリプトとして[ovs-helper](https://gist.github.com/s1061123/8ca70d63caef0b3900f672d6114d427b)を用意致しました。このスクリプトを使うことで対応するノードを簡単に取得することが可能です。ovs-helperを以下のGistから取得して下さい。

https://gist.github.com/s1061123/8ca70d63caef0b3900f672d6114d427b

```shell-session
[root@opnfv-test ~]# wget 'https://goo.gl/N1qeTa' -O ovs-helper
[root@opnfv-test ~]# chmod +x ovs-helper
[root@opnfv-test ~]# ./ovs-helper getdpid
overcloud-novacompute-0:75047155970218 (0x44414712b0aa)
overcloud-controller-0:57293109187697 (0x341b976bd471)
overcloud-novacompute-1:260295454480225 (0xecbcc219d761)
```

##OvSの情報採取

[ovs-helper](https://gist.github.com/s1061123/8ca70d63caef0b3900f672d6114d427b)を使うことでOvSのフォワーディングのFlowを取得することが可能です。


```shell-session
[root@opnfv-test ~]# ./ovs-helper getflow compute0 # controller0, compute1も可能
OFPST_FLOW reply (OF1.3) (xid=0x2):
 cookie=0x0, duration=419445.069s, table=0, n_packets=0, n_bytes=0, dl_type=0x88cc actions=CONTROLLER:65535
 cookie=0x0, duration=419445.069s, table=0, n_packets=0, n_bytes=0, priority=0 actions=goto_table:20
 (省略)
 cookie=0x0, duration=419444.982s, table=110, n_packets=0, n_bytes=0, priority=0 actions=drop
```

##VMの起動

最後にVM(Cirros)を2台起動してみます。以下のコマンドを実行後OpenStackのWebUIからConsoleを使うことで2台間のPingの疎通を確認することが可能です。

```shell-session
[root@opnfv-test ~]# opnfv-util undercloud
Last login: Tue Nov 29 12:31:30 2016 from 192.168.122.1
[stack@undercloud ~]$ . overcloudrc 
[stack@undercloud ~]$ nova secgroup-add-rule default icmp    -1    -1 0.0.0.0/0 # Ping
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| icmp        | -1        | -1      | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+
[stack@undercloud ~]$ nova secgroup-add-rule default tcp     22    22 0.0.0.0/0 # SSH
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp         | 22        | 22      | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+
[stack@undercloud ~]$ curl -O http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12.6M  100 12.6M    0     0  1161k      0  0:00:11  0:00:11 --:--:-- 1589k
[stack@undercloud ~]$ openstack image create 'cirros' --public --container-format bare \
>         --disk-format=qcow2 < cirros-0.3.4-x86_64-disk.img
+------------------+----------------------------------------------------------------------------------------------------------+
| Field            | Value                                                                                                    |
+------------------+----------------------------------------------------------------------------------------------------------+
| checksum         | ee1eca47dc88f4879d8a229cc70a07c6                                                                         |
| container_format | bare                                                                                                     |
(snip)
| visibility       | public                                                                                                   |
+------------------+----------------------------------------------------------------------------------------------------------+
[stack@undercloud ~]$ neutron net-create internal
Created a new network:
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
(snip)
| updated_at                | 2016-11-29T13:05:52                  |
+---------------------------+--------------------------------------+
[stack@undercloud ~]$ neutron subnet-create internal 192.168.0.0/24 --name subnet-int1
Created a new subnet:
+-------------------+--------------------------------------------------+
| Field             | Value                                            |
+-------------------+--------------------------------------------------+
| allocation_pools  | {"start": "192.168.0.2", "end": "192.168.0.254"} |
(snip)
+-------------------+--------------------------------------------------+
[stack@undercloud ~]$ neutron router-create router
Created a new router:
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
(snip)
+-------------------------+--------------------------------------+
[stack@undercloud ~]$ neutron router-gateway-set router external
Set gateway for router router
[stack@undercloud ~]$ neutron router-interface-add router subnet-int1
Added interface 7d2511eb-72ec-488e-b3b5-5bedf8be9be5 to router router.
[stack@undercloud ~]$ int_net=$(openstack network list -f json| jq -r ' .[] | select(.Name == "internal") | .ID')
[stack@undercloud ~]$ nova boot --flavor m1.tiny --image 'cirros' --nic net-id=$int_net testvm1
+--------------------------------------+-----------------------------------------------+
| Property                             | Value                                         |
+--------------------------------------+-----------------------------------------------+
(snip)
+--------------------------------------+-----------------------------------------------+
[stack@undercloud ~]$ nova boot --flavor m1.tiny --image 'cirros' --nic net-id=$int_net testvm2
+--------------------------------------+-----------------------------------------------+
| Property                             | Value                                         |
+--------------------------------------+-----------------------------------------------+
(snip)
+--------------------------------------+-----------------------------------------------+
```

#環境のクリーンアップ
環境を削除したい場合には```opnfv-clean```コマンドを使うことでクリーンアップすることが可能です。

```shell-session
[root@opnfv-test ~]# opnfv-clean 


(snip)
Cleanup Completed
```

#まとめ
本記事ではOPNFV Apexを使用してCentOS7上にOpenStack/OpenDaylightをインストールし、簡単な操作について説明しました。

#主な情報源
- [OPNFV Installation instructions (Apex)](http://artifacts.opnfv.org/apex/colorado/2.0/docs/installationprocedure/index.html)
- [OPNFV Apex Release Notes](http://artifacts.opnfv.org/apex/colorado/2.0/docs/releasenotes/index.html)