CentOS7（ホスト）にopenstack入れてみる 


openstackとか一応触っておく。
結論を先に書いておくと、dockerがもう少し安定すればdockerの方がお手軽感満載。
ただしAPIが豊富なopenstackは他のシステム（例えばredmineやgitlab）と連動した社内用開発環境の自動生成ツールとして有望かも。
しかしながら最低限必要とされるスペックがなかなかマッチョなのでマシン余ってるからほいほい入れてみようというわけにもいかなそう。


## インストール準備

```
# ネットワークマネージャを停止
# systemctl stop NetworkManager
# systemctl disable NetworkManager
# 旧ネットワークをスタート
# service network start
# chkconfig network on
# SELINUXをPermissiveに
# setenforce 0
# CentOSをminimalインストールした場合
# yum -y install deltarpm
```

## インストール

Juno指定でインストール

```
# yum install -y http://rdo.fedorapeople.org/openstack-juno/rdo-release-juno.rpm
# yum install -y openstack-packstack
```

OpenStackの環境構築を行う。
永続ボリュームCinderの容量を指定してpackstackする。
デフォルトでは20G確保される。大規模に構築するなら大きめに取っておくと良いよう。
ネットワーク越しで操作していると切断される可能性があるのでローカルから実行する。

```
# packstack --allinone --provision-all-in-one-ovs-bridge=n --ntp-servers=ntp.nict.jp --cinder-volumes-size=20G
```

長い長い構築時間が終わるとネットワークインターフェースの雛形が追加されてる。
eth0のデバイスタイプをOVSPortにしてbr-exにマッピングする。
br-exはovsとしてOpen vSwitchが提供する仮想ブリッジという扱いにする。

```/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
HWADDR="[MACアドレス]"
TYPE="OVSPort"
UUID="[UUID]"
ONBOOT="yes"
NM_CONTROLLED="yes"
OVS_BRIDGE="br-ex"
```

```/etc/sysconfig/network-scripts/ifcfg-br-ex

DEVICE="br-ex"
DEVICETYPE="ovs"
TYPE="OVSBridge"
ONBOOT="yes"
BOOTPROTO="none"
IPADDR="[固定したいIP]"
NETMASK="[サブネットマスク]"
GATEWAY="[ゲートウェイIP]"
DNS1="[DNSサーバ]"
NM_CONTROLLED="yes"
```

OpenStackでネットワーク管理を担当するneutronにマッピング設定を追加する。

```/etc/neutron/plugin.ini
# network_vlan_ranges =
# Example: network_vlan_ranges = physnet1:1000:2999,physnet2
# 以下追記
network_vlan_ranges = physnet1
bridge_mappings = physnet1:br-ex
```

ネットワーク再起動

```
# service network restart
# ovs-vsctl show
# eth0が追加されている
Bridge br-ex
        Port "eth0"
            Interface "eth0"
        Port br-ex
            Interface br-ex
                type: internal
```


日本語キーボードを使っている人はこの時点で細かい設定。
VNCを使った時にとにかく困るので面倒臭がらずにやっておくと後で困らない。
コロンとかアンスコが入力できないとかね。

```/etc/nova/nova.conf
# Keymap for VNC (string value)
#vnc_keymap=en-us # jaに変更する
vnc_keymap=ja
```

再起動

```
# systemctl restart openstack-nova-compute
```

サービスの状態を確認する。
disabled on bootでないのにinactiveやfailedは失敗しているもの。
非力なマシンだと普通にあるみたい。
自分の環境では失敗だらけで、気付かず画面を操作してもエラーだらけでハマった。


```
# openstack-status

== Nova services ==
openstack-nova-api:                     active
openstack-nova-cert:                    active
openstack-nova-compute:                 active
openstack-nova-network:                 inactive  (disabled on boot)
openstack-nova-scheduler:               active
openstack-nova-conductor:               active
== Glance services ==
openstack-glance-api:                   active
openstack-glance-registry:              active
== Keystone service ==
openstack-keystone:                     inactive  (disabled on boot)
== Horizon service ==
openstack-dashboard:                    active
== neutron services ==
neutron-server:                         failed
neutron-dhcp-agent:                     active
neutron-l3-agent:                       failed
neutron-metadata-agent:                 active
neutron-lbaas-agent:                    inactive  (disabled on boot)
neutron-openvswitch-agent:              active
== Swift services ==
openstack-swift-proxy:                  failed
openstack-swift-account:                failed
openstack-swift-container:              failed
openstack-swift-object:                 failed
== Cinder services ==
openstack-cinder-api:                   active
openstack-cinder-scheduler:             active
openstack-cinder-volume:                active
openstack-cinder-backup:                inactive
== Ceilometer services ==
openstack-ceilometer-api:               failed
openstack-ceilometer-central:           active
openstack-ceilometer-compute:           active
openstack-ceilometer-collector:         active
openstack-ceilometer-alarm-notifier:    active
openstack-ceilometer-alarm-evaluator:   active
openstack-ceilometer-notification:      active
== Support services ==
libvirtd:                               active
openvswitch:                            active
dbus:                                   active
target:                                 active
rabbitmq-server:                        active
memcached:                              active
```


いろいろと失敗しておるので再起動

```
# systemctl restart neutron-server
# systemctl restart neutron-l3-agent
# systemctl restart neutron-lbaas-agent
# systemctl restart openstack-swift-proxy
# systemctl restart openstack-swift-account
# systemctl restart openstack-swift-container
# systemctl restart penstack-swift-object
```


## 使ってみる

### アクセスしてみる
まずはGUIにログイン。アクセス情報を確認する。
OS_USERNAMEとOS_PASSWORDでログインできる。

```
# cat /root/keystonerc_admin
export OS_USERNAME=admin
export OS_TENANT_NAME=admin
export OS_PASSWORD=[パスワード]
export OS_AUTH_URL=http://[サーバIP]:5000/v2.0/
export OS_REGION_NAME=RegionOne
export PS1='[\u@\h \W(keystone_admin)]\$ '
```

http://[サーバIP]/
![スクリーンショット 2015-04-01 13.07.54.png](https://qiita-image-store.s3.amazonaws.com/0/15518/132a6edc-9fca-c8b0-26de-d70854fe71bd.png "スクリーンショット 2015-04-01 13.07.54.png")



### インスタンス

AWSでいうところのEC2的なものを立ち上げてみよう。
以外とまとまった情報が少ないのでチュートリアル的に。

#### 1.イメージ

プロジェクト > コンピュート > イメージ

![スクリーンショット 2015-04-01 13.02.41.png](https://qiita-image-store.s3.amazonaws.com/0/15518/c7377d5b-95dc-bde5-843c-973a19a231b2.png "スクリーンショット 2015-04-01 13.02.41.png")

cirrosという最小限機能のOSがデフォルトでインストールされている。
が、こいつテスト用で何もできないので。

>OpenStack で動作する仮想マシンイメージを取得する最も簡単な方法は、すでに作成されたものをダウンロードすることです。

のことで
[イメージの取得](http://docs.openstack.org/ja/image-guide/content/ch_obtaining_images.html)

今回はCentOS7使いたいので入れてみる。qcow2形式のイメージを選択した。
[CentOS 7 イメージ](http://cloud.centos.org/centos/7/images/)

![スクリーンショット 2015-04-02 16.52.36.png](https://qiita-image-store.s3.amazonaws.com/0/15518/44aafca1-079e-7547-e8a3-d941d44ef6a5.png "スクリーンショット 2015-04-02 16.52.36.png")

イメージの場所に選んだURLを入力して、もろもろ内容を入力。後で検索に使う内容の様だ。
最小ディスクや最小メモリーはよく分からないので未入力でいってみる。
1GB程あるのでしばらくかかる。無事一覧に並べばOK。


#### 2.アクセスとセキュリティー

プロジェクト > コンピュート > セキュリティーグループ > セキュリティグループの作成

sshとICMPだけ許可してみた。

![スクリーンショット 2015-04-01 15.39.05.png](https://qiita-image-store.s3.amazonaws.com/0/15518/348462b8-82a1-9e8a-81df-99383604861d.png "スクリーンショット 2015-04-01 15.39.05.png")

キーペアの作成もしておく。
特に難しい事もないので割愛。



#### 3.ネットワーク

外との接続に使うpublicネットワークとプロジェクト内で使うprivateネットワーク、仮想ルータを作る。

* public

管理 > ネットワーク > ネットワークの作成

![スクリーンショット 2015-04-02 17.29.56.png](https://qiita-image-store.s3.amazonaws.com/0/15518/879d9775-f3be-860c-4321-965242914373.png "スクリーンショット 2015-04-02 17.29.56.png")

作成したネットワークの詳細画面からサブネットマスクを作成する。
IP割当プールに現在のネットワークで使っていない範囲を指定するのが良いだろう。

![スクリーンショット 2015-04-02 18.08.44.png](https://qiita-image-store.s3.amazonaws.com/0/15518/761668e5-1354-7de7-4aa1-0baa6e5a785f.png "スクリーンショット 2015-04-02 18.08.44.png")

このネットワークではゲストOSに192.168.1.100~192.168.1.150までのIPが振られるようになる。


* private

プロジェクト > ネットワーク > ネットワークの作成

今度はプロジェクト毎のネットワーク設定。
プライベートっぽいどこのルータも使わないだろうって体系を適当につける。
ゲートウェイは次に作成するルータのIPにする。

![スクリーンショット 2015-04-02 17.47.26.png](https://qiita-image-store.s3.amazonaws.com/0/15518/713d7352-590f-652e-d95d-434e342ae036.png "スクリーンショット 2015-04-02 17.47.26.png")

DHCPにして特に割当範囲やDNSは指定せず作成。


* ルーター

publicとprivateをルータで紐付ける。

プロジェクト > ネットワーク > ルーターの作成

まずは適当に名前をつけて作成したらゲートウェイの設定を行う。
外部ネットワークに先程作成したpublicのネットワークを設定。

![スクリーンショット 2015-04-02 17.52.02.png](https://qiita-image-store.s3.amazonaws.com/0/15518/496b68e7-5611-54a5-e431-4a3e8081e78a.png "スクリーンショット 2015-04-02 17.52.02.png")

次にルータ詳細からインターフェースにprivateを追加する。
IPアドレスは省略！
![スクリーンショット 2015-04-02 17.55.37.png](https://qiita-image-store.s3.amazonaws.com/0/15518/c8c184a9-aec3-bdaf-86a4-5cec8e4f6672.png "スクリーンショット 2015-04-02 17.55.37.png")


おろらくよくわからずに進めているそこの君、ちゃんとできているか確認しよう。

プロジェクト > ネットワーク > ネットワークトポロジー

publicとprivateのネットワークが仮想ルータを介して接続できていればOKのはず。

![スクリーンショット 2015-04-02 18.14.07.png](https://qiita-image-store.s3.amazonaws.com/0/15518/b2aa3f8b-1152-3e4a-449a-a644764801b2.png "スクリーンショット 2015-04-02 18.14.07.png")



#### 4.インスタンス起動

プロジェクト > コンピュート > インスタンス > インスタンスの起動

作成したイメージ、セキュリティグループ、キーペア、ネットワーク、を使用する設定して
インスタンスを起動する。
フレーバーがm1.tinyだと容量が足りずインストールエラーとなった。
このあたりの基本設定は 管理 > フレーバー で変更できそうだ。

![スクリーンショット 2015-04-02 17.05.34.png](https://qiita-image-store.s3.amazonaws.com/0/15518/1350ec58-5a96-c8b1-54d9-5ad458db22ca.png "スクリーンショット 2015-04-02 17.05.34.png")

ネットワークでは現時点でprivateを選択。publicは後で振る。

![スクリーンショット 2015-04-02 18.16.51.png](https://qiita-image-store.s3.amazonaws.com/0/15518/906b35a5-b2f5-4369-41b8-68c3550d885e.png "スクリーンショット 2015-04-02 18.16.51.png")

インスタンス詳細からコンソールタブを選ぶとVNCで現在の状況を確認できる。
![スクリーンショット 2015-04-02 17.10.15.png](https://qiita-image-store.s3.amazonaws.com/0/15518/7aca22a3-d728-94ab-6ebb-ec841385915e.png "スクリーンショット 2015-04-02 17.10.15.png")

無事終わっているよう。通常のCentOSだとインストールが開始したりするけどそこまで完了している状態でオフィシャルで配布されているみたい。


次に外部からアクセスできるようIPを割り振る。
インスタンス一覧からアクションを選んでFloating IPを割り振るを選択。
IPの確保を行う。
![スクリーンショット 2015-04-02 18.23.47.png](https://qiita-image-store.s3.amazonaws.com/0/15518/34afc491-2acc-c362-f2f6-b141cbdbc381.png "スクリーンショット 2015-04-02 18.23.47.png")

無事IPが確保できれば自動的にprivate IPにマッピングされるはず。
よし、アクセスしてみよう！となって気になるのがユーザとパスワードだけど以下の様に初期時点で固定されているみたいだ。

ユーザ：centos
RSA認証：起動時に指定したキーペア
ホスト：割り合てられたpublic IP

というわけで外のクライアントからsshしてみよう、ドキドキ。
ssh -i [指定したキーペア] centos@[public IP]

root取るにはsudo suすればノンパスワードでいける。

*あれ？アクセスできない*

となったりした方もいるであろう。
なぜならコンソールからコマンド入力可能になってもsshやネットワークの設定が反映されるまでにはしばらくかかるようで
アクセスできてもPermission denied（もちろん権限は大丈夫だぞ）で認証が通らない絶望的状況に陥り
結構ハマりましたよ僕は（お前か）。
進行に応じてコンソールのホスト名が
1.localhost
2.host-[private IP]
3.[インスタンス名]
と変化するから最終的にインスタンス名になるまでは基本待機。ブラウザからコンソールを眺めつつたまにEnterするとホスト名が変化するのがわかる。

これに気付かずハマっている時にパスワードログインの許可とパスワードの変更を行ったので一応メモしておく。

```
#cloud-config
chpasswd:
 list: |
   root:hoge
   centos:fuga
expire: False
```
![スクリーンショット 2015-04-02 19.20.56.png](https://qiita-image-store.s3.amazonaws.com/0/15518/c7cb5006-2e8c-3740-5394-179f64947876.png "スクリーンショット 2015-04-02 19.20.56.png")

アクセスできたら色々確認してみよう。
まず当方yumが通らなかった。DNSの設定がちゃんとできてなく。


参考
* [OpenStack Juno をCentOS7にpackstack(RDO)でインストールして、Neutron経由で外部ネットにつながるUbuntuのVMに、ローカルマシンからSSH接続するまでの手順メモ](http://qiita.com/ksrt/items/34f6a31c7af34da9e471)
* [CentOS 7でのOpenStackの構築手順](http://thinkit.co.jp/story/2015/02/19/5593/page/0/1)
* [CentOS6.5にOpenStack(Icehouse)環境を構築](http://blog.hirokikana.com/?p=461)
* [RDOを使用したOpenStack Juno環境の構築](http://blog.bit-isle.jp/bird/2014/11/527)