OpenStack コンテナサービス(zun)追加

All-in-oneのPackstack環境にコンテナサービスのzunを追加する手順をインストールメモがてら残した。

手順はここ(https://docs.openstack.org/zun/latest/install/controller-install.html)を参照。

コントローラノード向け設定

データベースにユーザ追加

# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3728741
Server version: 10.3.35-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> GRANT ALL PRIVILEGES ON zun.* TO 'zun' \
  IDENTIFIED BY 'ZUN_DBPASS';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON zun.* TO 'zun'@'%' \
  IDENTIFIED BY 'ZUN_DBPASS';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> quit
Bye
#

zun service作成。

$ . admin-openrc
$ openstack user create --domain default --password-prompt zun
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | f4f40696f6914b5b9e9054b7e9cfb55d |
| name                | zun                              |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

$ openstack role add --project services --user zun admin

$ openstack service create --name zun --description "Container Service" container
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Container Service                |
| enabled     | True                             |
| id          | 74d60a5188ee4d36b1ba036c23c45f2e |
| name        | zun                              |
| type        | container                        |
+-------------+----------------------------------+
$  openstack endpoint create --region RegionOne container public http://192.168.1.10:9517/v1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | ae352beaa62c45899da2ec57d376e2ab |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 74d60a5188ee4d36b1ba036c23c45f2e |
| service_name | zun                              |
| service_type | container                        |
| url          | http://192.168.1.10:9517/v1      |
+--------------+----------------------------------+
$ openstack endpoint create --region RegionOne container internal http://192.168.1.10:9517/v1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | d1e241ca8f664f05b1976c5a5628a284 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 74d60a5188ee4d36b1ba036c23c45f2e |
| service_name | zun                              |
| service_type | container                        |
| url          | http://192.168.1.10:9517/v1      |
+--------------+----------------------------------+
$ openstack endpoint create --region RegionOne container admin http://192.168.1.10:9517/v1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 911e3f76ba09463bad2833573bfb17ef |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 74d60a5188ee4d36b1ba036c23c45f2e |
| service_name | zun                              |
| service_type | container                        |
| url          | http://192.168.1.10:9517/v1      |
+--------------+----------------------------------+

OSユーザ追加。

# groupadd --system zun
# useradd --home-dir "/var/lib/zun" \
      --create-home \
      --system \
      --shell /bin/false \
      -g zun \
      zun
# mkdir -p /etc/zun
# chown zun:zun /etc/zun
# dnf install python3-pip git python3-devel libffi-devel gcc openssl-devel
Updating Subscription Management repositories.
Last metadata expiration check: 2:15:22 ago on Fri 06 Jan 2023 07:01:20 PM JST.
Package python3-pip-9.0.3-22.el8.noarch is already installed.
Package git-2.31.1-2.el8.x86_64 is already installed.
Package python36-devel-3.6.8-38.module+el8.5.0+12207+5c5719bc.x86_64 is already installed.
Package gcc-8.5.0-15.el8.x86_64 is already installed.
Dependencies resolved.
=============================================================================================================================================================================
 Package                                    Architecture                  Version                                 Repository                                            Size
=============================================================================================================================================================================
Installing:
 libffi-devel                               x86_64                        3.1-23.el8                              rhel-8-for-x86_64-baseos-rpms                         29 k
 openssl-devel                              x86_64                        1:1.1.1k-7.el8_6                        rhel-8-for-x86_64-baseos-rpms                        2.3 M
Installing dependencies:
 keyutils-libs-devel                        x86_64                        1.5.10-9.el8                            rhel-8-for-x86_64-baseos-rpms                         48 k
 krb5-devel                                 x86_64                        1.18.2-22.el8_7                         rhel-8-for-x86_64-baseos-rpms                        561 k
 libcom_err-devel                           x86_64                        1.45.6-5.el8                            rhel-8-for-x86_64-baseos-rpms                         39 k
 libkadm5                                   x86_64                        1.18.2-22.el8_7                         rhel-8-for-x86_64-baseos-rpms                        187 k
 libselinux-devel                           x86_64                        2.9-6.el8                               rhel-8-for-x86_64-baseos-rpms                        200 k
 libsepol-devel                             x86_64                        2.9-3.el8                               rhel-8-for-x86_64-baseos-rpms                         87 k
 libverto-devel                             x86_64                        0.3.2-2.el8                             rhel-8-for-x86_64-baseos-rpms                         18 k
 pcre2-devel                                x86_64                        10.32-3.el8_6                           rhel-8-for-x86_64-baseos-rpms                        605 k
 pcre2-utf16                                x86_64                        10.32-3.el8_6                           rhel-8-for-x86_64-baseos-rpms                        229 k
 pcre2-utf32                                x86_64                        10.32-3.el8_6                           rhel-8-for-x86_64-baseos-rpms                        220 k

Transaction Summary
=============================================================================================================================================================================
Install  12 Packages

Total download size: 4.5 M
Installed size: 8.0 M
Is this ok [y/N]: y
~中略~
Installed:
  keyutils-libs-devel-1.5.10-9.el8.x86_64       krb5-devel-1.18.2-22.el8_7.x86_64       libcom_err-devel-1.45.6-5.el8.x86_64       libffi-devel-3.1-23.el8.x86_64
  libkadm5-1.18.2-22.el8_7.x86_64               libselinux-devel-2.9-6.el8.x86_64       libsepol-devel-2.9-3.el8.x86_64            libverto-devel-0.3.2-2.el8.x86_64
  openssl-devel-1:1.1.1k-7.el8_6.x86_64         pcre2-devel-10.32-3.el8_6.x86_64        pcre2-utf16-10.32-3.el8_6.x86_64           pcre2-utf32-10.32-3.el8_6.x86_64

Complete!

# cd /var/lib/zun
# git clone https://opendev.org/openstack/zun.git
Cloning into 'zun'...
remote: Enumerating objects: 12578, done.
remote: Counting objects: 100% (12578/12578), done.
remote: Compressing objects: 100% (2355/2355), done.
remote: Total 25247 (delta 12095), reused 10223 (delta 10223), pack-reused 12669
Receiving objects: 100% (25247/25247), 3.88 MiB | 4.09 MiB/s, done.
Resolving deltas: 100% (19377/19377), done.
# chown -R zun:zun zun
# git config --global --add safe.directory /var/lib/zun/zun
# cd zun
# pwd
/var/lib/zun/zun
# pip3 install -r requirements.txt
~中略~
Successfully installed docker-5.0.3 grpcio-1.48.2 kuryr-lib-2.6.0 protobuf-3.19.6 websocket-client-1.3.1
# python3 setup.py install

# su -s /bin/sh -c "oslo-config-generator --config-file etc/zun/zun-config-generator.conf" zun
# su -s /bin/sh -c "cp etc/zun/zun.conf.sample /etc/zun/zun.conf" zun
# su -s /bin/sh -c "cp etc/zun/api-paste.ini /etc/zun" zun

zun.conf 編集

# vim /etc/zun/zun.conf
[DEFAULT]
...
transport_url = rabbit://guest:PASS@192.168.1.10:5672/

[api]
...

port = 9517
[database]
...
connection=mysql+pymysql://zun:ZUN-PASS@192.168.1.10/zun
[keystone_auth]
...
auth_url=http://192.168.1.10:5000
project_domain_name = Default
username = zun
password = PASS

[keystone_authtoken]
...

www_authenticate_uri = http://192.168.1.10:5000/

auth_version = v3

username = zun
password = PASS
auth_protocol = http

[oslo_concurrency]
lock_path = /var/lib/zun/tmp

[websocket_proxy]
base_url = ws://$wsproxy_host:$wsproxy_port/
wsproxy_host = 192.168.1.10

wsproxy_port = 6784

DBアップデート

# su -s /bin/sh  -c "/usr/local/bin/zun-db-manage upgrade"  zun

起動スクリプト作成

# /etc/systemd/system/zun-api.service
[Unit]
Description = OpenStack Container Service API

[Service]
ExecStart = /usr/local/bin/zun-api
User = zun

[Install]
WantedBy = multi-user.target

# /etc/systemd/system/zun-wsproxy.service
[Unit]
Description = OpenStack Container Service Websocket Proxy

[Service]
ExecStart = /usr/local/bin/zun-wsproxy
User = zun

[Install]
WantedBy = multi-user.target

サービス起動

# systemctl enable zun-api zun-wsproxy
# systemctl start zun-api zun-wsproxy

コンピュートノード向け設定

All-in-One構成なのでコントローラと重複するところはスキップして差分だけ実施。

DockerとKuryr,Etcdを先にインストールする。

# Docker install
dnf config-manager ―-add-repo https://download.docker.com/linux/rhel/docker-ce.repo

RHEL8からはPodmanになったとのことでリポジトリのBaseURLをCentOSに変更しないとdockerをインストールできないらしい。

# vim /etc/yum.repos.d/docker-ce.repo

[docker-ce-stable]
name=Docker CE Stable - $basearch
#baseurl=https://download.docker.com/linux/fedora/$releasever/$basearch/stable #コメントアウト
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable # 追加

Dockerインストール

# dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Kuryr-libnetworkインストール

<https://docs.openstack.org/kuryr-libnetwork/latest/install/controller-install.html>

$ openstack user create --domain default --password-prompt kuryr
$ openstack role add --project services --user kuryr admin

<https://docs.openstack.org/kuryr-libnetwork/latest/install/compute-install-ubuntu.html#prerequisites>

# groupadd --system kuryr
# useradd --home-dir "/var/lib/kuryr" --create-home --system --shell /bin/false -g kuryr kuryr
#  mkdir -p /etc/kuryr
# chown kuryr:kuryr /etc/kuryr
# cd /var/lib/kuryr/
# git clone -b master https://opendev.org/openstack/kuryr-libnetwork.git
# chown -R kuryr:kuryr kuryr-libnetwork
# cd kuryr-libnetwork/
# python3 setup.py install

# su -s /bin/sh -c "./tools/generate_config_file_samples.sh" kuryr
# su -s /bin/sh -c "cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf" kuryr

設定ファイル編集。

# /etc/kuryr/kuryr.conf

[DEFAULT]
...
bindir = /usr/local/libexec/kuryr

[neutron]
...
auth_url = http://192.168.1.10:5000/
www_authenticate_uri = http://192.168.1.10:5000/
username = kuryr
user_domain_name = Default
password = PASSWORD
project_name = services
project_domain_name = Default
auth_type = password

Etcdインストール

# dnf list installed etcd

# vim /etc/etcd/etcd.conf

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.1.10:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="controller"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.10:2379"
ETCD_INITIAL_CLUSTER="default=http://192.168.1.10:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

ZUN設定

# mkdir -p /etc/cni/net.d
# chown zun:zun /etc/cni/net.d/

# dnf install numactl

# su -s /bin/sh -c "cp etc/zun/rootwrap.conf /etc/zun/rootwrap.conf" zun
# su -s /bin/sh -c "mkdir -p /etc/zun/rootwrap.d" zun
# su -s /bin/sh -c "cp etc/zun/rootwrap.d/*  /etc/zun/rootwrap.d/" zun
# su -s /bin/sh -c "cp etc/cni/net.d/* /etc/cni/net.d/" zun

# echo "zun ALL=(root) NOPASSWD: /usr/local/bin/zun-rootwrap /etc/zun/rootwrap.conf *" | sudo tee /etc/sudoers.d/zun-rootwrap zun ALL=(root) NOPASSWD: /usr/local/bin/zun-rootwrap     /etc/zun/rootwrap.conf *
# /etc/zun/zun.conf

[DEFAULT]
...
state_path = /var/lib/zun

[compute]
...
host_shared_with_nova = true

Docker と Kuryr 設定

# mkdir -p /etc/systemd/system/docker.service.d

dockerサービス起動設定

# /etc/systemd/system/docker.service.d/docker.conf
[Service]

ExecStart=
ExecStart=/usr/bin/dockerd --group zun -H tcp://192.168.1.10:2375 -H unix:///var/run/docker.sock --cluster-store etcd://192.168.1.10:2379

containerd設定ファイル生成

# containerd config default > /etc/containerd/config.toml

containerd設定ファイル編集

# /etc/containerd/config.toml

[grpc]
  ...
  gid = ZUN_GROUP_ID

再起動

# systemctl restart containerd

CNIインストール&設定

# mkdir -p /opt/cni/bin
# curl -L https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz | tar -C /opt/cni/bin -xzvf - ./loopback

# install -o zun -m 0555 -D /usr/local/bin/zun-cni /opt/cni/bin/zun-cni

サービス設定

# /etc/systemd/system/zun-compute.service
[Unit]
Description = OpenStack Container Service Compute Agent

[Service]
ExecStart = /usr/local/bin/zun-compute
User = zun

[Install]
WantedBy = multi-user.target
# /etc/systemd/system/zun-cni-daemon.service
[Unit]
Description = OpenStack Container Service CNI daemon

[Service]
ExecStart = /usr/local/bin/zun-cni-daemon
User = zun

[Install]
WantedBy = multi-user.target

サービス起動

# systemctl enable zun-compute zun-cni-daemon
# systemctl start zun-compute zun-cni-daemon

ここを参考。(https://docs.openstack.org/zun-ui/latest/)

Horizen周り設定

$ git clone https://github.com/openstack/zun-ui
$ cd zun-ui

$ sudo pip3 install .

$ sudo cp ./zun_ui/enabled/* /usr/share/openstack-dashboard/openstack_dashboard/local/enabled
$ sudo python3 /usr/share/openstack-dashboard/manage.py collectstatic

$ sudo systemctrl restart httpd

これで完了。

RDO(All-in-One)アップグレード(Queens→Yoga)

そろそろOpenStackの環境を更新しようと。

ここここにならってコンポーネント毎にアップグレードを行っていく。

オフィシャルでは始める前にsytemdのスナップショットをとれとあるが,そんなオプションはないと怒られる・・・。もう廃止されたオプションなのか???ググっても情報見つけられず。

Before updating, take a systemd snapshot of the OpenStack services:

# systemctl snapshot openstack-services
https://www.rdoproject.org/install/upgrading-rdo-1/

とりあえずこの手順を飛ばし,以下流れで進めていく。

  1. OpenStackサービスの停止
  2. アップグレード
  3. DBの同期
  4. OpenStackサービス起動

OpenStackサービスの停止

# systemctl stop 'openstack-*'
# systemctl stop 'neutron-*'
# systemctl stop 'openvswitch'

上記で停止するのは以下ユニット

openstack-aodh-evaluator.service
openstack-aodh-listener.service
openstack-aodh-notifier.service
openstack-ceilometer-notification.service
openstack-ceilometer-polling.service
openstack-cinder-api.service
openstack-cinder-backup.service
openstack-cinder-scheduler.service
openstack-cinder-volume.service
openstack-glance-api.service
openstack-losetup.service
openstack-nova-compute.service
openstack-nova-conductor.service
openstack-nova-novncproxy.service
openstack-nova-scheduler.service
openstack-swift-account-auditor.service
openstack-swift-account-reaper.service
openstack-swift-account-replicator.service
openstack-swift-account.service
openstack-swift-container-auditor.service
openstack-swift-container-replicator.service
openstack-swift-container-sync.service
openstack-swift-container-updater.service
openstack-swift-container.service
openstack-swift-object-auditor.service
openstack-swift-object-expirer.service
openstack-swift-object-reconstructor.service
openstack-swift-object-replicator.service
openstack-swift-object-updater.service
openstack-swift-object.service
openstack-swift-proxy.service
neutron-ovn-metadata-agent.service
neutron-server.service
openvswitch.service

アップグレード

# dnf install -y https://www.rdoproject.org/repos/rdo-release.rpm
# dnf update

DBの同期

# su -s /bin/sh -c "keystone-manage db_sync" keystone
# su -s /bin/sh -c "glance-manage db_sync" glance
# su -s /bin/sh -c "cinder-manage db sync" cinder
# su -s /bin/sh -c "neutron-db-manage upgrade heads" neutron
# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

# su -s /bin/sh -c "nova-manage --config-file /etc/nova/nova.conf cell_v2 create_cell --name=cell1 --verbose" nova
# su -s /bin/sh -c "nova-manage db sync" nova
# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
# nova-manage cell_v2 list_cells
# su -s /bin/sh -c "nova-manage cell_v2 map_instances --cell_uuid <cell UUID>" nova
# su -s /bin/sh -c "nova-manage api_db sync" nova

うちの環境特有かもしれないが,httpdもアップグレードされ,デフォルトのssl.confが作成されているので削除。

# rm /etc/httpd/conf.d/ssl.conf

OpenStackサービス起動

再起動して完了。

と,思いきややはりというかエラーで起動しない。

エラー1つめ(nova)

コンピュートのバージョンが古すぎる?

こんなログがnova-scheduler.logに出てNG。

ERROR nova   File "/usr/lib/python3.6/site-packages/nova/utils.py", line 1100, in raise_if_old_compute
 ERROR nova     oldest_supported_service=oldest_supported_service_level)
 ERROR nova nova.exception.TooOldComputeService: Current Nova version does not support computes older than Xena but the minimum compute service level in your system is 56 and the oldest supported service level is 57.

QからYはサポート外なのか???とりあえずutils.pyの1100行目を見てみるとバージョン判定箇所らしい。私の力ではこれ以上解析が無理なので力業でコメントアウト。

1095     if current_service_version < oldest_supported_service_level:
1096 #        raise exception.TooOldComputeService(
1097 #            oldest_supported_version=service.OLDEST_SUPPORTED_SERVICE_VERSION,
1098 #            scope=scope,
1099 #            min_service_level=current_service_version,
1100 #            oldest_supported_service=oldest_supported_service_level)
1101         return

novaはこれで起動したw (今はこれでいいんだ)

エラー2つ目(neutronというかopenvswitch)

openvswichの6642に接続できないというエラーを吐いてNeutronも起動しない。ovn-northd.serviceが起動していなかったので起動したらここはクリアになった。

終わらないトラブル

無事にアップデート前の状態までもっていくことが出来たと思いきや,インスタンスは起動するものの外部ネットワークへ繋がらない問題発生。新しいインスタンスを作成してみるもエラー,既存のインスタンスを削除しようにもエラー。ログを見ると「’c.consumer_type_id という知らない引数が渡されている」的なメッセージが出ていた。ググってみるとどうやらPlacement関連で何か引っかかっている模様。そういえばplacementのDB同期はやっていなかった。ひとまずインスタンスは空にして今の環境で作り直すとする。

必要なインスタンスだけスナップショットをとり,DBから直接インスタンスを削除してから↓。

# placement-manage db sync 

インスタンス作成→失敗・・・orz。インスタンス削除 → 成功 !一歩前進。DB直でいじったからインスタンス割り当たっているけどDBに無いよというエラーメッセージが永遠と出る。対処法はこれ

$ pip install osc-placement       # resourceオプションがなかったから入れる
$ openstack resource provider list   # compute nodeのUUID確認
$ openstack resource provider show --allocations <UUID>  # ServerのUUID確認(念のためエラーメッセージのUUIDと同じか確認)
$ openstack resource provider allocation delete <Server UUID> 

nova周りはさらにエラーは続き,Neutron周りでもエラーが出続ける。

ERROR ovsdbapp.backend.ovs_idl.command [-] Error executing command (DbAddCommand): ovsdbapp.backend.ovs_idl.idlutils.RowNotFound: Cannot find Chassis_Private with name=xxx

色々ググったあげく,Southband側の問題のように見えたのでovs-sbなんたらとかでいじっていると,そもそもSouthband側が機能していないことに気づき,以下で解決した。

# systemctl start ovn-controller.service

アップグレード前と後でサービスの起動ってこんなに違ったかしら・・・・?

要らないと思っていたsystemctlのSnapshot,必要だったかもしれない・・・。

一応すったもんだ丸2日かかったけれど,無事にYogaへアップグレード完了した。

まとまっていないが,何年か後に自分が見直すためのメモとして。

Horizon HTTPS化

前回インストールしたOpenstackのダッシュボードのHTTPS化についてのメモ。

流れ

  1. mod_ssl インストール
  2. 自己証明書作成
  3. httpd.conf編集
  4. nova.conf編集
  5. iptables設定編集
  6. サービス再起動

mod_sslインストール

# dnf install mod_ssl

証明書作成

# openssl req -new -key ./server.key > server.csr
# openssl x509 -req -signkey server.key < server.csr > server.crt

Apache設定ファイル編集

sslを読み込むように /etc/httpd/conf.module.d 配下に ssl.conf と ssl.load を作成。

# ssl.conf
<IfModule mod_ssl.c>
  SSLRandomSeed startup builtin
  SSLRandomSeed startup file:/dev/urandom 512
  SSLRandomSeed connect builtin
  SSLRandomSeed connect file:/dev/urandom 512

  AddType application/x-x509-ca-cert .crt
  AddType application/x-pkcs7-crl    .crl

  SSLPassPhraseDialog builtin
  SSLSessionCache "shmcb:/var/cache/mod_ssl/scache(512000)"
  SSLSessionCacheTimeout 300
  Mutex default
  SSLCryptoDevice builtin
  SSLHonorCipherOrder On
  SSLUseStapling Off
  SSLStaplingCache "shmcb:/run/httpd/ssl_stapling(32768)"
  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!RC4:!3DES
  SSLProtocol all
  SSLOptions StdEnvVars
</IfModule>
#ssl.load
LoadModule ssl_module modules/mod_ssl.so

httpsで受けるように /etc/httpd/conf.d 配下の15-horizon_vhost.conf を編集。 15-horizon_ssl_vhost.conf を作成。

# 15-horizon_vhost.conf 編集箇所はリダイレクトのみ
  ## RedirectMatch rules
  RedirectMatch permanent  (.*) https://192.168.1.10
# 15-horizon_ssl_vhost.conf 
<VirtualHost *:443>
  ServerName 192.168.1.10

  ## Vhost docroot
  DocumentRoot "/var/www/"
  ## Alias declarations for resources outside the DocumentRoot
  Alias /dashboard/static "/usr/share/openstack-dashboard/static"


  ## Directories, there should at least be a declaration for /var/www/

  <Directory "/var/www/">
    Options -Indexes +FollowSymLinks +MultiViews
    AllowOverride None
    Require all granted
  </Directory>

  ## Logging
  ErrorLog "/var/log/httpd/horizon_ssl_error.log"
  ServerSignature Off
  CustomLog "/var/log/httpd/horizon_ssl_access.log" combined

  ## RedirectMatch rules
  RedirectMatch permanent  ^/$ /dashboard

  ## Server aliases
  ServerAlias 192.168.1.10
  ServerAlias localhost


  ## SSL directives
  SSLEngine on
  SSLCertificateFile      "/etc/pki/tls/certs/server.crt"
  SSLCertificateKeyFile   "/etc/pki/tls/private/server.key"

  ## WSGI configuration
  WSGIApplicationGroup %{GLOBAL}
  WSGIDaemonProcess horizon-ssl display-name=horizon group=apache processes=4 threads=1 user=apache
  WSGIProcessGroup horizon-ssl
  WSGIScriptAlias /dashboard "/usr/share/openstack-dashboard/openstack_dashboard/wsgi.py"
</VirtualHost>

nova.conf編集

ダッシュボード上のバーチャルコンソールもhttpsに対応させる。証明書は同じ物を転用した。/etc/nova/nova.conf の以下部分を編集。

# Disallow non-encrypted connections. For more information, refer to the
# documentation. (boolean value)
#ssl_only=false
ssl_only=True

# Set to True if source host is addressed with IPv6 (boolean value)
#source_is_ipv6=false

#
# Path to SSL certificate file. For more information, refer to the
# documentation. (string value)
#cert=self.pem
cert=/etc/pki/tls/certs/server.crt

#
# SSL key file (if separate from cert). For more information, refer to the
# documentation. (string value)
#key=<None>
key=/etc/pki/tls/private/server.key


# /etc/nova/nova.conf:novncproxy_base_url=http://192.168.1.100:6080/vnc_auto.html
/etc/nova/nova.conf:novncproxy_base_url=https://192.168.1.100:6080/vnc_auto.html

通信許可設定

packstack install時点でhttpsにしておかないとiptablesでtcp443が空いていないため,443の通信許可設定をiptablesに入れる。/etc/sysconfig/iptables に次の1行を追加。(ついでに80番は削除)

-A INPUT -p tcp -m multiport --dports 443 -m comment --comment "001 horizon 443 incoming" -j ACCEPT
# -A INPUT -p tcp -m multiport --dports 80 -m comment --comment "001 horizon 80 incoming" -j ACCEPT

サービス再起動

# systemctl restart httpd memcached
# systemctl restart *-nova-*

ここまでやればダッシュボードのHTTPS化完了。

RDOインストールメモ(RHEL8)

参考

https://www.rdoproject.org/install/packstack/

基本的に公式の手順にならって進める。

接続イメージ

事前準備

/etc/environment に以下追加。

LANG=en_US.utf-8
LC_ALL=en_US.utf-8

network周りの準備

network-scripts インストール,Network Manager 無効化,Firewalld無効化,SELinux無効化。

# dnf install network-scripts
# systemctl disable firewalld
# systemctl stop firewalld
# systemctl disable NetworkManager
# systemctl stop NetworkManager
# systemctl enable network
# systemctl start network

teaming設定

NetworkManagerを無効化したため,/etc/sysconfig/network-scripts 配下に以下ファイル作成&編集。

ifcfg-team0

DEVICE=team0
DEVICETYPE=Team
ONBOOT=yes
BOOTPROTO=none
TEAM_CONFIG='{"runner": {"name": "lacp", "active": true, "fast_rate": true, "tx_hash": ["eth", "ipv4"]}, "link_watch": {"name": "ethtool"}}'

ifcfg-enp1s0f0

NAME=enp1s0f0
DEVICE=enp1s0f0
ONBOOT=yes
TEAM_MASTER=team0
TEAM_PORT_CONFIG='{"prio": 0}'

ifcfg-enp1s0f1

NAME=enp1s0f1
DEVICE=enp1s0f1
ONBOOT=yes
TEAM_MASTER=team0
TEAM_PORT_CONFIG='{"prio":0}'

ifup team0で リンクアップさせ,ステータスを確認。

# ifup tema0
# teamdctl team0 state
setup:
  runner: lacp
ports:
  enp1s0f0
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 2
    runner:
      aggregator ID: 5, Selected
      selected: yes
      state: current
  enp1s0f1
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 2
    runner:
      aggregator ID: 5, Selected
      selected: yes
      state: current
runner:
  active: yes
  fast rate: yes

VLAN設定

team0ではVLAN trunk(802.1Q)で複数の外部ネットワークを指定できるようにしたいので,VLAN設定を行う。

# modprobe 8021q
# lsmod | grep 8021q
8021q                  40960  0
garp                   16384  1 8021q
mrp                    20480  1 8021q

外部ネットワーク用にteam0を割り当てるため,ifcfg-team0にOVS用の設定。

DEVICE=team0
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br_ex
ONBOOT=yes
BOOTPROTO=none
TEAM_CONFIG='{"runner": {"name": "lacp", "active": true, "fast_rate": true, "tx_hash": ["eth", "ipv4"]}, "link_watch": {"name": "ethtool"}}'

インストール

RDOリポジトリインストール & サブスクリプションでcodeready-builderを有効化。

# dnf install -y https://www.rdoproject.org/repos/rdo-release.el8.rpm
# subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms

パッケージの更新。

# dnf update

Packstack installerのインストール。

# dnf install openstack-packstack

インストール。

#  packstack --allinone --provision-demo=n --os-neutron-ovn-bridge-mappings=extnet:br-ex --os-neutron-ovn-bridge-interfaces=br-ex:team0

VLANの設定が入っていなかったのでml2_config.iniを編集。

[ml2]
type_drivers=geneve,flat,vlan   #vlan追加
tenant_network_types=geneve
mechanism_drivers=ovn
path_mtu=0
extension_drivers=port_security,qos

[securitygroup]
enable_security_group=True

[ml2_type_geneve]
max_header_size=38
vni_ranges=10:100

[ml2_type_flat]
flat_networks=*

# ↓追記
[ml2_type_vlan]
# VLAN IDを指定しなければ任意のVLANを通せる
network_vlan_ranges=extnet

<略>

ip a で見るといけているっぽい。

10: team0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UP group default qlen 1000

openstack環境構築

ネットワークの作成

外部ネットワーク作成

まずは外部との接点となる外部ネットワークの作成。今回はスイッチ上でVLAN100で設定している192.168.1.0/24を指定する。(相変わらずOpenstackのネットワークの作成→サブネットの作成という流れに違和感を覚える。あまりネットワークにサブネットをぶら下げるメリットがあるようには思えないのだけど,この設計思想は一体どこからきたんだろうか・・・。)

openstack用に割り当てたレンジ(192.168.1.120~192.168.1.129)をDHCPのレンジで設定する。

$ openstack network create --provider-network-type vlan --external --provider-physical-network extnet --provider-segment 100 --share VLAN100
$ openstack subnet create --network VLAN100 --subnet-range 192.168.1.0/24 --dhcp --gateway 192.168.1.1 --allocation-pool start=192.168.1.120,end=192.168.1.129 --dns-nameserver 1.1.1.1 subnet_V100

内部ネットワーク作成

続いて内部ネットワークの作成。172.16.1.0/24,GWは末尾1,DHCPプールは50~100とした。

$ openstack network create internal01
$ openstack subnet create --network internal01 --gateway 172.16.1.1 --subnet-range 172.16.1.0/24 --dhcp --dns-nameserver 1.1.1.1 --allocation-pool start=172.16.1.50,end=172.16.1.100  subnet01

ルータ作成

最後にルータの作成,外部ネットワークの接続,内部ネットワークの接続。

$ openstack router create ext-router
$ openstack router set --external-gateway VLAN100 --enable-snat --fixed-ip ip-address=192.168.1.4 ext-router
$ openstack router add subnet ext-router subnet01

シンプルな構成のできあがり。

外部と内部をルータでつなげただけの構成

イメージ作成

テスト用にcirrosのイメージを作成。ここからwgetで持ってきて,7zを解答。vmdkファイルを結合してqcow2へ変換する。

$ qemu-img convert -O qcow2 ./Kali-Linux-2021.2-vmware-amd64.vmdk kali-linux-2021.2.qcow2
$ openstack image create "cirros" --file ./cirros-0.5.2-x86_64-disk.img --disk-format qcow2 --container-format bare --public

インスタンスの起動はダッシュボードからポチポチやって(ここは省略),無事に起動確認。(そういえば,デフォルトパスワードがUS配列の影響をうけないものに変わって嬉しいw)

無事にpingも通った。

OpenStackにEVE-NGをたてる

WinPC上のVMWare Playerではなく, OpenStackのインスタンスとしてEVE-NGをたてる。

手順

  1. EVE-NG公式サイトからovaファイルをダウンロードする
  2. ovaファイルからvmdkファイルを抽出する
  3. vmdkファイルをqcow2へ変換
  4. OpenStackにイメージ登録
  5. 起動

1と2はそのままなのでスキップ。

3. qcow2変換

qemu-img convert -f vmdk -O qcow2 ./EVE_Community_VM-disk1.vmdk EVE_Community_VM-disk1.qcow2

4. イメージ登録

 openstack image create --file ./EVE_Community_VM-disk1.qcow2 --disk-format qcow2 EVE-NG

5. 起動

ダッシュボードからでもCLIからでも。

openstack server create --image EVE-NG --flavor m1.large --network external EVE-NG

dockerでファイルサーバ立てる

背景

今まではOpenStackにCentOSでファイルサーバ立てていたけれど, OpenStack再構築ややらかしちゃったときに退避データが被害受けるのは辛い。
ということで, せめてホストOS直でファイルサーバを立てようかと思ったが, せっかくKollaでOpenStack立てて, dockerが入っているのだからコンテナでファイルサーバ立ててみようと思った。

コンテナでsambaを立てる

参考情報

Docker上 で samba を動かしてファイル共有する
dperson/samba
docs.docker.com
Docker道場「Dockerの基本概念」0825インフラ勉強会資料

手順

  1. ファイルマウント用のディレクトリ作成
  2. アカウントにdocker権限付与
  3. sambaコンテナデプロイ
  4. smb.conf編集
  5. コンテナ再起動

1.共有ディレクトリ準備

/share/NAS という場所にする。

mkdir /share/NAS
chmod 777 /share/NAS

2.dockerグループ追加

root以外のアカウントでコンテナ実行したいのでdockerグループに追加。(セキュリティ的に好ましくないそう)

sudo usermod -aG docker user

コンテナデプロイ

$ docker run --name NAS             # コンテナ名
-p 139:139 -p 445:445 # ポート139と445を開放
-v /share/NAS:/mnt/nas # /share/NAS を /mnt/nas にバインド
-d dperson/samba # dperson/samba をデプロイ
-u "samba;sambapass" # dperson option) samba ユーザを作成(パスワードも一緒に)
-s "nas:/mnt/nas;no;no;no;samba" # dperson option) /mnt/nasを nas という名前で, 公開せず, ROせず, ゲストも拒否, sambaユーザ限定

3.smb.conf編集

デフォルトだとsmbuserに作成者とか上書きされるので, コンテナにログインしてsmb.confを編集。

$ docker exec -it NAS /bin/bash
bash-4.4#

vi /etc/samba/smb.conf

   pam password change = yes
map to guest = bad user
usershare allow guests = yes
create mask = 0664
force create mode = 0664
directory mask = 0775
force directory mode = 0775
# force user = smbuser #コメントアウト
# force group = users #コメントアウト
follow symlinks = yes
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
socket options = TCP_NODELAY
strict locking = no
vfs objects = recycle
recycle:keeptree = yes
recycle:versions = yes
min protocol = SMB2

4.コンテナ再起動

$ docker restart NAS

完成。確認。

アクセスできてファイルも置けた

$ ls /share/NAS/
test test2

ファイルも置けている。確かに早い!

OpenStack Kolla Horizon HTTPS化

horizon のコンテナでhorizonをHTTPS化する。

手順

  1. horizon コンテナにログイン
  2. /etc/httpd/conf.d/ssl.conf 修正
  3. コンテナ再起動

ログイン

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab109739a033 kolla/centos-source-manila-share:queens "kolla_start" 2 hours ago Restarting (1) 51 seconds ago manila_share
43c45131b740 kolla/centos-source-manila-scheduler:queens "kolla_start" 2 hours ago Up 2 hours manila_scheduler
313fcf872a06 kolla/centos-source-manila-data:queens "kolla_start" 2 hours ago Up 2 hours manila_data
e8d723fef1a4 kolla/centos-source-manila-api:queens "kolla_start" 2 hours ago Restarting (1) 4 seconds ago manila_api
df0eeda4a35b kolla/centos-source-horizon:queens "kolla_start" 2 hours ago Up 3 minutes horizon
ba1aa66b3c70 kolla/centos-source-heat-engine:queens "kolla_start" 2 hours ago Up 2 hours heat_engine
7a99a622e247 kolla/centos-source-heat-api-cfn:queens "kolla_start" 2 hours ago Up 2 hours heat_api_cfn
d3b5669aff16 kolla/centos-source-heat-api:queens "kolla_start" 2 hours ago Up 2 hours heat_api
7c6b49e46961 kolla/centos-source-neutron-bgp-dragent:queens "kolla_start" 2 hours ago Up 2 hours neutron_bgp_dragent
7b043fc70e34 kolla/centos-source-neutron-metadata-agent:queens "kolla_start" 2 hours ago Up 2 hours neutron_metadata_agent
cb58001b41f6 kolla/centos-source-neutron-l3-agent:queens "kolla_start" 2 hours ago Up 2 hours neutron_l3_agent
1d5fc5630757 kolla/centos-source-neutron-dhcp-agent:queens "kolla_start" 2 hours ago Up 2 hours neutron_dhcp_agent
b2fc74c8e428 kolla/centos-source-neutron-openvswitch-agent:queens "kolla_start" 2 hours ago Up 2 hours neutron_openvswitch_agent
3e8ef7289077 kolla/centos-source-neutron-server:queens "kolla_start" 2 hours ago Up 2 hours neutron_server
832cae84fab4 kolla/centos-source-openvswitch-vswitchd:queens "kolla_start" 2 hours ago Up 2 hours openvswitch_vswitchd
4dd0a7fa6d31 kolla/centos-source-openvswitch-db-server:queens "kolla_start" 2 hours ago Up 2 hours openvswitch_db
8096e4ec00e5 kolla/centos-source-nova-compute:queens "kolla_start" 2 hours ago Up 2 hours nova_compute
ea8129516288 kolla/centos-source-nova-novncproxy:queens "kolla_start" 2 hours ago Up 2 hours nova_novncproxy
6703fef99aab kolla/centos-source-nova-consoleauth:queens "kolla_start" 2 hours ago Up 2 hours nova_consoleauth
fb2068c78891 kolla/centos-source-nova-conductor:queens "kolla_start" 2 hours ago Up 2 hours nova_conductor
97057ff78bb6 kolla/centos-source-nova-scheduler:queens "kolla_start" 2 hours ago Up 2 hours nova_scheduler
25e12c436198 kolla/centos-source-nova-api:queens "kolla_start" 2 hours ago Up 2 hours nova_api
f3d3d445c1d2 kolla/centos-source-nova-placement-api:queens "kolla_start" 2 hours ago Up 2 hours placement_api
f47d12a757df kolla/centos-source-nova-libvirt:queens "kolla_start" 2 hours ago Up 2 hours nova_libvirt
1d8e05ba3c99 kolla/centos-source-nova-ssh:queens "kolla_start" 2 hours ago Up 2 hours nova_ssh
810e9ff31daf kolla/centos-source-cinder-backup:queens "kolla_start" 2 hours ago Up 2 hours cinder_backup
3bf3abd9b269 kolla/centos-source-cinder-volume:queens "kolla_start" 2 hours ago Up 2 hours cinder_volume
417c1087b432 kolla/centos-source-cinder-scheduler:queens "kolla_start" 2 hours ago Up 2 hours cinder_scheduler
fda972374b3f kolla/centos-source-cinder-api:queens "kolla_start" 2 hours ago Up 2 hours cinder_api
fd9107b2cc79 kolla/centos-source-glance-api:queens "kolla_start" 2 hours ago Up 2 hours glance_api
b814c910e21f kolla/centos-source-keystone-fernet:queens "kolla_start" 2 hours ago Up 2 hours keystone_fernet
7bda77c6543d kolla/centos-source-keystone-ssh:queens "kolla_start" 2 hours ago Up 2 hours keystone_ssh
0a151029226c kolla/centos-source-keystone:queens "kolla_start" 2 hours ago Up 2 hours keystone
d76caff26d23 kolla/centos-source-rabbitmq:queens "kolla_start" 2 hours ago Up 2 hours rabbitmq
113a23dfefb6 kolla/centos-source-mariadb:queens "kolla_start" 2 hours ago Up 2 hours mariadb
d64c194fa844 kolla/centos-source-memcached:queens "kolla_start" 2 hours ago Up 2 hours memcached
4ce505333564 kolla/centos-source-chrony:queens "kolla_start" 2 hours ago Up 2 hours chrony
c230924e585e kolla/centos-source-cron:queens "kolla_start" 2 hours ago Up 2 hours cron
5d9710d55d76 kolla/centos-source-kolla-toolbox:queens "kolla_start" 2 hours ago Up 2 hours kolla_toolbox
b9bc9d971441 kolla/centos-source-fluentd:queens "kolla_start" 2 hours ago Up 2 hours fluentd
# docker exec -it horizon /bin/bash
(horizon)[root@openstack /]#

ssl.conf 修正

(自己証明書はすでに作成されているのでそのまま利用する)
最終行に以下追加。

Listen 443 https #コメント削除
<Location />
Require all granted
</Location>
WSGIScriptReloading On
WSGIDaemonProcess horizon-https processes=5 threads=1 user=horizon group=horizon display-name=%{GROUP} python-path=/var/lib/kolla/venv/lib/python2.7/site-packages
WSGIProcessGroup horizon-https
WSGIScriptAlias / /var/lib/kolla/venv/lib/python2.7/site-packages/openstack_dashboard/wsgi/django.wsgi
WSGIPassAuthorization On
WSGIApplicationGroup %{GLOBAL}

Alias /static /var/lib/kolla/venv/lib/python2.7/site-packages/static

コンテナ再起動

docker restart horizon

アクセスすると。

無事HTTPS化された

OpenStack Queens をKollaで入れ直す

Newtonのリポジトリがなくなっているので, Kollaで入れ直すことにした。
都度対処療法で進めていったので, 一般的な流れでは無いことをご了承ください。

まず, Packstack環境をこちらのスクリプトで削除する。
付録A PackStack デプロイメントの削除

# ./unpack.sh

一旦再起動&yum update。

# yum update -y

ここからはオフィシャルのページを参考にすすめていく・・・とやってみはいいけれど, うまくいかなかったのでQiitaのこちらも参考にやっていく。
Kolla Ansible Quick Start
kolla-ansibleでOpenStack(stable/queens)を構築する

最小要件は

  • NIC 2つ
  • メモリ 8GB以上
  • ディスク 40GB

今回はRDOの名残のbr-exをマネジメント用にして, もう一方のNICをExternal用にする。
External用のNICはIP無し。
と思ってやってみたけれど, 実際やってみるとbr-exはprecheck時にエラーになるので, openvswitchを利用せず, 物理NICに戻す必要あり。

1. 事前準備

$ sudo yum install epel-release
$ sudo yum install python-pip
$ sudo pip install -U pip
$
$ sudo yum install python-devel libffi-devel gcc openssl-devel libselinux-python
$
$ sudo yum install ansible

/etc/ansible/ansible.cfg 編集。

[defaults]
host_key_checking=False
pipelining=True
forks=100

その他, openstack-newtonのリポジトリで入れたPython系はごっそり消してキレイにしておく。

2. Kolla-ansible インストール

この手順でエラーがでる。

pip install -r kolla/requirements.txt

<エラーメッセージ>

oslo-config 6.4.0 has requirement PyYAML>=3.12, but you'll have pyyaml 3.10 which is incompatible.

この対応のため, 以下インストール実施。

$ wget http://pyyaml.org/download/pyyaml/PyYAML-3.12.tar.gz
$ tar xvfz ./PyYAML-3.12.tar.gz
$ sudo python ./PyYAML-3.12/setup.py install

今一度ansible インストール

$ sudo yum install ansible
$ sudo pip install -r kolla/requirements.txt
$ sudo pip install -r kolla-ansible/requirements.txt

うまくいった。

3. 初期設定ファイル準備

今回はAll-in-oneなので特にファイルいじらない。

$ sudo ansible -i all-in-one all -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}

成功。

4. Kolla パスワード設定

$ sudo kolla-genpwd

5. Kolla globals.yml 編集

kolla_base_distro: "centos"
kolla_install_type: "source"
openstack_release: "queens"
kolla_internal_vip_address: "192.168.1.100"
docker_registry: ""
network_interface: "enp4s0"
neutron_external_interface: "enp1s0"
enable_neutron_provider_networks: "yes" #追加(2018/08/29) 外部ネットワークにつなげたい時はこれ必要
enable_cinder: "yes"
enable_cinder_backup: "yes"
enable_cinder_backend_nfs: "yes"
enable_haproxy: "no"
enable_heat: "yes"
enable_horizon: "yes"
enable_manila: "yes"
enable_manila_backend_generic: "yes" #追加(2018/08/25)
enable_neutron_bgp_dragent: "yes"
glance_backend_file: "yes"
enable_cinder_backend_nfs: "yes"
nova_compute_virt_type: "kvm"
tempest_image_id:
tempest_flavor_ref_id:
tempest_public_network_id:
tempest_floating_network_name:

6.NFS設定

/share/cinder をcinderの共有先とした。
/etc/kolla/config/nfs_shares 編集

#storage01:/share/cinder    #コメントアウト
localhost:/share/cinder #all-in-oneなのでlocalhostに編集

7. デプロイ

$ sudo kolla-ansible -i all-in-one bootstrap-servers
$ sudo kolla-ansible -i all-in-one prechecks
$ sudo kolla-ansible -i all-in-one deploy
$ sudo kolla-ansible post-deploy

8. OpenStack CLIインストール

色々と依存関係でエラーが出たので対処療法で以下実施。
sudo mv ./ipaddress* /tmp/

sudo mv /lib/python2.7/site-packages/pyinotify* /tmp/
pip install python-openstackclient python-glanceclient python-neutronclient

この後, これも足りないとインストール。

sudo yum install python-stevedore.noarch

そしてサンプル構成をデプロイ時にまたエラーが出て以下対応をした。

sudo yum install python-stevedore.noarch

9. デプロイ

改めてサンプル構成デプロイ実行。

. /etc/kolla/admin-openrc.sh
. /usr/share/kolla-ansible/init-runonce

一応できている。

$ openstack subnet list
+--------------------------------------+----------------+--------------------------------------+-------------+
| ID | Name | Network | Subnet |
+--------------------------------------+----------------+--------------------------------------+-------------+
| 0d5a4b6f-a873-4ea1-9b50-f4f7b2c52c95 | public1-subnet | 6c5000d4-6cdc-4ded-8e04-dce9f85dd4eb | 10.0.2.0/24 |
| 72bd7b51-9ab0-4be3-956a-dd3ce1085048 | demo-subnet | ccc2adc9-9b5e-42c6-9787-b19d11605f63 | 10.0.0.0/24 |
+--------------------------------------+----------------+--------------------------------------+-------------+

ダッシュボードにアクセス。
http://<kolla_internal_vip_address>

https化したいけれど, どうしたらいいのだろう

ひとまず無事?にできたので今日はここまで。

インストールメディアから無理やりWin10のインスタンスを作成する方法

OpenStackのWindowsイメージを作成する手順は, 一般的にはKVMでvirtioドライバをあわせてインストールするのが標準的。
参考:https://docs.openstack.org/ja/image-guide/windows-image.html

その他仮想環境(ESXi等)でWindowsをインストールして, その上でvirtioをインストールするというのも, まぁあり。

今回は無理やりOpenStack上でisoインストーラからWindowsをインストールして起動させるということを試した。

手順

1. isoイメージを登録
2. flavorを作成
3. インスタンス起動

と普通のながれだけれども, metadataとしてhw_disk_busとhw_cdrom_busとhw_vif_modelを指定することがポイントとなる。
メタデータは「hw_disk_bus=ide」「hw_cdrom_bus=ide」hw_vif_model=e1000」を設定する。
メタデータについてはこちらを参照。

OpenStackはRDOのOcataでAll-in-One構成。

イメージ作成

openstack image create --disk-format iso --property hw_disk_bus=ide --property hw_cdrom_bus=ide --property hw_vif_model=e1000 --file ./Win10.iso Win10.image

フレーバー作成

openstack flavor create --ram 2048 --ephemeral 36 --vcpus 2 --property hw_disk_bus=ide --property hw_cdrom_bus=ide --property hw_vif_model=e1000 Win10

※ エフェメラルディスクが認識されるのでここはCドライブとして見せたいサイズを指定する。
※ メタデータはフレーバーでは指定しなくても動くけど, 入れたほうが反応がマシになる気がしている。(真偽不明)

インスタンス作成

openstack server create --flavor Win10 --nic --net-id=xxx --image Win10.image --property hw_disk_bus=ide --property hw_cdrom_bus=ide --property hw_vif_model=e1000 Win10

結論

instanceのメタデータ(とくにhw_disk_bus=ide)を指定すればインストールメディアからのインスタンス作成はできることが分かった。
とりあえず動けば良いのであればそれでも良さそうだけれども, どうもimageやflavorも指定した方が動きがマシな気がする。
けれどもまともに使いたいのであればvirtioドライバを入れた方がよいので, virtioドライバがもはや無いOSに対してはこの手順は有効かと思われます。(Win2000とか・・・)

metadata
hw_disk_bus=ide
metadata
hw_disk_bus=ide
metadata
hw_disk_bus=ide
metadata
hw_disk_bus=ide
flavor 有り 無し 無し 無し
image 有り 有り 無し 無し
instance 有り 有り 有り 無し
インストール可能か Yes Yes Yes No

インストール画面が出た

インスタンスのhw_disk_busがideになっていて
エフェメラルディスクがあればディスクが見える

インスタンスのhw_disk_bus=ideが無いとディスクなしで終了となる

ひとまずこんな起動もできるよ的なメモとして。