1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Red Hat OpenStack Platform 13(RHOSP13)構築手順まとめ

Last updated at Posted at 2025-09-27

🔰 はじめに

Red Hat OpenStack Platform 13(以下、RHOSP13)は、OpenStack QueensベースのRed Hatによる商用ディストリビューションであり、かつてはオンプレミスやプライベートクラウド環境で利用されていました。

現在では、RHOSP16やRHOSP17といったより新しいバージョンが主流となっております。しかし、TripleOによるデプロイメントの時代も終焉を迎えつつあり、Red Hat OpenStack Services on OpenShift(RHOSO)が新たな標準として台頭してきました。

本記事では、あえて時代に逆行し、 RHOSP13を用いた最小構成のOpenStackクラウドを構築する手順 をまとめています。

RHOSP13/16の初期設計構築から携わってきましたが、現在手元にあるのは旧RHOSP13向けの構築用リポジトリ資材しかないため、自宅検証環境ではこの構成でしか再現できないという、切ない事情があるからです 😇

RHOSPパッケージが体験版として自由にダウンロードできた時代もありました。

:page_facing_up: RHOSP13の構成イメージ図

以下は、RHOSP13を使用した自宅検証環境におけるアーキテクチャ構成図です。

RHOSP.png

:tools: RHOSP13の主要コンポーネント

アンダークラウド(Undercloud)とは?

アンダークラウドは、TripleO(OpenStack on OpenStack)方式において、他のOpenStackノード(オーバークラウド)をデプロイ・管理するための専用OpenStack環境です。
いわば「OpenStackを構築するためのOpenStack」であり、構築専用の制御ノードです。

  • 役割:オーバークラウドの構成・導入・初期設定を行う
  • コンポーネント:主に ironic(ベアメタルプロビジョニング)、heat(テンプレートベースの構成管理)、nova などの限定的なサービスが動作
  • CLIツール:OpenStack Director(ダイレクタ)でオーバークラウド構成・展開操作を実施

オーバークラウド(Overcloud)とは?

オーバークラウドは、ユーザーが実際に利用するOpenStackクラウド環境です。
アンダークラウドを通じて構築され、コントローラー、コンピュート、ストレージ等の役割を持つ複数のノード群で構成されます。

  • 役割:仮想マシン、ストレージ、ネットワークなどクラウドとしての機能を提供
  • コンポーネント:keystone, nova, neutron, glance, cinder, horizon などが動作
  • 利用者:クラウド利用者やアプリケーション開発者が接続して利用

RHOSP01_1.png

・アンダークラウド自身はあくまでオーバークラウド管理用になります。
・TripleO環境では、Heatテンプレートを駆使してオーバークラウドを定義します。

🧱 構成概要

ノード構成

最小要件をさらに下回る構成ですがなんとか動作可能な範囲です。
CPUとメモリはあればあるだけ安定します。

表1.基本情報

サーバ種別 CPU (core) メモリ (GB) HDD (GB) ホスト名
リポジトリサーバ 1 1 40 CentOS7Repo
KVMホストサーバ
(アンダークラウド用)
3 10 50 Undercloud-KVM
アンダークラウド 2 8 40 undercloud-node
KVMホストサーバ
(オーバークラウド用)
8 24 100 Overcloud-KVM
コントローラーノード 1 8 40 overcloud-ctrl
コンピュートノード 1 8 40 overcloud-comp

表2.ネットワーク情報

サーバ種別 ホスト接続 IP プロビ IP コンテナPull IP
リポジトリサーバ 192.168.1.79
KVMホストサーバ
(アンダークラウド用)
192.168.1.80 192.168.100.1 192.168.1.82
アンダークラウド 192.168.1.84 192.168.100.3
KVMホストサーバ
(オーバークラウド用)
192.168.1.81 192.168.100.2 192.168.1.83
コントローラーノード 192.168.1.85 192.168.100.5
コンピュートノード 192.168.1.x 192.168.100.x
※家庭用ルータ(DNS兼インターネットGW)は192.168.1.1/24で稼働

1. リポジトリサーバの作成

RHOSP13用のパッケージを提供するリポジトリサーバを構築します。
インターネット経由でRedHatリポジトリに接続してRHOSPをセットアップする方法もありますが、今回はオフライン環境用としてセットアップします。

1.1 仮想マシン作成

VMware Workstation Playerを使用して、以下の仮想マシンを作成します。

リポジトリサーバ

  • ホスト名:CentOS7Repo
  • OS:CentOS 7 Minimalインストール
  • ブリッジNIC(ens33):IP 192.168.1.79/24:GW/DNS 192.168.1.1
  • CPU/メモリ/HDD:1core/1GB/40GB

1.2 YUM リポジトリの設定

以下の内容で /etc/yum.repos.d/CentOS-Base.repo を設定します。

cat <<EOF > /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=http://vault.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://vault.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://vault.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF

システム更新とDockerレジストリにサービスをインストールします。

# システムを最新状態に更新
yum clean all
yum update -y

# Dockerレジストリのインストール
yum install docker-distribution

# Dockerレジストリサービスの起動と自動起動設定
systemctl start docker-distribution.service
ystemctl enable docker-distribution.service

レジストリ設定ファイル /etc/docker-distribution/registry/config.yml を以下のように設定します。

config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
    cache:
        layerinfo: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
http:
    addr: :5000

1.3 Docker イメージ資材の展開

事前に RHOSP13 リポジトリ資材をオンラインから取得して docker.tar.gz に圧縮しています。
これを /root に転送後、以下の手順で展開・配置します。

# 事前に準備したDockerイメージ資材を展開
tar xzf docker.tar.gz

# レジストリの保存ディレクトリに配置
cp -pr docker /var/lib/registry/

# レジストリが正しく動作しているかを確認
curl http://localhost:5000/v2/_catalog

Apache HTTP リポジトリの構築

# VMware Toolsのインストール
yum -y install open-vm-tools

# ローカルYUMリポジトリツールのインストール
yum -y install httpd createrepo

# Firewalld停止・無効化
systemctl stop firewalld
systemctl disable firewalld

# SELinux無効化(再起動後に有効)
sed -i s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config

リポジトリディレクトリの作成と権限設定

mkdir -p /var/www/repos
chmod -R 755 /var/www/repos

リポジトリ資材の展開

# 不要となったDocker資材アーカイブを削除
rm docker.tar.gz

# 各種リポジトリ資材を /var/www/repos に展開
tar xzf rhel-ha-for-rhel-7-server-rpms.tgz -C /var/www/repos
tar xzf rhel-7-server-extras-rpms.tgz -C /var/www/repos
tar xzf rhel-7-server-rh-common-rpms.tgz -C /var/www/repos
tar xzf rhel-7-server-rpms.tgz -C /var/www/repos
tar xzf rhel-7-server-openstack-13-rpms.tgz -C /var/www/repos

createrepo によるメタデータ生成

# 各リポジトリディレクトリに対して createrepo を実行
createrepo /var/www/repos/rhel-7-server-extras-rpms/
createrepo /var/www/repos/rhel-7-server-openstack-13-rpms/
createrepo /var/www/repos/rhel-7-server-rh-common-rpms/
createrepo /var/www/repos/rhel-7-server-rpms/
createrepo /var/www/repos/rhel-ha-for-rhel-7-server-rpms/

1.4 Apache の設定

/etc/httpd/conf.d/repos.conf を作成

repos.conf
Alias /repos /var/www/repos
<directory /var/www/repos>
    Options +Indexes
    Require all granted
</directory>

Apache サービスの起動と自動起動設定

systemctl restart httpd
systemctl enable httpd

この構成により、内部ネットワーク上で RHOSP13 向けのローカル YUM リポジトリと Docker レジストリを提供できます。

2. KVMホストの作成

2.1 仮想マシンのOSインストール

VMware Workstation Playerを使用して、以下の仮想マシンを作成します。

KVMホストサーバ(アンダークラウド用)
  • ホスト名:Undercloud-KVM
  • OS:Red Hat Enterprise Linux 7.6 Minimalインストール
  • ブリッジNIC(ens33):IP 192.168.1.80/24:GW/DNS 192.168.1.1
  • ブリッジNIC(ens34):後に設定
  • ブリッジNIC(ens35):後に設定
  • CPU/メモリ/HDD:3core/10GB/50GB
  • Intel VT-x 有効化
KVMホストサーバ(オーバークラウド用)
  • ホスト名:Overcloud-KVM
  • OS:Red Hat Enterprise Linux 7.6 Minimalインストール
  • ブリッジNIC(ens33):IP 192.168.1.81/24:GW/DNS 192.168.1.1
  • ブリッジNIC(ens34):後に設定
  • ブリッジNIC(ens35):後に設定
  • CPU/メモリ/HDD:8core/24GB/100GB
  • Intel VT-x 有効化

2.2 KVMホストサーバのセットアップ(共通設定)

# RHEL登録(事前にアカウント登録)
subscription-manager register

# SELinux無効化(再起動後に有効)
sed -i s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config

# VMware Toolsインストール(VM環境用)
yum -y install open-vm-tools

# Firewalld停止・無効化
systemctl stop firewalld
systemctl disable firewalld

# 仮想化パッケージのインストール
yum install -y qemu-kvm libvirt virt-install virt-manager bridge-utils
systemctl start libvirtd
systemctl enable libvirtd

2.3 ローカルYUMリポジトリ設定(共通設定)

cat <<EOF > /etc/yum.repos.d/rhosp13.repo
[rhel-7-server-extras-rpms]
name=rhel-7-server-extras-rpms
baseurl=http://192.168.1.79/repos/rhel-7-server-extras-rpms/
gpgcheck=0
enabled=1

[rhel-7-server-openstack-13-rpms]
name=rhel-7-server-openstack-13-rpms
baseurl=http://192.168.1.79/repos/rhel-7-server-openstack-13-rpms/
gpgcheck=0
enabled=1

[rhel-7-server-rh-common-rpms]
name=rhel-7-server-rh-common-rpms
baseurl=http://192.168.1.79/repos/rhel-7-server-rh-common-rpms/
gpgcheck=0
enabled=1

[rhel-7-server-rpms]
name=rhel-7-server-rpms
baseurl=http://192.168.1.79/repos/rhel-7-server-rpms/
gpgcheck=0
enabled=1

[rhel-ha-for-rhel-7-server-rpms]
name=rhel-ha-for-rhel-7-server-rpms
baseurl=http://192.168.1.79/repos/rhel-ha-for-rhel-7-server-rpms/
gpgcheck=0
enabled=1
EOF

2.4 KVM Nested Virtualization設定(共通設定)

KVMでは、Nested Virtualizationを有効にすることで、仮想マシンの中でさらに仮想マシンを動かすことができます。この設定がないとコンピュートノード上でVM作成が失敗します。

設定ファイルを作成する

モジュールロード時に自動でNestedオプションが適用されるように設定ファイルを作成

echo "options kvm_intel nested=1" > /etc/modprobe.d/kvm-nested.conf

モジュールを再読み込みする

設定を即時反映するために、kvm_intelモジュールを一度アンロードして再ロードします。
実行中の仮想マシンがある場合は、事前にすべて停止しておいてください。

modprobe -r kvm_intel
modprobe kvm_intel

設定が反映されたか確認する

Nested Virtualizationが有効になったかを確認するには、次のコマンドを実行します。
出力が Y(Yes)になっていれば、設定成功です。

cat /sys/module/kvm_intel/parameters/nested

2.5 ネットワークブリッジ設定(Undercloud-KVM)

Undercloud-KVMにて、KVMマシン用のネットワークブリッジ設定をします。

プロビジョニングネットワーク設定(ens34 → br-provi)

アンダークラウドのPXEブートやDHCPに使用

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-ens34
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens34
ONBOOT=yes
BRIDGE=br-provi
EOF

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-br-provi
TYPE=Bridge
BOOTPROTO=static
DEVICE=br-provi
ONBOOT=yes
IPADDR=192.168.100.1
NETMASK=255.255.255.0
EOF

管理ネットワーク設定(ens35 → br-mgr)

コンテナPullやリモートアクセス

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-ens35
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens35
ONBOOT=yes
BRIDGE=br-mgr
EOF

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-br-mgr
TYPE=Bridge
BOOTPROTO=static
DEVICE=br-mgr
ONBOOT=yes
IPADDR=192.168.1.82
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
EOF

ネットワーク再読み込みと確認

nmcli connection reload
systemctl restart network
brctl show

2.5 ネットワークブリッジ構成(Overcloud-KVM)

Overcloud-KVMにて、KVMマシン用のネットワークブリッジ設定をします。

プロビジョニングネットワーク設定(ens34 → br-provi)

アンダークラウドのPXEブートやDHCPに使用

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-ens34
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens34
ONBOOT=yes
BRIDGE=br-provi
EOF

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-br-provi
TYPE=Bridge
BOOTPROTO=static
DEVICE=br-provi
ONBOOT=yes
IPADDR=192.168.100.2
NETMASK=255.255.255.0
EOF

管理ネットワーク設定(ens35 → br-mgr)

コンテナPullやリモートアクセス

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-ens35
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens35
ONBOOT=yes
BRIDGE=br-mgr
EOF

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-br-mgr
TYPE=Bridge
BOOTPROTO=static
DEVICE=br-mgr
ONBOOT=yes
IPADDR=192.168.1.83
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
EOF

ネットワーク再読み込みと確認

nmcli connection reload
systemctl restart network
brctl show

3. アンダークラウド仮想環境構築(KVM)

ISOファイルを配置

/tmp/rhel-server-7.6-x86_64-dvd.iso

必要なパッケージをインストール

yum -y install pykickstart

仮想ディスクの作成

qemu-img create -f qcow2 /var/lib/libvirt/images/undercloud-node.qcow2 40G

アンダークラウド Kickstartファイルの作成

ここでは、Red Hat OpenStack Platform(RHOSP)環境におけるアンダークラウド構築用のkickstartファイルを作成します。
以下に、基本的なkickstartファイルの例を示します。必要に応じてカスタマイズしてください。

cat <<EOF > /var/lib/libvirt/images/undercloud-node.cfg
#version=RHEL7

install
cdrom
text
cmdline
skipx

lang en_US.UTF-8
keyboard --vckeymap=jp106 --xlayouts=jp
timezone Asia/Tokyo --isUtc --nontp

# ネットワーク設定
network --bootproto=static --ip=192.168.100.3 --netmask=255.255.255.0 --device=eth0 --onboot=on --activate
network --bootproto=static --ip=192.168.1.84 --netmask=255.255.255.0 --gateway=192.168.1.1 --nameserver=8.8.8.8 --device=eth1 --onboot=on --activate

# パーティション設定
zerombr
bootloader --location=mbr

clearpart --all --initlabel
part / --fstype=xfs --grow --size=1 --asprimary --label=root

rootpw --plaintext vmware
user --name=user --password=vmware

#selinux --disabled
firewall --disabled
firstboot --disable

# パッケージセクション
%packages
%end

# リブート前にDVDを排出する
reboot --eject
EOF

アンダークラウド仮想マシンの作成・起動

virt-install \
  --name undercloud-node \
  --ram 8192 \
  --vcpus 2 \
  --os-variant rhel7 \
  --disk path=/var/lib/libvirt/images/undercloud-node.qcow2,size=40 \
  --location '/tmp/rhel-server-7.6-x86_64-dvd.iso' \
  --network bridge=br-provi,model=virtio \
  --network bridge=br-mgr,model=virtio \
  --initrd-inject /var/lib/libvirt/images/undercloud-node.cfg \
  --graphics none \
  --extra-args "ks=file:/undercloud-node.cfg console=ttyS0,115200"

※仮想マシン作成後のログインコンソールはCtrl+]で抜けることができる

virsh autostart undercloud-node

3. オーバークラウド仮想環境構築(KVM + VBMC)

ISOファイルを配置

/tmp/rhel-server-7.6-x86_64-dvd.iso

必要なパッケージをインストール

yum -y install pykickstart

仮想ディスクの作成

qemu-img create -f qcow2 /var/lib/libvirt/images/overcloud-ctrl.qcow2 40G
qemu-img create -f qcow2 /var/lib/libvirt/images/overcloud-comp.qcow2 40G

オーバークラウドノードの作成(PXEブート)

各オーバークラウドノードはPXEブートでインストールされるため、起動時にディスクは存在しますがOSは未導入の状態です。
メモリは8GBは欲しい。6GBだとデプロイが処理落ちで失敗することがある。
HDD容量はフレーバーイメージ(40GB)より大きいサイズにしている。

# 仮想マシン作成(コントローラーノード)
virt-install \
  --name overcloud-ctrl \
  --ram 8192 \
  --vcpus 1 \
  --os-variant rhel7 \
  --disk path=/var/lib/libvirt/images/overcloud-ctrl.qcow2,size=40 \
  --network bridge=br-provi,model=virtio,mac=52:54:00:ab:cd:01 \
  --network bridge=br-mgr,model=virtio \
  --pxe \
  --noautoconsole
  
# 仮想マシン作成(コンピュートノード)
virt-install \
  --name overcloud-comp \
  --ram 8192 \
  --vcpus 2 \
  --cpu host-passthrough \
  --os-variant rhel7 \
  --disk path=/var/lib/libvirt/images/overcloud-comp.qcow2,size=40 \
  --network bridge=br-provi,model=virtio,mac=52:54:00:ab:cd:02 \
  --network bridge=br-mgr,model=virtio \
  --pxe \
  --noautoconsole

【なぜ cpu mode='host-passthrough' が必要なのか?】
KVM上に立てたコンピュートノードは「仮想マシン上の仮想マシン」を作ろうとします(Nested Virtualization)。
このとき、コンピュートノードのlibvirt設定で CPUをホストCPUそのまま渡す(host-passthrough) にしておかないと、ゲストVMから見ると仮想化機能(VMX, SVM)が見えず、VMの起動に失敗します。

仮想マシンの自動起動設定

オーバークラウドノード(コントローラ/コンピュート)がホスト起動時に自動起動するよう設定します。

virsh autostart overcloud-ctrl
virsh autostart overcloud-comp

Virtual BMC(VBMC)の設定

仮想マシンに対して IPMI 経由の管理操作を可能にするため、Virtual BMC を設定します。

# 必要なパッケージをインストール
yum -y install python2-virtualbmc python-setuptools ipmitool

それぞれのノードに対して、仮想BMCを登録・起動します。

# Virtual BMC の登録
vbmc add overcloud-ctrl --port 6232 --username admin --password password --address 192.168.100.2
vbmc add overcloud-comp --port 6233 --username admin --password password --address 192.168.100.2

# Virtual BMC の起動
vbmc start overcloud-ctrl
vbmc start overcloud-comp

# 状態確認
vbmc list

上記コマンド実行時に出力される「Exception TypeError: "'NoneType' object is not callable" in ignored」のエラーは無視しても良いです。

後作業のデプロイなどでvbmcがエラーを出力して停止になることがあります。
その時はvbmc startで再起動してください。

アンダークラウド環境セットアップ

リポジトリ設定(アンダークラウド用)

アンダークラウドで使用するリポジトリを、リポジトリサーバ参照用に設定します。

cat <<EOF > /etc/yum.repos.d/rhosp13.repo
[rhel-7-server-extras-rpms]
name=rhel-7-server-extras-rpms
baseurl=http://192.168.1.79/repos/rhel-7-server-extras-rpms/
gpgcheck=0
enabled=1

[rhel-7-server-openstack-13-rpms]
name=rhel-7-server-openstack-13-rpms
baseurl=http://192.168.1.79/repos/rhel-7-server-openstack-13-rpms/
gpgcheck=0
enabled=1

[rhel-7-server-rh-common-rpms]
name=rhel-7-server-rh-common-rpms
baseurl=http://192.168.1.79/repos/rhel-7-server-rh-common-rpms/
gpgcheck=0
enabled=1

[rhel-7-server-rpms]
name=rhel-7-server-rpms
baseurl=http://192.168.1.79/repos/rhel-7-server-rpms/
gpgcheck=0
enabled=1

[rhel-ha-for-rhel-7-server-rpms]
name=rhel-ha-for-rhel-7-server-rpms
baseurl=http://192.168.1.79/repos/rhel-ha-for-rhel-7-server-rpms/
gpgcheck=0
enabled=1
EOF

# キャッシュのクリア
yum clean all

アンダークラウド環境の初期設定

# ホスト名の設定
cat <<EOF > /etc/hostname
undercloud-node.localdomain
EOF

# stack ユーザの作成と sudo 権限付与(パスワードは任意)
useradd stack
passwd stack
echo "stack ALL=(root) NOPASSWD:ALL" | tee -a /etc/sudoers.d/stack
chmod 0440 /etc/sudoers.d/stack

次に stack ユーザーでログインし、作業用ディレクトリを準備&システムを更新します。

su - stack
mkdir ~/images ~/templates

sudo yum update -y
sudo reboot

TripleO クライアントのインストール

アンダークラウドの構成とデプロイを行うために、TripleO クライアントをインストールします。

su - stack
sudo yum install -y python-tripleoclient

python-tripleoclient は、openstack undercloud install や openstack overcloud deploy コマンドなどを提供する TripleO のフロントエンドです。

undercloud.conf の作成

undercloud.conf は、アンダークラウドの構成内容を定義する設定ファイルを作成します。

cat <<EOF > undercloud.conf
[DEFAULT]

# Provisioning ネットワーク(ctlplane)で使用する IP アドレスとインターフェース
local_ip = 192.168.100.3/24
local_interface = eth0

# 管理ネットワークのインターフェース。
undercloud_admin_host = 192.168.1.84

# DNS/NTP 設定
undercloud_nameservers = 8.8.8.8
undercloud_ntp_servers = time.google.com

# インスペクション時の詳細情報収集やUEFI対応
inspection_extras = true
inspection_enable_uefi = true

# オーバークラウド構築で使用するBMC通信のIPMI有効化。
enabled_hardware_types = ipmi

# デバッグログ有効化(任意)
undercloud_debug = true

# インストール中のパッケージ更新
undercloud_update_packages = true

[ctlplane-subnet]

# ctlplane(プロビジョニングネットワーク)の範囲と割り当て範囲
cidr = 192.168.100.0/24
dhcp_start = 192.168.100.10
dhcp_end = 192.168.100.20
inspection_iprange = 192.168.100.21,192.168.100.31
gateway = 192.168.100.3
masquerade = true
EOF

OpenStack Director(ダイレクタ) を構成

以下のコマンドを実行して、Directorを構成します。

LANG=en_US.UTF-8 openstack undercloud install

インストール後、stack ユーザーとしてログインし、環境変数を読み込みます。

exec su -l stack
source ~/stackrc

オーバークラウドのデプロイセットアップ

オーバークラウドイメージの展開

アンダークラウドのstackユーザとして、オーバークラウド用のイメージを準備してアップロードします。

# 必要なパッケージをインストール
sudo yum -y install rhosp-director-images rhosp-director-images-ipa

# イメージの展開ディレクトリを作成・移動
cd ~/images

# tar ファイルを展開
for i in /usr/share/rhosp-director-images/overcloud-full-latest-13.0.tar /usr/share/rhosp-director-images/ironic-python-agent-latest-13.0.tar; do tar -xvf $i; donefor i in /usr/share/rhosp-director-images/*.tar; do tar -xvf $i; done

# オーバークラウドイメージをアップロード
openstack overcloud image upload --image-path /home/stack/images/openstack overcloud image upload --image-path ~/images/

# カレントディレクトリ移動
cd

ノード定義ファイルの作成

オーバークラウドノードのハードウェア情報や BMC(IPMI)設定を記述した定義ファイル instackenv.json を作成します。

instackenv.json
cat <<EOF > instackenv.json
{
  "nodes": [
    {
      "name": "overcloud-ctrl",
      "pm_type": "ipmi",
      "pm_user": "admin",
      "pm_password": "password",
      "pm_addr": "192.168.100.2",
      "pm_port": "6232",
      "mac": [
        "52:54:00:ab:cd:01"
      ],
      "cpu": "1",
      "memory": "8192",
      "disk": "40"
    },
    {
      "name": "overcloud-comp",
      "pm_type": "ipmi",
      "pm_user": "admin",
      "pm_password": "password",
      "pm_addr": "192.168.100.2",
      "pm_port": "6233",
      "mac": [
        "52:54:00:ab:cd:02"
      ],
      "cpu": "2",
      "memory": "8192",
      "disk": "40"
    }
  ]
}
EOF

PXEブート用のDHCPサーバは アンダークラウドにより提供されます。
そのため、DHCPサーバ(例:192.168.1.1)が存在する場合は、次のイントロスペクション~デプロイの間だけ一時的に無効化にしてください。
※今回は自宅の家庭用ルータのDHCPサーバ機能を無効にしています。

ノードのインポートとイントロスペクション(ハードウェア検出)

定義ファイルを使ってノードを登録し、ハードウェア情報の収集(イントロスペクション)を実施します。

# ノードをインポート
openstack overcloud node import ~/instackenv.json

# イントロスペクションを実行(--provide により イントロスペクション後に管理状態へ)
openstack overcloud node introspect --all-manageable --provide

各ノードの UUID を確認し、プロパティを設定

# 各ノードの UUID を確認
openstack baremetal node show overcloud-ctrl | grep uuid
openstack baremetal node show overcloud-comp | grep uuid

取得した UUID を使って、各ノードにプロパティを設定します。

# Controller ノードのプロパティを設定
openstack baremetal node set --property capabilities='node:controller-0,profile:control,boot_option:local' <overcloud-ctrlのUUID>

# Compute ノードのプロパティを設定
openstack baremetal node set --property capabilities='node:compute-0,profile:compute,boot_option:local' <overcloud-compのUUID>

テンプレート配置

デプロイ用のテンプレートを配置します。

/home/stack/templates/net-software-config/controller.yaml
heat_template_version: queens

description: >
  Software Config to drive os-net-config for the controller role.

parameters:
  ControlPlaneIp:
    default: ''
    description: IP address/subnet on the ctlplane network
    type: string
  ControlPlaneSubnetCidr:
    default: '24'
    description: The subnet CIDR of the control plane network.
    type: string
  ControlPlaneInterfaceDefaultRoute:
    default: ''
    description: Default route for the control plane network.
    type: string
  InternalApiIpSubnet:
    default: ''
    description: IP address/subnet on the internal_api network.
    type: string
  InternalApiInterfaceDefaultRoute:
    default: ''
    description: Default route for the internal API network.
    type: string

resources:
  OsNetConfigImpl:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config:
        str_replace:
          template: { get_file: /usr/share/openstack-tripleo-heat-templates/network/scripts/run-os-net-config.sh }
          params:
            $network_config:
              network_config:
                - type: interface
                  name: eth0
                  use_dhcp: false
                  onboot: true
                  addresses:
                    - ip_netmask: 
                        list_join:
                        - /
                        - - get_param: ControlPlaneIp
                          - get_param: ControlPlaneSubnetCidr
                  routes:
                    - ip_netmask: 0.0.0.0/0
                      next_hop: 192.168.100.3
                - type: interface
                  name: eth1
                  use_dhcp: false
                  onboot: true
                  addresses:
                    - ip_netmask:
                        get_param: InternalApiIpSubnet
outputs:
  OS::stack_id:
    description: The OsNetConfigImpl resource.
    value: { get_resource: OsNetConfigImpl }
/home/stack/templates/net-software-config/compute.yaml
heat_template_version: queens

description: >
  Software Config to drive os-net-config for the controller role.

parameters:
  ControlPlaneIp:
    default: ''
    description: IP address/subnet on the ctlplane network
    type: string
  ControlPlaneSubnetCidr:
    default: '24'
    description: The subnet CIDR of the control plane network.
    type: string
  ControlPlaneInterfaceDefaultRoute:
    default: ''
    description: Default route for the control plane network.
    type: string
  InternalApiIpSubnet:
    default: ''
    description: IP address/subnet on the internal_api network.
    type: string
  InternalApiInterfaceDefaultRoute:
    default: ''
    description: Default route for the internal API network.
    type: string

resources:
  OsNetConfigImpl:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config:
        str_replace:
          template: { get_file: /usr/share/openstack-tripleo-heat-templates/network/scripts/run-os-net-config.sh }
          params:
            $network_config:
              network_config:
                - type: interface
                  name: eth0
                  use_dhcp: false
                  onboot: true
                  addresses:
                    - ip_netmask: 
                        list_join:
                        - /
                        - - get_param: ControlPlaneIp
                          - get_param: ControlPlaneSubnetCidr
                  routes:
                    - ip_netmask: 0.0.0.0/0
                      next_hop: 192.168.100.3
                - type: interface
                  name: eth1
                  use_dhcp: false
                  onboot: true
                  addresses:
                    - ip_netmask:
                        get_param: InternalApiIpSubnet


outputs:
  OS::stack_id:
    description: The OsNetConfigImpl resource.
    value: { get_resource: OsNetConfigImpl }
/home/stack/templates/custom-env.yaml
parameter_defaults:
  GlanceBackend: file
/home/stack/templates/firstboot.yaml
resource_registry:
  OS::TripleO::NodeUserData: /usr/share/openstack-tripleo-heat-templates/firstboot/userdata_root_password.yaml 
/home/stack/templates/network_data.yaml
# List of networks, used for j2 templating of enabled networks
#
# Supported values:
#
# name: Name of the network (mandatory)
# name_lower: lowercase version of name used for filenames
#             (optional, defaults to name.lower())
# service_net_map_replace: if name_lower is set to a custom name this should be set
#             to original default (optional).  This field is only necessary when
#             changing the default network names, not when adding a new custom network.
# enabled: Is the network enabled (optional, defaults to true)
# NOTE: False will use noop.yaml for unused legacy networks to support upgrades.
# vlan: vlan for the network (optional)
# vip: Enable creation of a virtual IP on this network
# ip_subnet: IP/CIDR, e.g. '192.168.24.0/24' or '2001:db8:fd00:1000::/64'
#            (optional, may use parameter defaults instead)
# allocation_pools: IP range list e.g. [{'start':'10.0.0.4', 'end':'10.0.0.250'}]
# gateway_ip: gateway for the network (optional, may use parameter defaults)
# ipv6_subnet: Optional, sets default IPv6 subnet if IPv4 is already defined.
# ipv6_allocation_pools: Set default IPv6 allocation pools if IPv4 allocation pools
#                        are already defined.
# ipv6_gateway: Set an IPv6 gateway if IPv4 gateway already defined.
# ipv6: If ip_subnet not defined, this specifies that the network is IPv6-only.
# NOTE: IP-related values set parameter defaults in templates, may be overridden,
# either by operators, or e.g in environments/network-isolation-v6.yaml where we
# set some default IPv6 addresses.
# compat_name: for existing stack you may need to override the default
#              transformation for the resource's name.
#
# Example:
# - name Example
#   vip: false
#   ip_subnet: '10.0.2.0/24'
#   allocation_pools: [{'start': '10.0.2.4', 'end': '10.0.2.250'}]
#   gateway_ip: '10.0.2.254'
#
# To support backward compatility, two versions of the network definitions will
# be created, network/<network>.yaml and network/<network>_v6.yaml. Only
# one of these files may be used in the deployment at a time, since the
# parameters used for configuration are the same in both files. In the
# future, this behavior may be changed to create only one file for custom
# networks. You may specify IPv6 addresses for ip_subnet, allocation_pools,
# and gateway_ip if no IPv4 addresses are used for a custom network, or set
# ipv6: true, and the network/<network>.yaml file will be configured as IPv6.
#
# For configuring both IPv4 and IPv6 on the same interface, use two separate
# networks, and then assign both IPs to the same interface in a custom NIC
# configuration templates.
#
# The ordering of the networks below will determine the order in which NICs
# are assigned in the network/config/multiple-nics templates, beginning with
# NIC2, Control Plane is always NIC1.

- name: Storage
  vip: true
  vlan: 30
  name_lower: storage
  ip_subnet: '172.16.1.0/24'
  allocation_pools: [{'start': '172.16.1.4', 'end': '172.16.1.250'}]
  ipv6_subnet: 'fd00:fd00:fd00:3000::/64'
  ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:3000::10', 'end': 'fd00:fd00:fd00:3000:ffff:ffff:ffff:fffe'}]
- name: StorageMgmt
  name_lower: storage_mgmt
  vip: true
  vlan: 40
  ip_subnet: '172.16.3.0/24'
  allocation_pools: [{'start': '172.16.3.4', 'end': '172.16.3.250'}]
  ipv6_subnet: 'fd00:fd00:fd00:4000::/64'
  ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:4000::10', 'end': 'fd00:fd00:fd00:4000:ffff:ffff:ffff:fffe'}]
- name: InternalApi
  name_lower: internal_api
  vip: true
  vlan: 20
  ip_subnet: '172.16.2.0/24'
  allocation_pools: [{'start': '172.16.2.4', 'end': '172.16.2.250'}]
  ipv6_subnet: 'fd00:fd00:fd00:2000::/64'
  ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:2000::10', 'end': 'fd00:fd00:fd00:2000:ffff:ffff:ffff:fffe'}]
- name: Tenant
  vip: false  # Tenant network does not use VIPs
  name_lower: tenant
  vlan: 50
  ip_subnet: '172.16.0.0/24'
  allocation_pools: [{'start': '172.16.0.4', 'end': '172.16.0.250'}]
  ipv6_subnet: 'fd00:fd00:fd00:5000::/64'
  ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:5000::10', 'end': 'fd00:fd00:fd00:5000:ffff:ffff:ffff:fffe'}]
- name: External
  vip: true
  name_lower: external
  vlan: 10
  ip_subnet: '10.0.0.0/24'
  allocation_pools: [{'start': '10.0.0.4', 'end': '10.0.0.250'}]
  gateway_ip: '10.0.0.1'
  ipv6_subnet: '2001:db8:fd00:1000::/64'
  ipv6_allocation_pools: [{'start': '2001:db8:fd00:1000::10', 'end': '2001:db8:fd00:1000:ffff:ffff:ffff:fffe'}]
  gateway_ipv6: '2001:db8:fd00:1000::1'
- name: Management
  # Management network is enabled by default for backwards-compatibility, but
  # is not included in any roles by default. Add to role definitions to use.
  enabled: true
  vip: false  # Management network does not use VIPs
  name_lower: management
  vlan: 60
  ip_subnet: '10.0.1.0/24'
  allocation_pools: [{'start': '10.0.1.4', 'end': '10.0.1.250'}]
  ipv6_subnet: 'fd00:fd00:fd00:6000::/64'
  ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:6000::10', 'end': 'fd00:fd00:fd00:6000:ffff:ffff:ffff:fffe'}]
/home/stack/templates/network-environment.yaml
resource_registry:
  OS::TripleO::Controller::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api_from_pool.yaml
  OS::TripleO::Network::InternalApi: /usr/share/openstack-tripleo-heat-templates/network/internal_api.yaml
  OS::TripleO::Controller::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api.yaml
  OS::TripleO::Compute::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api.yaml
  OS::TripleO::Network::Ports::InternalApiVipPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api.yaml
  OS::TripleO::Controller::Net::SoftwareConfig: /home/stack/templates/net-software-config/controller.yaml
  OS::TripleO::Compute::Net::SoftwareConfig: /home/stack/templates/net-software-config/compute.yaml
  OS::TripleO::Network::Ports::RedisVipPort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml

parameter_defaults:
  # ctlplane - プロビジョニングネットワーク
  ControlPlaneIpSubnet: 192.168.100.0/24
  ControlPlaneSubnetCidr: 24
  ControlPlaneInterfaceDefaultRoute: 192.168.100.3
  ControlFixedIPs: [{'ip_address':'192.168.100.5'}]

  # internal_api - 内部APIネットワーク
  InternalApiNetCidr: 192.168.1.0/24
  InternalApiIpSubnet: 192.168.1.0/24
  InternalApiAllocationPools: []
  InternalApiVirtualFixedIPs: [{'ip_address':'192.168.1.85'}]
  InternalApiInterfaceDefaultRoute: 192.168.1.84

  # コントローラIPマッピング
  ControllerIPs:
    ctlplane:
    - 192.168.100.40
    internal_api:
    - 192.168.1.43

  ComputeIPs:
    ctlplane:
    - 192.168.100.44
    internal_api:
    - 192.168.1.44
/home/stack/templates/node-info.yaml
parameter_defaults:
  ControllerCount: 1
  ComputeCount: 1

  ControllerSchedulerHints:
    'capabilities:node': 'controller-%index%'
  ComputeSchedulerHints:
    'capabilities:node': 'compute-%index%'
  NtpServer: []

  HostnameMap:
    overcloud-controller-0: overcloud-ctrl
    overcloud-compute-0: overcloud-comp

  NovaSchedulerDefaultFilters: "RetryFilter, AvailabilityZoneFilter, ComputeFilter, RamFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, AggregateCoreFilter"
  ManageFirewall: False
  SshServerOptions:
    PasswordAuthentication: 'yes'
    GSSAPIAuthentication: 'no'
    GSSAPICleanupCredentials: 'no'
/home/stack/templates/nova.yaml
heat_template_version: queens

description: >
  Heat template to enable root login with a custom password.

parameters:
  NodeRootPassword:
    type: string
    description: Root password for the node.

resources:
  userdata:
    type: OS::Heat::MultipartMime
    properties:
      parts:
        - config: {get_resource: enable_root_config}

  enable_root_config:
    type: OS::Heat::CloudConfig
    properties:
      cloud_config:
        disable_root: false
        chpasswd:
          list:
            - str_replace:
                template: "root:PASSWORD"
                params:
                  PASSWORD: {get_param: NodeRootPassword}
        expire: false
/home/stack/templates/overcloud_images.yaml
# Generated with the following on 2020-02-19T21:57:45.966382
#
#   openstack overcloud container image prepare --namespace=registry.access.redhat.com/rhosp13 --push-destination=192.168.1.79:5000 --prefix=openstack- --tag-from-label {version}-{release} --output-env-file=/home/stack/templates/overcloud_images.yaml --output-images-file /home/stack/local_registry_images.yaml
#

parameter_defaults:
  DockerAodhApiImage: 192.168.1.79:5000/rhosp13/openstack-aodh-api:13.0-98.1580118196
  DockerAodhConfigImage: 192.168.1.79:5000/rhosp13/openstack-aodh-api:13.0-98.1580118196
  DockerAodhEvaluatorImage: 192.168.1.79:5000/rhosp13/openstack-aodh-evaluator:13.0-98.1580118194
  DockerAodhListenerImage: 192.168.1.79:5000/rhosp13/openstack-aodh-listener:13.0-97.1580118194
  DockerAodhNotifierImage: 192.168.1.79:5000/rhosp13/openstack-aodh-notifier:13.0-100.1580118203
  DockerCeilometerCentralImage: 192.168.1.79:5000/rhosp13/openstack-ceilometer-central:13.0-95.1580118162
  DockerCeilometerComputeImage: 192.168.1.79:5000/rhosp13/openstack-ceilometer-compute:13.0-97.1580118161
  DockerCeilometerConfigImage: 192.168.1.79:5000/rhosp13/openstack-ceilometer-central:13.0-95.1580118162
  DockerCeilometerNotificationImage: 192.168.1.79:5000/rhosp13/openstack-ceilometer-notification:13.0-97.1580118156
  DockerCinderApiImage: 192.168.1.79:5000/rhosp13/openstack-cinder-api:13.0-104.1580118160
  DockerCinderConfigImage: 192.168.1.79:5000/rhosp13/openstack-cinder-api:13.0-104.1580118160
  DockerCinderSchedulerImage: 192.168.1.79:5000/rhosp13/openstack-cinder-scheduler:13.0-105.1580118158
  DockerCinderVolumeImage: 192.168.1.79:5000/rhosp13/openstack-cinder-volume:13.0-103.1580118158
  DockerClustercheckConfigImage: 192.168.1.79:5000/rhosp13/openstack-mariadb:13.0-101.1580117974
  DockerClustercheckImage: 192.168.1.79:5000/rhosp13/openstack-mariadb:13.0-101.1580117974
  DockerCrondConfigImage: 192.168.1.79:5000/rhosp13/openstack-cron:13.0-106.1580117945
  DockerCrondImage: 192.168.1.79:5000/rhosp13/openstack-cron:13.0-106.1580117945
  DockerGlanceApiConfigImage: 192.168.1.79:5000/rhosp13/openstack-glance-api:13.0-101.1580118157
  DockerGlanceApiImage: 192.168.1.79:5000/rhosp13/openstack-glance-api:13.0-101.1580118157
  DockerGnocchiApiImage: 192.168.1.79:5000/rhosp13/openstack-gnocchi-api:13.0-101.1580118213
  DockerGnocchiConfigImage: 192.168.1.79:5000/rhosp13/openstack-gnocchi-api:13.0-101.1580118213
  DockerGnocchiMetricdImage: 192.168.1.79:5000/rhosp13/openstack-gnocchi-metricd:13.0-100.1580118214
  DockerGnocchiStatsdImage: 192.168.1.79:5000/rhosp13/openstack-gnocchi-statsd:13.0-99.1580118214
  DockerHAProxyConfigImage: 192.168.1.79:5000/rhosp13/openstack-haproxy:13.0-103.1580117971
  DockerHAProxyImage: 192.168.1.79:5000/rhosp13/openstack-haproxy:13.0-103.1580117971
  DockerHeatApiCfnConfigImage: 192.168.1.79:5000/rhosp13/openstack-heat-api-cfn:13.0-96.1580118201
  DockerHeatApiCfnImage: 192.168.1.79:5000/rhosp13/openstack-heat-api-cfn:13.0-96.1580118201
  DockerHeatApiConfigImage: 192.168.1.79:5000/rhosp13/openstack-heat-api:13.0-97.1580118195
  DockerHeatApiImage: 192.168.1.79:5000/rhosp13/openstack-heat-api:13.0-97.1580118195
  DockerHeatConfigImage: 192.168.1.79:5000/rhosp13/openstack-heat-api:13.0-97.1580118195
  DockerHeatEngineImage: 192.168.1.79:5000/rhosp13/openstack-heat-engine:13.0-95.1580118204
  DockerHorizonConfigImage: 192.168.1.79:5000/rhosp13/openstack-horizon:13.0-100.1580118136
  DockerHorizonImage: 192.168.1.79:5000/rhosp13/openstack-horizon:13.0-100.1580118136
  DockerInsecureRegistryAddress:
  - 192.168.1.79:5000
  DockerIscsidConfigImage: 192.168.1.79:5000/rhosp13/openstack-iscsid:13.0-98.1580117946
  DockerIscsidImage: 192.168.1.79:5000/rhosp13/openstack-iscsid:13.0-98.1580117946
  DockerKeystoneConfigImage: 192.168.1.79:5000/rhosp13/openstack-keystone:13.0-96.1580118159
  DockerKeystoneImage: 192.168.1.79:5000/rhosp13/openstack-keystone:13.0-96.1580118159
  DockerMemcachedConfigImage: 192.168.1.79:5000/rhosp13/openstack-memcached:13.0-100.1580117977
  DockerMemcachedImage: 192.168.1.79:5000/rhosp13/openstack-memcached:13.0-100.1580117977
  DockerMysqlClientConfigImage: 192.168.1.79:5000/rhosp13/openstack-mariadb:13.0-101.1580117974
  DockerMysqlConfigImage: 192.168.1.79:5000/rhosp13/openstack-mariadb:13.0-101.1580117974
  DockerMysqlImage: 192.168.1.79:5000/rhosp13/openstack-mariadb:13.0-101.1580117974
  DockerNeutronApiImage: 192.168.1.79:5000/rhosp13/openstack-neutron-server:13.0-105.1580118143
  DockerNeutronConfigImage: 192.168.1.79:5000/rhosp13/openstack-neutron-server:13.0-105.1580118143
  DockerNeutronDHCPImage: 192.168.1.79:5000/rhosp13/openstack-neutron-dhcp-agent:13.0-105.1580118157
  DockerNeutronL3AgentImage: 192.168.1.79:5000/rhosp13/openstack-neutron-l3-agent:13.0-104.1580118160
  DockerNeutronMetadataImage: 192.168.1.79:5000/rhosp13/openstack-neutron-metadata-agent:13.0-106.1580118160
  DockerNovaApiImage: 192.168.1.79:5000/rhosp13/openstack-nova-api:13.0-105.1580118157
  DockerNovaComputeImage: 192.168.1.79:5000/rhosp13/openstack-nova-compute:13.0-119.1580135596
  DockerNovaConductorImage: 192.168.1.79:5000/rhosp13/openstack-nova-conductor:13.0-104.1580118156
  DockerNovaConfigImage: 192.168.1.79:5000/rhosp13/openstack-nova-api:13.0-105.1580118157
  DockerNovaConsoleauthImage: 192.168.1.79:5000/rhosp13/openstack-nova-consoleauth:13.0-103.1580118160
  DockerNovaLibvirtConfigImage: 192.168.1.79:5000/rhosp13/openstack-nova-compute:13.0-119.1580135596
  DockerNovaLibvirtImage: 192.168.1.79:5000/rhosp13/openstack-nova-libvirt:13.0-123.1580117946
  DockerNovaMetadataImage: 192.168.1.79:5000/rhosp13/openstack-nova-api:13.0-105.1580118157
  DockerNovaPlacementConfigImage: 192.168.1.79:5000/rhosp13/openstack-nova-placement-api:13.0-104.1580118162
  DockerNovaPlacementImage: 192.168.1.79:5000/rhosp13/openstack-nova-placement-api:13.0-104.1580118162
  DockerNovaSchedulerImage: 192.168.1.79:5000/rhosp13/openstack-nova-scheduler:13.0-105.1580135210
  DockerNovaVncProxyImage: 192.168.1.79:5000/rhosp13/openstack-nova-novncproxy:13.0-106.1580118158
  DockerOpenvswitchImage: 192.168.1.79:5000/rhosp13/openstack-neutron-openvswitch-agent:13.0-105.1580118161
  DockerPankoApiImage: 192.168.1.79:5000/rhosp13/openstack-panko-api:13.0-98.1580118197
  DockerPankoConfigImage: 192.168.1.79:5000/rhosp13/openstack-panko-api:13.0-98.1580118197
  DockerRabbitmqConfigImage: 192.168.1.79:5000/rhosp13/openstack-rabbitmq:13.0-102.1580117973
  DockerRabbitmqImage: 192.168.1.79:5000/rhosp13/openstack-rabbitmq:13.0-102.1580117973
  DockerRedisConfigImage: 192.168.1.79:5000/rhosp13/openstack-redis:13.0-103.1580118137
  DockerRedisImage: 192.168.1.79:5000/rhosp13/openstack-redis:13.0-103.1580118137
  DockerSwiftAccountImage: 192.168.1.79:5000/rhosp13/openstack-swift-account:13.0-96.1580118159
  DockerSwiftConfigImage: 192.168.1.79:5000/rhosp13/openstack-swift-proxy-server:13.0-98.1580118159
  DockerSwiftContainerImage: 192.168.1.79:5000/rhosp13/openstack-swift-container:13.0-99.1580118162
  DockerSwiftObjectImage: 192.168.1.79:5000/rhosp13/openstack-swift-object:13.0-96.1580118155
  DockerSwiftProxyImage: 192.168.1.79:5000/rhosp13/openstack-swift-proxy-server:13.0-98.1580118159
/home/stack/templates/passwords-environment.yaml
parameter_defaults:
  MysqlRootPassword: "password"
  NodeRootPassword: "password"
/home/stack/templates/roles_data.yaml
###############################################################################
# File generated by TripleO
###############################################################################
###############################################################################
# Role: Controller                                                            #
###############################################################################
- name: Controller
  description: |
    Controller role that has all the controler services loaded and handles
    Database, Messaging and Network functions.
  CountDefault: 1
  tags:
    - primary
    - controller
  networks:
        - InternalApi
  # For systems with both IPv4 and IPv6, you may specify a gateway network for
  # each, such as ['ControlPlane', 'External']
  HostnameFormatDefault: '%stackname%-controller-%index%'
  # Deprecated & backward-compatible values (FIXME: Make parameters consistent)
  # Set uses_deprecated_params to True if any deprecated params are used.
  uses_deprecated_params: True
  deprecated_param_extraconfig: 'controllerExtraConfig'
  deprecated_param_flavor: 'OvercloudControlFlavor'
  deprecated_param_image: 'controllerImage'
  deprecated_nic_config_name: 'controller.yaml'
  disable_upgrade_deployment: 'True'
  ServicesDefault:
    - OS::TripleO::Services::Aide
    - OS::TripleO::Services::AuditD
    - OS::TripleO::Services::CACerts
    - OS::TripleO::Services::CertmongerUser
    - OS::TripleO::Services::CinderApi
    - OS::TripleO::Services::CinderBackendDellPs
    - OS::TripleO::Services::CinderBackendDellSc
    - OS::TripleO::Services::CinderBackendDellEMCUnity
    - OS::TripleO::Services::CinderBackendDellEMCVMAXISCSI
    - OS::TripleO::Services::CinderBackendDellEMCVNX
    - OS::TripleO::Services::CinderBackendDellEMCXTREMIOISCSI
    - OS::TripleO::Services::CinderBackendNetApp
    - OS::TripleO::Services::CinderBackendPure
    - OS::TripleO::Services::CinderBackendScaleIO
    - OS::TripleO::Services::CinderBackendVRTSHyperScale
    - OS::TripleO::Services::CinderBackup
    - OS::TripleO::Services::CinderHPELeftHandISCSI
    - OS::TripleO::Services::CinderScheduler
    - OS::TripleO::Services::CinderVolume
    - OS::TripleO::Services::Clustercheck
    - OS::TripleO::Services::Collectd
    - OS::TripleO::Services::Congress
    - OS::TripleO::Services::Docker
    - OS::TripleO::Services::Etcd
    - OS::TripleO::Services::ExternalSwiftProxy
    - OS::TripleO::Services::Fluentd
    - OS::TripleO::Services::GlanceApi
    - OS::TripleO::Services::GlanceRegistry
    - OS::TripleO::Services::HAproxy
    - OS::TripleO::Services::HeatApi
    - OS::TripleO::Services::HeatApiCloudwatch
    - OS::TripleO::Services::HeatApiCfn
    - OS::TripleO::Services::HeatEngine
    - OS::TripleO::Services::Horizon
    - OS::TripleO::Services::IpaClient
    - OS::TripleO::Services::Ipsec
    - OS::TripleO::Services::IronicApi
    - OS::TripleO::Services::IronicConductor
    - OS::TripleO::Services::IronicPxe
    - OS::TripleO::Services::Keepalived
    - OS::TripleO::Services::Kernel
    - OS::TripleO::Services::Keystone
    - OS::TripleO::Services::LoginDefs
    - OS::TripleO::Services::ManilaApi
    - OS::TripleO::Services::ManilaBackendCephFs
    - OS::TripleO::Services::ManilaBackendIsilon
    - OS::TripleO::Services::ManilaBackendNetapp
    - OS::TripleO::Services::ManilaBackendUnity
    - OS::TripleO::Services::ManilaBackendVNX
    - OS::TripleO::Services::ManilaBackendVMAX
    - OS::TripleO::Services::ManilaScheduler
    - OS::TripleO::Services::ManilaShare
    - OS::TripleO::Services::Memcached
    - OS::TripleO::Services::MetricsQdr
    - OS::TripleO::Services::MistralApi
    - OS::TripleO::Services::MistralEngine
    - OS::TripleO::Services::MistralExecutor
    - OS::TripleO::Services::MistralEventEngine
    - OS::TripleO::Services::MongoDb
    - OS::TripleO::Services::MySQL
    - OS::TripleO::Services::MySQLClient
    - OS::TripleO::Services::NeutronApi
    - OS::TripleO::Services::NeutronBgpVpnApi
    - OS::TripleO::Services::NeutronSfcApi
    - OS::TripleO::Services::NeutronCorePlugin
    - OS::TripleO::Services::NeutronDhcpAgent
    - OS::TripleO::Services::NeutronL2gwAgent
    - OS::TripleO::Services::NeutronL2gwApi
    - OS::TripleO::Services::NeutronL3Agent
    - OS::TripleO::Services::NeutronLbaasv2Agent
    - OS::TripleO::Services::NeutronLbaasv2Api
    - OS::TripleO::Services::NeutronLinuxbridgeAgent
    - OS::TripleO::Services::NeutronMetadataAgent
    - OS::TripleO::Services::NeutronML2FujitsuCfab
    - OS::TripleO::Services::NeutronML2FujitsuFossw
    - OS::TripleO::Services::NeutronOvsAgent
    - OS::TripleO::Services::NeutronVppAgent
    - OS::TripleO::Services::NovaApi
    - OS::TripleO::Services::NovaConductor
    - OS::TripleO::Services::NovaConsoleauth
    - OS::TripleO::Services::NovaIronic
    - OS::TripleO::Services::NovaPlacement
    - OS::TripleO::Services::NovaScheduler
    - OS::TripleO::Services::NovaVncProxy
#    - OS::TripleO::Services::Ntp
    - OS::TripleO::Services::ContainersLogrotateCrond
    - OS::TripleO::Services::OctaviaApi
    - OS::TripleO::Services::OctaviaDeploymentConfig
    - OS::TripleO::Services::OctaviaHealthManager
    - OS::TripleO::Services::OctaviaHousekeeping
    - OS::TripleO::Services::OctaviaWorker
    - OS::TripleO::Services::OpenDaylightApi
    - OS::TripleO::Services::OpenDaylightOvs
    - OS::TripleO::Services::OVNDBs
    - OS::TripleO::Services::OVNController
    - OS::TripleO::Services::Pacemaker
    - OS::TripleO::Services::RabbitMQ
    - OS::TripleO::Services::Redis
    - OS::TripleO::Services::Rhsm
    - OS::TripleO::Services::RsyslogSidecar
    - OS::TripleO::Services::SaharaApi
    - OS::TripleO::Services::SaharaEngine
    - OS::TripleO::Services::Securetty
    - OS::TripleO::Services::SensuClient
    - OS::TripleO::Services::SkydiveAgent
    - OS::TripleO::Services::SkydiveAnalyzer
    - OS::TripleO::Services::Snmp
    - OS::TripleO::Services::Sshd
#    - OS::TripleO::Services::SwiftProxy
#    - OS::TripleO::Services::SwiftDispersion
#    - OS::TripleO::Services::SwiftRingBuilder
#    - OS::TripleO::Services::SwiftStorage
    - OS::TripleO::Services::Tacker
    - OS::TripleO::Services::Timezone
    - OS::TripleO::Services::TripleoFirewall
    - OS::TripleO::Services::TripleoPackages
    - OS::TripleO::Services::Tuned
    - OS::TripleO::Services::Vpp
    - OS::TripleO::Services::Zaqar
    - OS::TripleO::Services::Ptp
###############################################################################
# Role: Compute                                                               #
###############################################################################
- name: Compute
  description: |
    Basic Compute Node role
  CountDefault: 1
  networks:
    - InternalApi
  HostnameFormatDefault: '%stackname%-compute-%index%'
  RoleParametersDefault:
    TunedProfileName: "virtual-host"
  # Deprecated & backward-compatible values (FIXME: Make parameters consistent)
  # Set uses_deprecated_params to True if any deprecated params are used.
  uses_deprecated_params: True
  deprecated_param_image: 'NovaImage'
  deprecated_param_extraconfig: 'NovaComputeExtraConfig'
  deprecated_param_metadata: 'NovaComputeServerMetadata'
  deprecated_param_scheduler_hints: 'NovaComputeSchedulerHints'
  deprecated_param_ips: 'NovaComputeIPs'
  deprecated_server_resource_name: 'NovaCompute'
  deprecated_nic_config_name: 'compute.yaml'
  disable_upgrade_deployment: True
  update_serial: 25
  ServicesDefault:
    - OS::TripleO::Services::Aide
    - OS::TripleO::Services::AuditD
    - OS::TripleO::Services::CACerts
    - OS::TripleO::Services::CephClient
    - OS::TripleO::Services::CephExternal
    - OS::TripleO::Services::CertmongerUser
    - OS::TripleO::Services::Collectd
    - OS::TripleO::Services::ComputeNeutronCorePlugin
    - OS::TripleO::Services::ComputeNeutronL3Agent
    - OS::TripleO::Services::ComputeNeutronMetadataAgent
    - OS::TripleO::Services::ComputeNeutronOvsAgent
    - OS::TripleO::Services::Docker
    - OS::TripleO::Services::Fluentd
    - OS::TripleO::Services::IpaClient
    - OS::TripleO::Services::Ipsec
    - OS::TripleO::Services::Iscsid
    - OS::TripleO::Services::Kernel
    - OS::TripleO::Services::LoginDefs
    - OS::TripleO::Services::MetricsQdr
    - OS::TripleO::Services::MySQLClient
    - OS::TripleO::Services::NeutronBgpVpnBagpipe
    - OS::TripleO::Services::NeutronLinuxbridgeAgent
    - OS::TripleO::Services::NeutronVppAgent
    - OS::TripleO::Services::NovaCompute
    - OS::TripleO::Services::NovaLibvirt
    - OS::TripleO::Services::NovaLibvirtGuests
    - OS::TripleO::Services::NovaMigrationTarget
#    - OS::TripleO::Services::Ntp
    - OS::TripleO::Services::ContainersLogrotateCrond
    - OS::TripleO::Services::OpenDaylightOvs
    - OS::TripleO::Services::Rhsm
    - OS::TripleO::Services::RsyslogSidecar
    - OS::TripleO::Services::Securetty
    - OS::TripleO::Services::SensuClient
    - OS::TripleO::Services::SkydiveAgent
    - OS::TripleO::Services::Snmp
    - OS::TripleO::Services::Sshd
    - OS::TripleO::Services::Timezone
    - OS::TripleO::Services::TripleoFirewall
    - OS::TripleO::Services::TripleoPackages
    - OS::TripleO::Services::Tuned
    - OS::TripleO::Services::Vpp
    - OS::TripleO::Services::OVNController
    - OS::TripleO::Services::OVNMetadataAgent
    - OS::TripleO::Services::Ptp
    - OS::TripleO::Services::CinderBackendVRTSHyperScale
#    - OS::TripleO::Services::CinderVolume

/usr/share/openstack-tripleo-heat-templates/network/ports/internal_api_from_pool.yaml
heat_template_version: 2015-10-15

description: >
  Returns an IP from a network mapped list of IPs

parameters:
  InternalApiNetName:
    description: Name of the internal API network
    default: internal_api
    type: string
  PortName:
    description: Name of the port
    default: ''
    type: string
  ControlPlaneIP: # Here for compatibility with noop.yaml
    description: IP address on the control plane
    default: ''
    type: string
  IPPool:
    default: {}
    description: A network mapped list of IPs
    type: json
  NodeIndex:
    default: 0
    description: Index of the IP to get from Pool
    type: number
  InternalApiNetCidr:
    default: '172.16.2.0/24'
    description: Cidr for the internal API network.
    type: string

outputs:
  ip_address:
    description: internal API network IP
    value: {get_param: [IPPool, {get_param: InternalApiNetName}, {get_param: NodeIndex}]}
  ip_address_uri:
    description: internal API network IP (for compatibility with internal_api_v6.yaml)
    value: {get_param: [IPPool, {get_param: InternalApiNetName}, {get_param: NodeIndex}]}
  ip_subnet:
    description: IP/Subnet CIDR for the internal API network IP
    value:
      list_join:
      - ''
      - - {get_param: [IPPool, {get_param: InternalApiNetName}, {get_param: NodeIndex}]}
        - '/'
        - {str_split: ['/', {get_param: InternalApiNetCidr}, 1]}

node-info.yaml:ノードの割り当て
network-environment.yaml:各ネットワークのIPレンジやサブネット定義
roles_data.yaml:コントローラやコンピュートのロール構成

デプロイコマンド

openstack overcloud deploy --templates \
-e ~/templates/node-info.yaml \
-e ~/templates/overcloud_images.yaml \
-e ~/templates/network-environment.yaml \
-e ~/templates/passwords-environment.yaml \
-e ~/templates/firstboot.yaml \
-e ~/templates/custom-env.yaml \
-r ~/templates/roles_data.yaml \
-n ~/templates/network_data.yaml

数時間後、Completeと出力されたら成功です。
後は、openstackコマンドを活用してオーバークラウド環境を設定してVMを利用できるようにするだけです。

参考:デプロイ失敗したときに使うコマンド集

# オーバークラウド削除処理(Heatスタックおよび関連リソースの削除)
openstack stack delete --yes --wait overcloud  # Heat スタックとしての overcloud を削除
openstack overcloud delete overcloud           # overcloud 環境を削除(簡易コマンド)

# ベアメタルノードのメンテナンスモード設定(削除前の準備)と削除
openstack baremetal node maintenance set overcloud-ctrl       # メンテナンスモードに設定
openstack baremetal node delete overcloud-ctrl overcloud-ctrl # ベアメタルノードの削除

# KVMベースの仮想マシン管理操作
virsh start overcloud-ctrl     # 仮想マシン起動
virsh console overcloud-ctrl   # 仮想マシンのコンソールへ接続
virsh shutdown overcloud-ctrl  # 仮想マシンの停止
virsh destroy overcloud-ctrl   # 仮想マシンの強制停止(シャットダウンではない)
virsh undefine overcloud-ctrl  # 仮想マシンの定義を削除(ディスクは削除されない)

参考:オーバークラウド環境設定コマンド集

. overcloudrc

sudo yum -y install wget
sudo wget http://download.cirros-cloud.net/0.6.3/cirros-0.6.3-x86_64-disk.img
openstack image create "cirros" --file cirros-0.6.3-x86_64-disk.img --disk-format qcow2 --container-format bare --public

# フレーバー登録
openstack flavor create --id 0 --vcpus 1 --ram 512 --disk 10 m1.small

# ネットワーク作成
openstack network create --no-share --internal --provider-physical-network datacentre --provider-network-type flat sharednet
openstack subnet create --network sharednet --no-dhcp --allocation-pool start=192.168.200.150,end=192.168.200.180 --gateway 192.168.200.1 --subnet-range 192.168.200.0/24 sharedsubnet


おわりに

以上、RHOSP13を利用した自宅検証環境の解説でした。

RHOSPの不満点

・不要なErrorやWarningが多すぎる
構築や保守の過程で何度も悩まされた。本当に抑止すべきものと、無視してよいものの線引きが曖昧すぎる。

・構成変更=基本はオーバークラウド再デプロイ
冪等性の思想は分かるが、わずかな修正でも全体再デプロイを要求されるのは厳しい。
万が一デプロイが失敗したら? …環境ごと吹き飛ぶぞ。

・トラブルシュートが難解すぎる
ログからの調査が一苦労。とりえあず No valid host was found. のエラーを出しておけばいいと思っているでしょ?

・マイナーな存在であるがゆえにニッチな分野
OpenStack関連の案件は非常に少ない、有識者も限られ、技術情報も乏しい。

RHOSPの良いところ

・多くの技術に触れられてやりがいがある

  • OVS / OVN(仮想ネットワーク)
  • Python / Ansible(自動化・構成管理)
  • MariaDB / Galera Cluster(分散DB)
  • Apache / HAProxy / Pacemaker(Web・LB・冗長化)
  • QEMU / KVM / libvirt(仮想化基盤)
  • Nova / Neutron / Keystone / Glance(OpenStackコンポーネント)

さらに、既存ネットワーク、ストレージの接続やコンピュート上で作成するVM作成、詳細なOS設定も考える必要があるぞ!

・AWS、vSphereなどが素晴らしく見えてくる
まさに相対性理論の証明である。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?