RDO/TripleOでOpenStack MitakaをInstallする (on non-nested VM編)

本記事では[RDO Project](http://www.rdoproject.org/)で主に開発されている[TripleO](http://tripleo.org/)を使ったインストールについて紹介します。
RDO Projectで開発されているOpenStackのインストーラはTripleOの他にPackstackが存在しますが、TripleOは
Controller nodeのHAの設定なども含めて設定することが可能です。

RDO ProjectではTripleOを使用したTripleO quickstartツールでもインストールすることは可能ですが、それについてはまたの機会に説明したいと思っています。

本記事では以下のことを行ないます。

* VMを3つ作成(Undercloud用 x 1, Controller node用 x 1, Compute node用 x 1) (手順は省略)
* UndercloudのにCentOS7をインストール (手順は省略)
* その後にUndercloud用OpenStackのインストール
* Tempestを使ってインストールの正常性確認
* UndercloudからCoontroller node, Compute nodeのOpenStackのインストールを実施
* Novaを使ってCirrOSを起動

# TripleOによるOpenStackインストール概要
TripleOではUndercloudとOvercloudの2つのOpenStackをインストールすることになります。

* Overcloud
    * 実際に使用するOpenStack環境
* Undercloud
    * Overcloudをインストールするために作成・使用されるOpenStackです。ironic/heatを使用してOvercloudを作成することになります

ですので順番としては以下の通りになります。

1. Undercloudをインストールする
2. UndercloudにOvercloudのController node, Compute node等を登録
2. Undercloudにインストールされたironicを使って各Controller node, Compute node等を制御
3. Undercloudにインストールされたheatを使ってOvercloudのOpenStack各コンポーネントをインストール


# 構成図
今回の構成は以下のようになります。

* 物理にLinuxがインストールされて、libvirtがインストール
* Undercloud VMを作成し、CentOS7をインストール
    * networkは管理用のインターフェイス(default)とOpenStack用のネットワーク(data1)の2つを作成
    * OpenStackインストール用ユーザー'stack'を作成してsudo使用可能状態にする
* Overcloud-ctrl (Controller node)とOvercloud-Comp01のVMを作成
    * これについてはVM作成のみで起動・OSインストールはしない
    * ネットワークはdata1のみに接続
    * このVMはUndercloudからのDHCP/PXEでブート予定
* OpenStack用のネットワーク(data1)はIP Masqueradeで外部に接続

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/2291/47132bc4-afba-bb2c-4462-b3e9f0ee1f36.png)


# 前準備

* 物理マシンにLinuxをインストールして、libvirt(virsh)が使えるようにしているか確認してください
* ユーザ'stack'の作成'
    * sudoが実行可能な状態にしてください
    * ```ssh-copy-id root@<kvm側のアドレス>```等を使ってhypervisor (virsh)にアクセスできるようにしてください
* Network(data1)の作成

OpenStack用のネットワークを作成します。Undercloud VM側でDHCPサーバを動作させるのでDHCPは無効にしておいて下さい。また作成したLinux Bridgeに対してiptablesの設定を追加しておきます。

```
$ cat > data1_net.xml << EOF
<network connections='3'>
  <name>data1</name>
  <uuid>b7eadbab-7e95-487b-be00-8fa7fc679436</uuid>
  <bridge name='data1' stp='on' delay='0'/>
  <mac address='52:54:00:ae:42:07'/>
  <ip address='10.1.1.254' netmask='255.255.255.0'>
  </ip>
</network>
EOF
$ virsh net-create data1_net.xml
$ virsh net-start data1
$ virsh net-autostart data1
$ iptables -I FORWARD 1 -i data1 -j ACCEPT
$ iptables -I FORWARD 1 -o data1 -j ACCEPT
```

* Undercloud用のVMを作成
    * VMを起動してCentOSをインストールする
    * default (管理用ネットワーク)のIP address, DNSの設定を行なう
* Overcloud-ctrl, Overcloud-comp1のVMを作成
ここではVMの作成だけ行ないます。起動はTripleOから行なうのでこの時点では電源はOffの状態です。

```
qemu-img create 41G overcloud-ctrl.qcow2
/usr/bin/virt-install \
   --name overcloud-ctrl \
   --ram 6144 --vcpus 2 \
   --os-variant centos7.0 \
   overcloud-ctrl.qcow2 \
   --noautoconsole \
   --vnc \
   --network network:data1 --mac=52:54:00:c0:87:36 \
   --network network:internals \
   --cpu SandyBridge,+vmx \
   --graphics vnc,listen=10.61.123.1 \
   --dry-run --print-xml > overcloud-ctrl.xml
virsh define --file overcloud-ctrl.xml

qemu-img create 41G overcloud-comp1.qcow2
/usr/bin/virt-install \
   --name overcloud-comp1 \
   --ram 6144 --vcpus 2 \
   --os-variant centos7.0 \
   overcloud-comp1.qcow2 \
   --noautoconsole \
   --vnc \
   --network network:data1 --mac=52:54:00:c0:87:37 \
   --network network:internals \
   --cpu SandyBridge,+vmx \
   --graphics vnc,listen=10.61.123.1 \
   --dry-run --print-xml > overcloud-comp1.xml
virsh define --file overcloud-comp1.xml
```

# TripleOのインストール
## Undercloud用OpenStackのインストール
ここではUndercloud用のOpenStackをインストールします。

```
$ curl -L -o /etc/yum.repos.d/delorean-mitaka.repo \
https://trunk.rdoproject.org/centos7-mitaka/current/delorean.repo
$ curl -L -o /etc/yum.repos.d/delorean-deps-mitaka.repo \
http://trunk.rdoproject.org/centos7-mitaka/delorean-deps.repo
$ yum -y install python-tripleoclient
```

### Undercloudの設定
ユーザ stackでログインした後にUndercloud用の設定サンプルをコピーします。

```
$ sudo -i -u stack
$ cp /usr/share/instack-undercloud/undercloud.conf.sample ~/undercloud.conf
```

`undercloud.conf.sample`を参考にundercloudの設定をします。上の図の場合は以下のような設定になります。

```ini:undercloud.conf
[DEFAULT]
undercloud_hostname = openstack
local_ip = 10.1.1.1/24
network_gateway = 10.1.1.1
undercloud_public_vip = 10.1.1.1
undercloud_admin_vip = 10.1.1.11
local_interface = eth0
network_cidr = 10.1.1.0/24
masquerade_network = 10.1.1.0/24
dhcp_start = 10.1.1.10
dhcp_end = 10.1.1.30
inspection_iprange = 10.1.1.100,10.1.1.120
[auth]
```


設定が完了したらUndercloudをインストールします。Undercloudのインストールは時間がかかりますので終わるまでは何か別の作業でもしながら気長に待ちましょう。

```
$ openstack undercloud install
```

### Overcloud用のイメージのダウンロード・展開
Overcloudのインストール用のイメージをダウンロード・展開します。

```
$ curl -O  https://ci.centos.org/artifacts/rdo/images/mitaka/delorean/stable/ironic-python-agent.tar
$ curl -O https://ci.centos.org/artifacts/rdo/images/mitaka/delorean/stable/overcloud-full.tar
$ curl -O https://ci.centos.org/artifacts/rdo/images/mitaka/delorean/stable/undercloud.qcow2
$ tar xvf ironic-python-agent.tar
$ tar xvf overcloud-full.tar
```

## Overcloud用のインストール準備

### Overcloud用イメージの設定
ダウンロードしたイメージをUndercloudに設定します。

```shell
$ . stackrc
$ openstack overcloud image upload --image-path . 
```

### Overcloud用のノード群の登録・確認
Overcloudのインストールに使うマシン(ここではVMになります)の情報をUndercloudに登録します。
上で作成した2台のVMの情報(MAC addressとhypervisorの情報)を以下のようなファイルに記入して下さい。下のXXXの情報は環境に合わせて入力して下さい。

``` json:instackenv.json
{
  "nodes": [
    {
      "arch": "x86_64",
      "name": "overcloud-ctrl",
      "pm_user": "root",
      "pm_addr": "<<XXX:hypervisor virshのIPアドレス>>",
      "pm_password": "<<XXX: ~/.ssh/id_rsaの中身>>",
      "pm_type": "pxe_ssh",
      "mac": [
        "52:54:00:c0:87:36"
      ],
    },
    { 
      "arch": "x86_64",
      "name": "overcloud-comp1",
      "pm_user": "root",
      "pm_addr": "<<XXX:hypervisor virshのIPアドレス>>",
      "pm_type": "pxe_ssh",
      "pm_password": "<<XXX: ~/.ssh/id_rsaの中身>>",
      "pm_type": "pxe_ssh",
      "mac": [
        "52:54:00:c0:87:37"
      ],
    }
  ],
  "host-ip": "<<XXX:hypervisor virshのIPアドレス>>",
  "power_manager": "nova.virt.baremetal.virtual_power_driver.VirtualPowerManager",
  "ssh-key": "<<XXX: ~/.ssh/id_rsaの中身>>",
  "arch": "x86_64",
  "ssh-user": "root"
}
```

その後にUndercloudへ登録を行ない、introspectionを実行します。introspectionではテスト用のイメージを使ってマシンを起動し、CPU・メモリ・HDDの容量等を自動的に調査します。

```
$ openstack baremetal import instackenv.json
$ openstack baremetal configure boot
$ openstack baremetal introspection bulk start
```

## Overcloudの設定・デプロイ

### DNSの設定
```
neutron subnet-update $(openstack subnet list -f json | jq '.[0].ID' -r) \
        --dns-nameserver <<XXX: DNSサーバのアドレス>>
```

### Overcloudの環境ファイル
Overcloudの設定はHeatテンプレートを使用して設定します。
まずはデフォルトの設定ファイルをコピーします。

```
cp -r /usr/share/openstack-tripleo-heat-templates/ ~/templates
cd ~/templates
```

`~/templates`に以下の3つのファイルを作成します。 XXXの場所は環境に合わせて書き換えて下さい。

```yaml:network-environment.yaml
#This file is an example of an environment file for defining the isolated
#networks and related parameters.
resource_registry:
  # Network Interface templates to use (these files must exist)
  OS::TripleO::BlockStorage::Net::SoftwareConfig:
    ../network/config/single-nic-vlans/cinder-storage.yaml
  OS::TripleO::Compute::Net::SoftwareConfig:
    ../network/config/single-nic-vlans/compute.yaml
  OS::TripleO::Controller::Net::SoftwareConfig:
    ../network/config/single-nic-vlans/controller.yaml
  OS::TripleO::ObjectStorage::Net::SoftwareConfig:
    ../network/config/single-nic-vlans/swift-storage.yaml
  OS::TripleO::CephStorage::Net::SoftwareConfig:
    ../network/config/single-nic-vlans/ceph-storage.yaml

parameter_defaults:
  # This section is where deployment-specific configuration is done
  # Customize the IP subnets to match the local environment
  InternalApiNetCidr: 172.17.0.0/24
  StorageNetCidr: 172.18.0.0/24
  StorageMgmtNetCidr: 172.19.0.0/24
  TenantNetCidr: 172.16.0.0/24
  ExternalNetCidr: <<XXX:外側のnetwork Cidr, 例192.168.0.1>>
  # CIDR subnet mask length for provisioning network
  ControlPlaneSubnetCidr: '24'
  # Customize the IP ranges on each network to use for static IPs and VIPs
  InternalApiAllocationPools: [{'start': '172.17.0.10', 'end': '172.17.0.200'}]
  StorageAllocationPools: [{'start': '172.18.0.10', 'end': '172.18.0.200'}]
  StorageMgmtAllocationPools: [{'start': '172.19.0.10', 'end': '172.19.0.200'}]
  TenantAllocationPools: [{'start': '172.16.0.10', 'end': '172.16.0.200'}]
  # Leave room if the external network is also used for floating IPs
  #ExternalAllocationPools: [{'start': '10.0.0.10', 'end': '10.0.0.50'}]
  # Gateway router for the external network
  ExternalInterfaceDefaultRoute: <<<XXX:ゲートウェイのアドレス>>>
  # Gateway router for the provisioning network (or Undercloud IP)
  ControlPlaneDefaultRoute: 10.1.1.1
  # Generally the IP of the Undercloud
  EC2MetadataIp: 10.1.1.1
  # Define the DNS servers (maximum 2) for the overcloud nodes
  DnsServers: ["<<XXX:DNSのアドレス>>", "8.8.8.8"]
  # Customize the VLAN IDs to match the local environment
  InternalApiNetworkVlanID: 10
  StorageNetworkVlanID: 20
  StorageMgmtNetworkVlanID: 30
  TenantNetworkVlanID: 40
  ExternalNetworkVlanID: 50
  # Set to empty string to enable multiple external networks or VLANs
  NeutronExternalNetworkBridge: "''"
  # Customize bonding options, e.g. "mode=4 lacp_rate=1 updelay=1000 miimon=100"
  BondInterfaceOvsOptions: "bond_mode=active-backup"
```

```yaml:scheduler_hints_env.yaml
parameter_defaults:
    ControllerSchedulerHints:
        'capabilities:node': 'controller-%index%'
    NovaComputeSchedulerHints:
        'capabilities:node': 'compute-%index%'
    BlockStorageSchedulerHints:
        'capabilities:node': 'blockstorage-%index%'
    ObjectStorageSchedulerHints:
        'capabilities:node': 'objstorage-%index%'
    CephStorageSchedulerHints:
        'capabilities:node': 'cephstorage-%index%'
```

```yaml:storage-environment.yaml
## A Heat environment file which can be used to set up storage
## backends. Defaults to Ceph used as a backend for Cinder, Glance and
## Nova ephemeral storage.
parameter_defaults:

  #### BACKEND SELECTION ####

  ## Whether to enable iscsi backend for Cinder.
  CinderEnableIscsiBackend: false
  ## Whether to enable rbd (Ceph) backend for Cinder.
  CinderEnableRbdBackend: false
  ## Whether to enable NFS backend for Cinder.
  # CinderEnableNfsBackend: false
  ## Whether to enable rbd (Ceph) backend for Nova ephemeral storage.
  NovaEnableRbdBackend: false
  ## Glance backend can be either 'rbd' (Ceph), 'swift' or 'file'.
  GlanceBackend: swift
  ## Gnocchi backend can be either 'rbd' (Ceph), 'swift' or 'file'.
  GnocchiBackend: swift


  #### CINDER NFS SETTINGS ####

  ## NFS mount options
  # CinderNfsMountOptions: ''
  ## NFS mount point, e.g. '192.168.122.1:/export/cinder'
  # CinderNfsServers: ''


  #### GLANCE FILE BACKEND PACEMAKER SETTINGS (used for mounting NFS) ####

  ## Whether to make Glance 'file' backend a mount managed by Pacemaker
  # GlanceFilePcmkManage: false
  ## File system type of the mount
  # GlanceFilePcmkFstype: nfs
  ## Pacemaker mount point, e.g. '192.168.122.1:/export/glance' for NFS
  # GlanceFilePcmkDevice: ''
  ## Options for the mount managed by Pacemaker
  # GlanceFilePcmkOptions: ''


  #### CEPH SETTINGS ####

  ## Whether to deploy Ceph OSDs on the controller nodes. By default
  ## OSDs are deployed on dedicated ceph-storage nodes only.
  # ControllerEnableCephStorage: false

  ## When deploying Ceph Nodes through the oscplugin CLI, the following
  ## parameters are set automatically by the CLI. When deploying via
  ## heat stack-create or ceph on the controller nodes only,
  ## they need to be provided manually.

  ## Number of Ceph storage nodes to deploy
  # CephStorageCount: 0
  ## Ceph FSID, e.g. '4b5c8c0a-ff60-454b-a1b4-9747aa737d19'
  # CephClusterFSID: ''
  ## Ceph monitor key, e.g. 'AQC+Ox1VmEr3BxAALZejqeHj50Nj6wJDvs96OQ=='
  # CephMonKey: ''
  ## Ceph admin key, e.g. 'AQDLOh1VgEp6FRAAFzT7Zw+Y9V6JJExQAsRnRQ=='
  # CephAdminKey: ''
```

サーバにどのロールを割り当てたいかを指定します。

```
$ ironic node-update overcloud-ctrl replace \
        properties/capabilities='node:controller-0,boot_option:local'
$ ironic node-update overcloud-comp1 replace \
        properties/capabilities='node:compute-0,boot_option:local'
```

最後に`openstack overcloud deploy`コマンドでovercloud用のVMにopenstackをデプロイします。結構な時間が(数時間程)かかります。

```
$ cd ~/
$ openstack overcloud deploy --templates ~/templates/ \
        -e ~/templates/environments/network-environment.yaml \
        -e ~/templates/environments/storage-environment.yaml \
        -e ~/templates/environments/scheduler_hints_env.yaml \
        --control-scale 1 --compute-scale 1 \
        --ntp-server 10.61.123.1 --neutron-tunnel-type vxlan \
        --neutron-network-type vxlan
```

### インストールされたノードの情報
overcloudのIPアドレスは`nova list`で確認することが可能です。

```
$ . stackrc
$ nova list
+--------------------------------------+-------------------------+--------+------------+-------------+--------------------+
| ID                                   | Name                    | Status | Task State | Power State | Networks           |
+--------------------------------------+-------------------------+--------+------------+-------------+--------------------+
| fe0582c5-ea76-49a5-89e1-6fada0657749 | overcloud-controller-0  | ACTIVE | -          | Running     | ctlplane=10.1.1.13 |
| 37495c5e-3419-4216-90c2-569380f188b1 | overcloud-novacompute-0 | ACTIVE | -          | Running     | ctlplane=10.1.1.14 |
+--------------------------------------+-------------------------+--------+------------+-------------+--------------------+ 
```

またControllerノード, Computeノードへのsshログインにはユーザheat-adminで可能です。

```
$ ssh heat-admin@10.1.1.13
The authenticity of host '10.1.1.13 (10.1.1.13)' can't be established.
ECDSA key fingerprint is 13:99:79:ea:a1:9f:86:0b:9a:b7:2d:34:1a:b2:bd:45.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.1.13' (ECDSA) to the list of known hosts.
Last login: Fri Aug 26 08:21:24 2016 from 10.1.1.1
[heat-admin@overcloud-controller-0 ~]$ 
```

### Overcloudへのアクセス
Overcloudへのアクセスは`~/overcloudrc`を読むことで可能になります。

```
$ . overcloudrc
```

# Tempestの実行
以下のコマンドでTempestを実行することができます。

```
$ source overcloudrc
$ mkdir tempest
$ cd tempest
$ /usr/share/openstack-tempest-12.0.1.dev286/tools/configure-tempest-directory
$ tools/config_tempest.py --deployer-input ~/tempest-deployer-input.conf \
                        --debug --create \
                        identity.uri $OS_AUTH_URL \
                        identity.admin_password $OS_PASSWORD
$ tools/run-tests.sh
```

# VMの起動まで
undercloudから以下のコマンドを実行することでVMが起動できます。(XXXには実際の値を入れてください)

```
$ . overcloudrc
# セキュリティーグループの追加
$ nova secgroup-add-rule default icmp    -1    -1 0.0.0.0/0 # Ping
$ nova secgroup-add-rule default tcp     22    22 0.0.0.0/0 # SSH
# フレーバーの作成
$ nova flavor-create --swap 256 c1.m1   12  1024 0 1
# イメージの作成
$ curl -O http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
$ openstack image create 'cirros image' --public --container-format bare \
        --disk-format=qcow2 < cirros-0.3.4-x86_64-disk.img

# ネットワークの作成
$ neutron net-create external --router:external \
        --provider:network_type flat \
        --provider:physical_network datacentre 

$ neutron subnet-create external 10.1.1.0/24 --name subnet-ext1 \
        --allocation-pool=start=10.1.1.100,end=10.1.1.199 \
        --dns-nameserver 10.61.123.1 --enable-dhcp=False
$ neutron net-create internal
$ neutron subnet-create internal 192.168.0.0/24 --name subnet-int1

$ neutron router-create router
$ neutron router-gateway-set router external
$ neutron router-interface-add router subnet-int1
$ neutron floatingip-create external

$ nova boot --flavor c2.m4 --image 'cirros image' \
   --nic net-id=f1495ac8-828b-4814-89be-d7a5afcf7100 testvm1
$ nova floating-ip-associate testvm1 <<<上で作成したfloating ip>>>
```

# まとめ
本記事ではTripleOを使用してOpenStackのMitakaをインストールしました。
英語ですが下記のページにTripleOについての情報がありますので参考にして下さい。

* http://docs.openstack.org/developer/tripleo-docs/basic_deployment/basic_deployment_cli.html
* https://gbraad.gitbooks.io/scratchpad/content/technology/openstack/
* http://docs.openstack.org/developer/tripleo-docs/advanced_deployment/network_isolation.html