RDO/TripleOでOpenStack rockyをinstallする(VM編)

# はじめに

本記事ではRDO Projectで主にパッケージング・開発されているTripleOを使ってOpenStackをインストールする手順について紹介します。

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

- VMを3つ作成(Undercloud用 x 1, Controller node用 x 1, Compute node用 x 1)
- Undercloudを用意されたqcowイメージで起動
- UndercloudからController/Computeのインストール

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

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

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

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


![openstack-install-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291/6132ebdd-c800-b498-b37f-7938514ad0f0.png)

# 前準備

物理マシンにLinuxをインストールして、libvirt(virsh)が使えるようにしているか確認してください。

## Network(data1)の作成

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

```
$ cat > provision.xml << EOF
<network>
  <name>tripleo-provision</name>
  <uuid>b7eadbab-7e95-487b-be00-8fa7fc679436</uuid>
  <bridge name='tripleo1' stp='off' 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 provision.xml
$ virsh net-start tripleo-provision
$ virsh net-autostart tripleo-provision
$ iptables -I FORWARD 1 -i tripleo-provision -j ACCEPT
$ iptables -I FORWARD 1 -o tripleo-provision -j ACCEPT
```

## VirtualBMCのインストール

VMの起動等で使われるVirtualBMCをインストールします。

```shell
$ yum install centos-release-openstack-rocky
$ yum install python2-virtualbmc
```

## Overcloud-ctrl, Overcloud-comp1のVMを作成

ここではVMの作成だけ行ないます。起動はTripleOから行なうのでこの時点では電源はOffの状態です。PXEで起動する際にMACアドレスが必要なので、設定してメモをしておくといいでしょう。

```shell-session
$ 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 \
   --network network:data1 --mac=52:54:00:c0:87:36 \
   --cpu host \
   --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 \
   --network network:data1 --mac=52:54:00:c0:87:37 \
   --cpu host \
   --dry-run --print-xml > overcloud-comp1.xml
$ virsh define --file overcloud-comp1.xml
```

## Undercloud用のVMイメージの作成

今回はRDOが用意しているundercloudのVMイメージを使用することでCentOSのインストール等を省略します。[RDOのイメージがあるサイト(https://images.rdoproject.org/rocky/rdo_trunk/current-tripleo-rdo/)](https://images.rdoproject.org/rocky/rdo_trunk/current-tripleo-rdo/)から以下のファイルをダウンロードします。

  * undercloud.qcow2
  * ironic-python-agent.tar

その後以下のコマンドで必要なファイル(`overcloud-full.initrd`,`overcloud-full.vmlinuz`)をqcow2から取得します。

```shell
$ yum install libguestfs-tools
$ virt-copy-out -a undercloud.qcow2 /home/stack/overcloud-full.initrd /home/stack/overcloud-full.vmlinuz .
```

その後に起動のために必要な設定(root password, ネットワーク設定)をqcow2に入れ込みます。ここは自分の環境に合わせてファイルを修正して下さい。

```shell-session
$ cat ifcfg-eth1.undercloud 
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.122.2
NETMASK=255.255.255.0
GATEWAY=192.168.122.1
NM_CONTROLLED=no
DNS1=192.168.122.1
$ virt-customize -a undercloud.qcow2 \
  		 --run-command 'if [ -f /etc/sysconfig/network-scripts/ifcfg-eth0 ] ; then sed -i s/ONBOOT=.*/ONBOOT=\"no\"/g /etc/sysconfig/network-scripts/ifcfg-eth0; fi' \
  		 --upload ifcfg-eth1.undercloud:/etc/sysconfig/network-scripts/ifcfg-eth1 \
		 --hostname undercloud \
		 --root-password password:<PASSWORD> \
		 --selinux-relabel

```

## Undercloud VMの起動

それが終わったらUndercloudのVMを起動させます。

```
$ virt-install --ram 49152 --vcpus 16 --os-variant rhel7 \
    --cpu host --cpuset auto \
    --disk path=./images/undercloud.qcow2,device=disk,bus=virtio,format=raw \
    --boot kernel=./overcloud-full.vmlinuz,initrd=./overcloud-full.initrd,kernel_args="root=/dev/vda" --import  \
    --network network:tripleo1-provision --network network:default \
    --name undercloud
```

## VirtualBMCの設定

起動したVMをUndercloudから操作できるようにVirtualBMCの設定を行ないます。

```shell-session
# vbmc add controller-1 --port 6230  --username admin --password password
# vbmc add compute-1 --port 6231  --username admin --password password
# firewall-cmd --zone=public --add-port=6230/udp # --permanent
# firewall-cmd --zone=public --add-port=6231/udp # --permanent
# firewall-cmd --reload
# vbmc start controller-1
# vbmc start compute-1
```

# Undercloudの設定

ここからUndercloudにログインして作業を行ないます。

```shell-session
$ ssh root@<undercloudのip>
```

作業用アカウント`stack`があらかじめ作成されているのでそのアカウントに移動します。その際にパスワードも設定します。

```shell-session
$ passwd stack
 <パスワードを設定>
$ sudo -iu stack
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa
$ ssh-copy-id <undercloudのip>
```

`/usr/share/python-tripleoclient/undercloud.conf.sample`を参考にundercloud.confを作成しundercloudの初期化を行ないます。

```shell-session
$ openstack tripleo container image prepare default \
  --local-push-destination \
  --output-env-file containers-prepare-parameter.yaml
$ vi ~/undercloud.conf
  </usr/share/python-tripleoclient/undercloud.conf.sample を参考にundercloud.confを作成する>
$ openstack undercloud install
```

# Overcloudのインストール準備

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

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

## Controller,Computeノードの登録・設定

”VirtualBMCの設定"で指定したユーザー名・パスワード・ポート、VM起動時に設定したMACアドレスを使って`instackenv.json`を作成し、`openstack overcloud node import instackenv.json`コマンドで登録します。その後にそれらのVMの環境をundercloudから使えるようにするために`openstack overcloud node introspect --all-manageable --provide`コマンドを実行します。
 
```shell
$ cat > instackenv.json <<EOF
{
  "nodes": [
    {
      "name": "controller-1",
      "pm_type": "ipmi",
      "mac": [
             "52:54:00:c0:87:36"
      ],
      "pm_user": "admin",
      "pm_password": "password",
      "pm_port": "6230",
      "pm_addr": "<HypervisorのIP>"
    },
    {
      "name": "compute-1",
      "pm_type": "ipmi",
      "mac": [
             "52:54:00:a5:16:62"
      ],
      "pm_user": "admin",
      "pm_password": "password",
      "pm_port": "6231",
      "pm_addr": "<HypervisorのIP>"
    }
  ]
}
$ openstack overcloud node import instackenv.json
$ openstack overcloud node introspect --all-manageable --provide
```

次にVMとインストールするロールを関連付けします。

```shell-session
$ openstack baremetal node set --property capabilities='profile:control,boot_option:local' $(openstack baremetal node list -f json | jq '.[]| select(.Name=="controller-1") |.UUID' -r)
$ openstack baremetal node set --property capabilities='profile:compute,boot_option:local' $(openstack baremetal node list -f json | jq '.[]| select(.Name=="compute-1") |.UUID' -r)
```

DNSの設定を行ないます。

```shell-session
$ openstack subnet set $(openstack subnet list -f json | jq '.[0].ID' -r) \
        --dns-nameserver 10.10.160.1
```

UndercloudのSSL証明書をovercloudに設定するためのファイルと、タイムゾーン等の各種の設定ファイルを作成します。

```shell-session
$ cat > inject-trust-anchor-hiera.yaml <<EOF
parameter_defaults:
  # Map containing the CA certs and information needed for deploying them.
  # Type: json
  CAMap:
    undercloud-ca:
      content: |
        -----BEGIN CERTIFICATE-----
        MIIDjTCCAnWgAwIBAgIQOzHkDsEDSimf4HjKQi9HJTANBgkqhkiG9w0BAQsFADBQ
        ... 省略(/etc/pki/ca-trust/source/anchors/cm-local-ca.pemの中身をインデントして記入)
        8vUQFLbdFCSBMJjuh02VVsmLbwII5TtkJ4D6s2wO4vyZgzakGoivPM/mQenuIdA5
        lg==
        -----END CERTIFICATE-----
EOF
$ cat > node_info.yaml <<EOF
parameter_defaults:
  OvercloudControllerFlavor: control
  OvercloudComputeFlavor: compute
  ControllerCount: 1
  ComputeCount: 1
  TimeZone: 'Japan'
EOF
```

`openstack overcloud deploy`でController,Computeノードのデプロイを行ないます。

```shell-session
$ openstack overcloud deploy --templates /usr/share/openstack-tripleo-heat-templates \
-e /home/stack/containers-prepare-parameter.yaml \
-e /home/stack/inject-trust-anchor-hiera.yaml \
-e /home/stack/node-info.yaml \
--ntp-server pool.ntp.org --libvirt-type kvm \
--log-file overcloud_deployment_0.log
```