OpenStack RDO Icehouse を CentOS 6.5 にインストール

## 参考
[RDO]
(https://openstack.redhat.com/Main_Page)
[RDO:Neutron with existing external network]
(https://openstack.redhat.com/Neutron_with_existing_external_network)
[OPENSTACK MANUALS:Configure network node]
(http://docs.openstack.org/icehouse/install-guide/install/yum/content/neutron-ml2-network-node.html)
[OPENSTACK MANUALS:Configure compute node]
(http://docs.openstack.org/icehouse/install-guide/install/yum/content/neutron-ml2-compute-node.html)
[Red Hat Enterprise Linux OpenStack Platform : Editing a PackStack Answer File]
(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux_OpenStack_Platform/2/html/Getting_Started_Guide/ch06s03s02.html)

## 構築環境

インストールするサーバー

| OS        | IPアドレス   |メモリ|CPU|NIC|
|:--        |:--          | --:| --:| --:|
| CentOS6.5 |192.168.1.41 | 2GB |  2|   1|

public空間(物理環境)

| 名前 | ネットワーク        | ゲートウェイ   |フローティングIP(非DHCP空間)|
|:--   |:--                |:--            |:--                |
| public  |192.168.1.0/24  | 192.168.1.1   | 192.168.1.42~49   |

プライベート空間(仮想環境)

| 名前 | ネットワーク        | ゲートウェイ   |フローティングIP(非DHCP空間)|
|:--   |:--                |:--            |:--                |
| private |192.168.111.0/24| 192.168.111.1 | 192.168.111.2~254 |

## 必要パッケージのインストール
・時刻を合わせる
・アップデート
・RDOのリポジトリ追加
・openstack-packstackのインストール
>
```shell-session:shell
yum install -y ntpdate && ntpdate ntp.nict.jp
>
yum update  -y
>
yum install -y http://rdo.fedorapeople.org/openstack-icehouse/rdo-release-icehouse.rpm
>
yum install -y openstack-packstack
```

## カーネルパラメーター修正
```shell:shell
sed -i.org \
    -e "s/^net.ipv4.ip_forward.*=.*0/net.ipv4.ip_forward = 1/" \
    -e "s/^net.ipv4.conf.all.rp_filter.*=.*1/net.ipv4.conf.all.rp_filter = 0/" \
    -e "s/^net.ipv4.conf.default.rp_filter.*=.*1/net.ipv4.conf.default.rp_filter = 0/" \
    /etc/sysctl.conf

sysctl -p
```

## アンサーファイル生成と編集

・アンサーファイル生成
>
```shell:shell
packstack --gen-answer-file answer.txt
```
>
・パスワード変更
>>
```shell:shell
KEYSTONE_PASSWORD=password
>>
sed -i.org \
    -e "s/^CONFIG_KEYSTONE_ADMIN_PW=.*/CONFIG_KEYSTONE_ADMIN_PW=${KEYSTONE_PASSWORD}/" \
    -e "s/^CONFIG_KEYSTONE_DEMO_PW=.*/CONFIG_KEYSTONE_DEMO_PW=${KEYSTONE_PASSWORD}/" \
    answer.txt
```
>
・プライベートインターフェースをloにする
>>
```shell:shell
sed -i \
    -e "s/^CONFIG_NOVA_NETWORK_PRIVIF=eth1/CONFIG_NOVA_NETWORK_PRIVIF=lo/" \
    -e "s/^CONFIG_NOVA_COMPUTE_PRIVIF=eth1/CONFIG_NOVA_COMPUTE_PRIVIF=lo/" \
    answer.txt
```

>
・Cinderに割り当てられるディスクサイズの変更(任意)
>>
```shell:shell
VOLUMES_SIZE=50G
>>
sed -i \
    -e "s/^CONFIG_CINDER_VOLUMES_SIZE=20G/CONFIG_CINDER_VOLUMES_SIZE=$VOLUMES_SIZE/" \
    answer.txt
```
>
・KeystoneのトークンフォーマットUUIDに変更(任意)
>>
```shell:shell
sed -i \
    -e "s/^CONFIG_KEYSTONE_TOKEN_FORMAT=PKI/CONFIG_KEYSTONE_TOKEN_FORMAT=UUID/" \
    answer.txt
```
>
・Heatをインストール(任意)
>>
```shell:shell
sed -i \
    -e "s/^CONFIG_HEAT_INSTALL=n/CONFIG_HEAT_INSTALL=y/" \
    -e "s/^CONFIG_HEAT_CLOUDWATCH_INSTALL=n/CONFIG_HEAT_CLOUDWATCH_INSTALL=y/" \
    -e "s/^CONFIG_HEAT_CFN_INSTALL=n/CONFIG_HEAT_CFN_INSTALL=y/" \
    answer.txt
```
>
・デモはいらない(任意)
>>
```shell:shell
sed -i \
    -e "s/^CONFIG_PROVISION_DEMO=y/CONFIG_PROVISION_DEMO=n/" \
    answer.txt
```
>
・Nagiosはいらない(任意)
>>
```shell:shell
sed -i \
    -e "s/^CONFIG_NAGIOS_INSTALL=y/CONFIG_NAGIOS_INSTALL=n/" \
    answer.txt
```

## インストール開始

```shell:shell
packstack --answer-file answer.txt
```

## Neutron設定追加


```shell:shell
vi /etc/neutron/plugin.ini
```

・/etc/neutron/plugin.ini 最終行に追記
>
```ini:/etc/neutron/plugin.ini
[ovs]
network_vlan_ranges = physnet1
bridge_mappings = physnet1:br-ex
```

## libvirt_type設定

```shell:shell
vi /etc/nova/nova.conf
```
・libvirt_type に kvmもしくはqemu を指定
>
```ini:/etc/nova/nova.conf
[libvirt]
virt_type=qemu
```

## NICの設定変更
・eth0 編集
>
```shell:shell
vi /etc/sysconfig/network-scripts/ifcfg-eth0
```
>>
```ini:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes
```

・br-ex 編集
>
```shell:shell
vi /etc/sysconfig/network-scripts/ifcfg-br-ex
```
>>
```ini:/etc/sysconfig/network-scripts/ifcfg-br-ex
DEVICE=br-ex
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=192.168.1.41
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1
ONBOOT=yes
```

## 再起動

```shell:shell
reboot
```

## 仮想ネットワーク構築

```shell:shell
source /root/keystonerc_admin
```

・publicネットワーク作成
>
```shell:shell
neutron net-create public \
    --router:external true
>
neutron subnet-create \
    --name public_subnet \
    --enable_dhcp=False \
    --allocation-pool=start=192.168.1.42,end=192.168.1.49 \
    --gateway=192.168.1.1 \
    public \
    192.168.1.0/24
```

・pvivateネットワーク作成
>
```shell:shell
neutron net-create private \
    --shared
>
neutron subnet-create \
    --name private_subnet \
    --enable_dhcp=True \
    --allocation-pool=start=192.168.111.2,end=192.168.111.254 \
    --gateway=192.168.111.1 \
    private \
    192.168.111.0/24
```

・仮想ルーター作成
>
```shell:shell
neutron router-create router1
>
neutron router-gateway-set router1 public
>
neutron router-interface-add router1 private_subnet
```

## デフォルト フレーバーの修正
・現在のフレーバー確認
・1番目のフレーバーを削除
・1番目に新しいフレーバーを作成
・フレーバー確認
>
```shell:shell
nova flavor-list
>
nova flavor-delete 1
>
nova flavor-create m1.tiny 1 512 10 1
>
nova flavor-list
```
>
```text:flavor-createの各値について
# nova flavor-create \
       FLAVOR_NAME \
       FLAVOR_ID \
       RAM_IN_MB \
       ROOT_DISK_IN_GB \
       NUMBER_OF_VCPUS
```
> 
## デフォルト セキュリティグループの修正

・PING許可
>
```shell:shell
neutron security-group-rule-create \
    --protocol icmp \
    --direction ingress default
>
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
```

・SSH許可
>
```shell:shell
neutron security-group-rule-create \
    --protocol tcp --port-range-min 22 \
    --port-range-max 22 \
    --direction ingress default
>
nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
```

## インスタンス イメージ作成

・インスタンス イメージ作成に必要なパッケージをインストール
>
```shell:shell
yum install -y qemu-img virt-install
```

・qcow2形式のイメージディスク作成
>
```shell:shell
IMAGE_NAME=CentOS6.5
>
qemu-img create -f qcow2 /var/lib/libvirt/images/$IMAGE_NAME.qcow2 10G
```

・CentOSイメージ作成
>
・ネットワークインストールするリポジトリURL指定
・KVM上での名前を指定
・virt-installでインストールする
>
```shell:shell
REPOS=http://ftp.riken.jp/Linux/centos/6/os/x86_64/
>
IMAGE_NAME=CentOS6.5
>
virt-install \
    --name $IMAGE_NAME \
    --ram 512 \
    --disk path=/var/lib/libvirt/images/$IMAGE_NAME.qcow2,format=qcow2 \
    --vcpus=1 \
    --os-type linux \
    --os-variant=rhel6 \
    --nographics \
    --location="$REPOS" \
    --extra-args='console=tty0 console=ttyS0,115200n8 serial'
```
>
・CentOSイメージ内で
>>
```shell:shell
rm /etc/udev/rules.d/70-persistent-net.rules
>>
ln -s /dev/null /etc/udev/rules.d/70-persistent-net.rules
>>
vi /etc/sysconfig/network-scripts/ifcfg-eth0
```
>>>
```ini:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=dhcp
```

・イメージファイルの圧縮
>
```shell:shell
IMAGE_NAME=CentOS6.5
> 
qemu-img convert -c -O qcow2 \
    /var/lib/libvirt/images/$IMAGE_NAME.qcow2 \
    /var/lib/libvirt/images/$IMAGE_NAME.new.qcow2
> 
rm /var/lib/libvirt/images/$IMAGE_NAME.qcow2
> 
mv /var/lib/libvirt/images/$IMAGE_NAME.new.qcow2 \
   /var/lib/libvirt/images/$IMAGE_NAME.qcow2
```

## インスタンス イメージ登録

```shell:shell
IMAGE_NAME=CentOS6.5

glance image-create \
    --name=$IMAGE_NAME \
    --is-public=true \
    --disk-format=qcow2 \
    --container-format=bare < /var/lib/libvirt/images/$IMAGE_NAME.qcow2
```

## キーペア作成

```shell:shell
cd && nova keypair-add mykey > mykey && chmod 600 mykey

nova keypair-list
```

## インスタンスの起動

```shell:shell
IMAGE_NAME=CentOS6.5

INSTANCE_NAME=CentOS6.5-test

PRIVATE_NET_ID=`neutron net-list | awk '$4=="private"{print $2}'`

nova boot \
    --flavor 1 \
    --image $IMAGE_NAME \
    --security_group default \
    --nic net-id=$PRIVATE_NET_ID \
    --key-name mykey \
    $INSTANCE_NAME
```

## フローティングIPの付与

・作成したインスタンスのデバイスIDを取得する
>
```shell:shell
INSTANCE_NAME=CentOS6.5-test
>
DEVICE_ID=`nova list | awk -v INSTANCE_NAME=$INSTANCE_NAME '$4==INSTANCE_NAME{print $2}'`
>
echo $DEVICE_ID
```

・作成したインスタンスのポートIDを取得する
>
```shell:shell
PORT_ID=`neutron port-list --device_id=$DEVICE_ID | awk '/ip_address/{print $2}'`
>
echo $PORT_ID
```

・フローティングIPの割出とフローティングIPのIDを取得する
>
```shell:shell
FLOATINGIP_ID=`neutron floatingip-create public | awk '$2~/^id$/{print $4}'`
>
echo $FLOATINGIP_ID
```

・フローティングIPをサブネットに割り当てる
>
```shell:shell
neutron floatingip-associate $FLOATINGIP_ID $PORT_ID
```

・確認
>
```shell:shell
nova list --name $INSTANCE_NAME
neutron floatingip-list --id $FLOATINGIP_ID | awk '{print $6}'
```

## 作成したインスタンスにssh接続する

```shell:shell
ssh -i mykey root@floating_ip_address
```