Kolla Ansibleでall-in-one構成のOpenStack(Xena)環境を構築してみた

自宅にラックサーバが1台生えてきたので、all-in-one構成でOpenStack(Xena)環境を構築してみました。

microstackなどの簡単に試せるものもいくつか試してみましたが、上流のネットワークのVLANを取り扱いたいなど少し踏み込んだことをしたい際に困ったので、Kolla Ansibleでの構築を行いました。

**本記事で紹介する手法はあくまで開発用・実験用のOpenStack環境を作成するもので、productionユースに対応したものではありません。**

今回は、all-in-one構成かつ上流のネットワークのVLANを扱えることを目標に構築を行います。

# デプロイ先のマシンの構成
- OS: Ubuntu Server 20.04 LTS
- ベアボーン: ASRock Rack 1U2-X570/2T
- CPU: AMD Ryzen 7 5800X
- メモリ: SO-DIMM DDR4 3200MHz PC4-25600 64GB
- NIC: Intel X550-AT2 10GBASE-T x 2 ※今回は1つだけ使用
- ストレージ: NVMe SSD 1TB

通常、OpenStackは2つ以上の物理NICを使用することが必須要件となっていますが、上流のネットワークがVLANを扱える環境でかつNICがVLANを扱えるのであれば、1つの物理NICでも動かすことは可能なので今回はそのような構成にしています。

(上流のL2SWへ接続する際に使用する10GBASE-TのSFP+モジュールは高価な為、お財布事情によりこのような構成になりました)

今回デプロイする環境にはあらかじめ、以下のようにVLANの設定をしてあります。

**!!あくまでこのような設定でも動くというだけで、推奨するものではありません!!**

- OpenStack側で使用するインタフェース: enp36s0f1
    - IPアドレスの割り当て無し
    - タグ付きのVLANを扱えるように上流のL2SWを設定済み
- VLANインタフェース(仮想): vlan2
    - IPアドレス: 192.168.0.113/24
    - VID: 2
    - ホストの管理用・OpenStackの管理に使用
    - 親インタフェース: enp36s0f1

また、今回は可能な限り設定ファイルの類をgitなどのVCSで管理することを目指してセットアップを行います。

通常、kolla-ansibleはデプロイ元のホストの `/etc/kolla/` に設定ファイルを配置しますが、そうすると管理上不便なため、ローカルのユーザディレクトリ内の開発用に作成した任意のディレクトリ内に配置できるようにセットアップを進めます。

# Python環境(venv)の構築
あらかじめ、デプロイ元のホストにはpython3を入れておいてください。

```bash
python -m venv venv
# venv環境をactivateする
source venv/bin/activate
```

以下のコマンドでkolla-ansibleをvenv環境にインストールしてください。

```bash
pip install kolla-ansible
```

また、kolla-ansibleをインストールしても一緒にAnsibleはインストールされないので、以下のページを参考に**別途対応したバージョン**のAnsibleをインストールしてください。(対応してないバージョンのものを入れるとエラーになるので注意してください)

[Quick Start &#8212; kolla-ansible 13.1.0.dev187 documentation](https://docs.openstack.org/kolla-ansible/latest/user/quickstart.html)

記事執筆時点の最新のkolla-ansibleのバージョンは13.1.0なので、Ansible 5.xをインストールします。

```bash
pip install 'ansible==5.*'
```

インストールが出来たら、`requirements.txt`に依存関係を保存しておきます。

```bash
pip freeze > requirements.txt
```

(次にデプロイ環境を作るときは、 venv環境を作ってから `pip install -r requirements.txt` で復元してください)

# 設定ファイルを用意する
kolla-ansibleはその設定ファイルを変更することで、多種多様なOpenStack構成をデプロイすることが出来ます。

その設定項目はHA構成などを考慮した設定も可能で非常に多いので、今回は最低限シンプルに動く状態を目指すために最小限の変更を加えます。

## パスワードを生成して暗号化して保存しておく
```bash
mkdir kolla-ansible-etc/
cp venv/share/kolla-ansible/etc_examples/kolla/passwords.yml kolla-ansible-etc/
kolla-genpwd -p kolla-ansible-etc/passwords.yml
```

ansible-vaultを用いてしっかり強固なパスワードで暗号化しておきましょう。デプロイ時に必要になるので忘れないようにしてください！

```bash
ansible-vault encrypt kolla-ansible-etc/passwords.yml
```

ansible-vaultの仕組みや使い方についてはAnsibleの公式ドキュメントを参照してください！

[Encrypting content with Ansible Vault — Ansible Documentation](https://docs.ansible.com/ansible/latest/user_guide/vault.html)

## globals.ymlを用意する
```bash
cp venv/share/kolla-ansible/etc_examples/kolla/globals.yml ./kolla-ansible-etc/
```

今回は以下のような設定に変更します。(変更箇所のみ抜粋)

デプロイ先のホストのIPアドレスやインタフェースに合うように修正してください。

```yml:kolla-ansible-etc/globals.yml
# OpenStackの管理用IPアドレス(他と被らないIPアドレスを指定。デプロイすると管理用IFに割り当てられます。)
kolla_internal_vip_address: "192.168.0.140"
# OpenStack管理用に使用するホストのIFを指定
network_interface: "vlan2"
# OpenStackから使用するIF(VLANなどもここを通る)
neutron_external_interface: "enp36s0f1"
# kolla-ansible-etc/以下に配置したconfigを読めるように設定する(相対パスでは動かない)
node_custom_config: "{{ lookup('env', 'PWD') }}/kolla-ansible-etc/config/"
# Dockerのイメージファイルのベースになるディストリビューション(今回はUbuntuを指定)
kolla_base_distro: "ubuntu"
# デプロイするOpenStackのバージョン(今回はXenaを指定)
openstack_release: "xena"
# ボリュームの格納先にCinderを使う
enable_cinder: "yes"
enable_cinder_backend_nfs: "yes"
# VLANを使用できるようにする
neutron_tenant_network_types: "vxlan,vlan"
```

## CinderとNeutronの設定を用意する
ボリュームの格納先になるNFSサーバとそのパスを指定しておきます。

外部のNFSサーバを用いる場合はそのサーバのIPアドレスを、all-in-one構成でデプロイするサーバ自体を指定する場合は管理用IFのIPアドレスを指定してください。(その場合は後述する手順で忘れずにNFSサーバとしても構成してください)

```text:kolla-ansible-etc/config/cinder/nfs_shares
192.168.0.113:/share/cinder
```

VLANを使えるようにするために、Neutronの設定を変えておきます。

```ini:kolla-ansible-etc/config/neutron/ml2_conf.ini
[ml2_type_vlan]
network_vlan_ranges = physnet1
```

## all-in-one構成のinventoryを用意する
```bash
mkdir inventory
cp venv/share/kolla-ansible/ansible/inventory/* inventory/
```

変更箇所のみ抜粋

```text:inventory/all-in-one
# These initial groups are the only groups required to be modified. The
# additional groups are for more control of the environment.

[control]
noka ansible_connection=local

[network]
noka ansible_connection=local

[compute]
noka ansible_connection=local

[storage]
noka ansible_connection=local

[monitoring]
noka ansible_connection=local

[deployment]
noka ansible_connection=local

# You can explicitly specify which hosts run each project by updating the
# groups in the sections below. Common services are grouped together.

```

`ansible_connection` はAnsibleを実行するホストに対してデプロイする場合は `local` を指定することができます。
他のホストにデプロイする場合は、別途SSHの認証周りの設定を行う必要があります。

[Connection methods and details — Ansible Documentation](https://docs.ansible.com/ansible/latest/user_guide/connection_details.html)

## NFSサーバを構成する
今回はall-in-one構成ということで、デプロイするサーバ自体をNFSサーバにして、そこにボリュームを格納するようにします。

本来、これらの設定もAnsibleで行うのがあるべき姿だとは思いますが、別途playbookを書く必要があるのと、一旦本筋から逸れる為簡単な手順のみを記しておきます。

```bash
sudo apt install nfs-kernel-server
mkdir -p /share/cinder
chown nobody:nogroup /share/cinder
```

```text:/etc/exports
/share/cinder 192.168.0.0/24(rw,sync,no_subtree_check)
```

```bash
sudo systemctl enable nfs-kernel-server
sudo systemctl restart nfs-kernel-server
```

[Ubuntu 20.04にNFSマウントをセットアップする方法  | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-20-04-ja)

# デプロイを実行する
デプロイは、bootstrap -> check -> deploy の順で行います。途中のステップでエラーが発生した場合はよくエラーを見直して確認しましょう。

全体を通して20分程度時間を要するのでデプロイを開始したら止めずに気長に待ちましょう。

```bash:bootstrap
ANSIBLE_BECOME_ASK_PASS=TRUE kolla-ansible -i inventory/all-in-one --configdir $(pwd)/kolla-ansible-etc/ --passwords kolla-ansible-etc/passwords.yml --ask-vault-pass bootstrap-servers
```

```bash:check
ANSIBLE_BECOME_ASK_PASS=TRUE kolla-ansible -i inventory/all-in-one --configdir $(pwd)/kolla-ansible-etc/ --passwords kolla-ansible-etc/passwords.yml --ask-vault-pass prechecks
```

```bash:deploy
ANSIBLE_BECOME_ASK_PASS=TRUE kolla-ansible -i inventory/all-in-one --configdir $(pwd)/kolla-ansible-etc/ --passwords kolla-ansible-etc/passwords.yml --ask-vault-pass deploy
```

また、必須ではありませんが、コマンド上でOpenStackを操作する際に使用する初期化用のスクリプトを生成する `post-deploy` は以下のコマンドを実行してください。

(生成される `kolla-ansible-etc/admin-openrc.sh` には機微情報が含まれるので、 `.gitignore` に入れるなどして取り扱いには注意してください)

```bash:post-deploy
ANSIBLE_BECOME_ASK_PASS=TRUE kolla-ansible -i inventory/all-in-one --configdir $(pwd)/kolla-ansible-etc/ --passwords kolla-ansible-etc/passwords.yml --ask-vault-pass post-deploy
```

# 最後に
問題なくデプロイが完了していれば、前の手順で指定した管理用IPアドレスにOpenStackのダッシュボード(Horizon)が生えてきているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41743/770c0ae8-300a-93c3-b92d-faa0f68558d2.png)

(adminアカウントは `kolla-ansible-etc/passwords.yml` に格納されているもので入ることが出来ます)