Mirantis OpenStack 9.1 アップデートしてみた！

Mirantis OpenStack 9.1 が2016年10月14日（JST）にリリースされました。
9.0 から 9.1 へマイナーアップデートを試してみましたので投稿致します！

結構長いブログになってしまったので、 **目次** をみて読み飛ばしてください。

手順は下記のサイトを参考にしています。

https://docs.mirantis.com/openstack/fuel/fuel-9.1/release-notes/update-product.html

今回は、アップデート手順を簡単なシステム構成でさらっと流してみるところまでのご紹介です！

# Updateしたシステム構成

下記のシステム構成のEnvironmentをアップデートしました。

![pic000205.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/240c5479-ee27-3299-c8c3-5d34c88abc6f.jpeg)


※アップデート対象は、 **Fuel Master** ,  **Fuel Slave(2台)** となります。
※FuelSlave側はサーバ再起動はされず、 **プロセスの再起動はされている** ようです。よって、OpenStackのAPIはサービスダウンタイムが発生します。
※MySQLやRabbitMQはクラスタ構成を組んでいません。
※この構成をアップデートするのに要した時間は事前準備も含めて、 **約2～3時間程度** です。

# 更新手順を開始する前に

マニュアルに、「メンテナンスウィンドウを計画し、テスト、ステージング環境の最新情報をバックアップする必要がある」と注意書きがあり、以下の5つの項目をチェックする必要があるそうです。

* メンテナンス計画を立てること。
* バックアップを行うこと。
* Fuel Masterがインターネットへ接続できていること。
* /var/www/nailgunディレクトリの空きが2.5GB以上あること。
* ラボやテスト環境で検証してから実施すること。

今回はせっかくなので、

* バックアップ
* ディスク空き容量の確認
* Internetへ接続確認

の3つを確認していきたいと思います。

## 事前準備：バックアップ

手順は下記を参考にします。
http://docs.openstack.org/developer/fuel-docs/userdocs/fuel-install-guide/upgrade/backup-fuel.html

+ octaneのインストール
![pic000159.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/fb0e5574-db12-d316-457d-486e3ec2ed60.jpeg)
途中でインストールを続けてよいか？と聞かれるので、yを押す。
![pic000156.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/8c11c92d-93d9-25ac-a1a4-868f495b7627.jpeg)
2回聞かれるのでyを入力してEnterを押下する。
![pic000157.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/f42f0001-3431-eec8-9be6-eaf0a0b292dc.jpeg)
下記のように、Complete!と表示されればfuel-octaneのインストール完了。
![pic000158.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/d8b0108b-997e-f3b8-6905-95458a008790.jpeg)

+ バックアップ
コンフィグバックアップ
![pic000160.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/6067b352-dbf7-049d-5d3d-6b1c484ee11b.jpeg)
バイナリーとパッケージバックアップ
![pic000161.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/340bbd7c-16bb-fd21-12cc-d0f9e47aeb46.jpeg)
コンフィグバックアップは3MB程度で、バイナリ＆パッケージバックアップは2.7GBでした。
![pic000162.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/f7befa6a-2226-3105-3b15-3c75a50db688.jpeg)
このファイルUSBなどにコピーして保管しておいてください。

## 事前準備：ディスク空き容量の確認 

![pic000163.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/e5e9c7e5-7be5-afc5-a395-6666bb3266ef.jpeg)

空きディスクが現在4.7GBでした。
2.5GB以上の空きディスクが要求されていますが、まぁぎりあるのでこのまま進んでみます。

## 事前準備：Internetへの接続確認
![pic000164.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/e1433327-9f3b-317f-7bf8-0b8d7a2e5edd.jpeg)
通っていますね。
この確認をFuelSlaveの全Nodeでも確認しておいてください。
cudetというコマンドを後ほど実行しますが、その際に、apt-get updateでリポジトリに接続できるか確認しているようです。

# アップグレード

事前作業が済みましたので、 Mirantis OpenStack 9.0 環境から Mirantis OpenStack 9.1 の環境へアップデートしていきます。

## Update手順１：Fuel MasterにSSHでログイン

ログインしましょう。（説明省略）

## Update手順２：バージョン確認

MOSアップデート用のリポジトリリストが利用可能であることを確認します。

```
cat /etc/yum.repos.d/mos-updates.repo
```

![pic000165.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/83e96d55-c022-4d3d-7666-7a64b0c07a40.jpeg)

上記のように表示されれば問題ないようです。
カスタマイズしている場合は別途書き換えが必要です。（マニュアル参照してください）

## Update手順３：yumキャッシュクリア

yumのキャッシュをクリアします。

```
yum clean all
```

![pic000166.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/11991ad1-aab3-6280-ab2a-df2a23d73ca9.jpeg)

## Update手順４：整合性チェックツールCudetインストール

整合性チェックツール Cudet をインストールします。
このツールは、fuel2 のために必要な更新コマンドが含まれています。
cudetコマンドが打てるようになり、これによって、FuelSlaveノードのソースやコンフィグファイルをカスタマイズしている場合に変更点が検出できるようになります。

```
yum install python-cudet
```

![pic000167.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/fda31508-1b01-c5a5-2fe7-f6128b5e703d.jpeg)
yを入力します。

![pic000168.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/a5ce0db9-d6ae-842e-b646-fcbc3c4a9c27.jpeg)
下記のように、Complete! と表示されれば Cudet のインストール完了。

![pic000169.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/09ed1351-c21c-562c-2162-b2c7293cb376.jpeg)

## Update手順５：整合性チェック

Cudet を使用して、環境の整合性チェック（ソースやコンフィグをカスタマイズしている個所の洗い出し・検出）を実行します。
引数の cudet-id は、fuel env コマンドで確認します。
ENV_ID に紐づかれたFuelSlaveノードを対象にチェックされます。

```
cudet -e <ENV_ID>
```

![pic000184.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/fb764610-ab96-8099-02de-90f573fd8270.jpeg)

Environmentは、Controllerを1台とComputeを1台、デプロイ済みのものを用意していたので、これを指定します。
※注意：このコマンド時に、Fuel Slave（Fuelに接続されているNode達）へ接続かけて状態をチェックしているようなので、Nodeの電源が落ちているとWarningなどが出ます。
「Collecting data from 2 nodes:」と表示されたあと応答までしばらく時間がかかります。
 **2台でだいたい5分程度** でした。

![pic000185.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/48d9c73b-eaaa-b810-5879-20572e316206.jpeg)


3台分の結果が表示されています。
「Versions verification analysis: OK」と出ているので、手順を続けてみます。

ここで変更点・差分が表示された場合、自らその変更点を確認して問題ないか確認しておきます。
たとえば、ソースコードに自分でパッチを当てていた場合、OpenStackのGAバージョンと差分がでるので、
そのパッチは、上書きされて消される可能性があるので、アップデート後、自分でそのパッチを充てなおす必要があります。
ご注意ください。

## Update手順６：Fuel Masterの事前準備

Fuel Master 上に 新nailgun や不足のパッケージをインストールします。
また、Nailgun DBsyncが実行され、nailgunサービスを再起動されます。

```
update-prepare prepare master
```

![pic000186.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/eafa1a37-4a06-d9b0-88fd-669ec0b99eb0.jpeg)
![pic000187.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/ebb074a1-b088-478f-cc30-660c0a5f0dbe.jpeg)

「Complete!」と表示されているので問題なく最新化されたようです。

## Update手順７：Fuel SlaveのEnvironmentの事前準備

Environmentの準備をします。
これは、Environmentに属されているFuelSlave（各ノード）でapt-get updateを行っているようです。
このコマンドを実行すると各Nodeがupdateできるか事前にチェックしているようです。

```
[root@fuel ~]# update-prepare prepare env 1
Warning: Permanently added '192.168.114.103' (ECDSA) to the list of known hosts.
W: GPG error: http://mirror.fuel-infra.org mos9.0-holdback Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY BCE5CC461FA22B08
W: GPG error: http://mirror.fuel-infra.org mos9.0-security Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY BCE5CC461FA22B08
W: GPG error: http://mirror.fuel-infra.org mos9.0-updates Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY BCE5CC461FA22B08
```

GPGのKey認証エラーが出ているようです。
この場合、鍵が各ノードに配備されていないために出るログのようなので、
下記の手順をFuel Slaveとなる各ノードで実行して、この問題を回避しました。
（下記の手順はMirantisの手順にないものです）

```
root@node-1:~# gpg --recv-keys BCE5CC461FA22B08
gpg: requesting key 1FA22B08 from hkp server keys.gnupg.net
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 1FA22B08: public key "fuel-infra (Example key) <devops@mirantis.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
root@node-1:~# apt-key list
/etc/apt/trusted.gpg
--------------------
pub   1024D/437D05B5 2004-09-12
uid                  Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
sub   2048g/79164387 2004-09-12

pub   1024D/FBB75451 2004-12-30
uid                  Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>

pub   4096R/C0B21F32 2012-05-11
uid                  Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>

pub   4096R/EFE21092 2012-05-11
uid                  Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>

root@node-1:~# gpg -a --export BCE5CC461FA22B08 | apt-key add -
OK
root@node-1:~# apt-key list
/etc/apt/trusted.gpg
--------------------
pub   1024D/437D05B5 2004-09-12
uid                  Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
sub   2048g/79164387 2004-09-12

pub   1024D/FBB75451 2004-12-30
uid                  Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>

pub   4096R/C0B21F32 2012-05-11
uid                  Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>

pub   4096R/EFE21092 2012-05-11
uid                  Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>

pub   2048R/1FA22B08 2015-07-21
uid                  fuel-infra (Example key) <devops@mirantis.com>
sub   2048R/6273AA09 2015-07-21

root@node-1:~#


以下、2台目にも実行しておきます。


root@node-2:~# gpg --recv-keys BCE5CC461FA22B08
gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
gpg: no keyserver known (use option --keyserver)
gpg: keyserver receive failed: bad URI
root@node-2:~# gpg --recv-keys BCE5CC461FA22B08
gpg: requesting key 1FA22B08 from hkp server keys.gnupg.net
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 1FA22B08: public key "fuel-infra (Example key) <devops@mirantis.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
root@node-2:~# apt-key list
/etc/apt/trusted.gpg
--------------------
pub   1024D/437D05B5 2004-09-12
uid                  Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
sub   2048g/79164387 2004-09-12

pub   1024D/FBB75451 2004-12-30
uid                  Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>

pub   4096R/C0B21F32 2012-05-11
uid                  Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>

pub   4096R/EFE21092 2012-05-11
uid                  Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>

root@node-2:~# gpg -a --export BCE5CC461FA22B08 | apt-key add -
OK
root@node-2:~# apt-key list
/etc/apt/trusted.gpg
--------------------
pub   1024D/437D05B5 2004-09-12
uid                  Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
sub   2048g/79164387 2004-09-12

pub   1024D/FBB75451 2004-12-30
uid                  Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>

pub   4096R/C0B21F32 2012-05-11
uid                  Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>

pub   4096R/EFE21092 2012-05-11
uid                  Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>

pub   2048R/1FA22B08 2015-07-21
uid                  fuel-infra (Example key) <devops@mirantis.com>
sub   2048R/6273AA09 2015-07-21

root@node-2:~#
```

再び、下記のコマンドでパッケージ準備が更新されるかを確認します。

![pic000188.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/785617a0-d29b-4196-a11f-b13348ee756d.jpeg)

アップデートできる準備が整っているようです。
（このGPG error の件は別途Fuelコミュニティへバグレポートを書いて、パッチを出そうかと思います。）
（同様にこの問題にひっかかった方がいた場合、コメントくださるとありがたいです。）

## Update手順８：事前確認

下記のコマンドでUpdateを行う前に、事前に構成のチェックを行います。

```
fuel2 env redeploy --noop <ENV_ID>
fuel2 task show <ENV_ID>
```

![pic000189.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/c10c2805-07ad-8bb9-836a-14fc57c7eb4f.jpeg)

タスク23が進行中のようです。
statusが「ready」になるまで繰り返しコマンド「fuel2 task show <ENV_ID>」を実行して確認します。

![pic000190.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/e2920b82-bd04-0012-9084-6ec617533c8a.jpeg)

「ready」になりました。（10分くらい繰り返していました）
「Dry_Run_Deployment is done. No changes.」と書かれているので、
ドライラン（試し走行）を実行して問題なかったようです。

## Update手順９：タスクの概要確認

次に、手順8で実行したNoopランの結果はFuelSlaveの各Nodeの /var/lib/puppet/reports/<NODE-FQDN>/<TIMESTAMP>.yaml
ディレクトリに格納されるそうです。
何に使われるかわかりませんが、とりあえず、コマンドを実行して結果を出力しておきます。
（すみません、わかり次第、投稿に追記します・・・。）

注意！：
すべての環境のカスタマイズは、アップデート処理中に失われ、
アップデートを開始する価値があるかどうかの判断をするためにNOOPランとCudetによって行われたカスタマイズ検出レポートを使用するそうです。

```
fuel2 task history show <TASK_ID> --include-summary
```

![pic000194.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/16342cff-95d6-c1f5-3ecc-09d3c489279b.jpeg)

## Update手順１０：FuelMasterのアップデート

事前確認で問題なかったのでアップデートを開始します。

注意！：
更新中にFuelMaster上のプロセスが自動で再起動されるそうです。

```
update-prepare update master
```
実行ログが大量すぎたので画面キャプチャは取りませんでした。

![pic000195.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/2b6d2edb-4c05-b3d8-6781-c7b91a79b245.jpeg)

「Master node update is <successfully complete>」と出ているので、成功したようです。
**FuelMasterのアップデートにかかった時間は35分程** でした。

## Update手順１１：FuelSlaveのアップデート

FuelSlaveのアップデートを行います。
FuelSlaveは2台のノード（Controller1台とCompute1台）なので、アップデートに時間がどれくらいかかるのかも確認してみたいと思います。

```
fuel2 update --env <ENV_ID> install
```

**MySQLとRabbitMQを再起動させるオプション** をつけることが可能で、
MySQLとRabbitMQを更新しない場合は、再起動されないようです。
もし、再起動させたくない場合はオプションをつけなければよさそうです。
（まだオプション無しは試していませんがマニュアルにはオプションを付けた場合の説明だけがあります。）

今回のアップデート構成はController1台なので、MySQLやRabbitMQはクラスタ構成をとっていない構成となっています。

```
--restart-rabbit 
--restart-mysql
```

せっかくなので、オプションをつけて実行をしてみます！

```
fuel2 update --env <ENV_ID> install --restart-rabbit --restart-mysql
```

![pic000196.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/fc427c66-457b-4066-6e19-476160264b2e.jpeg)


再起動されるのか、ControllerNodeにログインして、
「watch 'ps -ef | grep mysqld | grep -v grep'」コマンドと
「watch 'ps -ef | grep rabbitmq-server | grep -v grep | grep -v monitor'」コマンドで
起動時刻をウォッチしたいと思います。

![pic000197.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/bb06be16-71e8-5ef9-333a-179f12c85abe.jpeg)
![pic000198.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/ce44d440-dd48-33ab-52d3-ba3ceea3b86f.jpeg)

Oct18に起動おり、アップデートを実行した日付はOct19なので再起動された場合、ここが変わるはず。

このアップデートは非同期で各OpenStackNode（FuelSlave）にアップデートされるので、下記のコマンドで状況を確認することができようです。

```
fuel2 task show <TASK_ID>
```
![pic000199.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/5dd57216-bf4a-bde7-c0f4-c58548621f44.jpeg)

このコマンドを繰り返して実行し、「progress」を見ると徐々に進捗が進んでいることがみてとれます。

![pic000200.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/146ee1aa-1560-bcd9-730b-368e4cad32f2.jpeg)
![pic000201.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/4e4119d7-0f53-b6dd-36be-7349b8a5cb28.jpeg)

Oct19ではなく、現在の時刻に表示が切り替わりました。（6:46と6:47）
FuelSlaveのアップデートを実行してから10分程度でプロセスが再起動されました。
つまり、MySQLとRabbitMQに変更が加わっていたため再起動されたということですね。
完全にアップデートを反映させるためには、オプションをつけて実行すべきかと考えます。

今回はMySQLやRabbitMQのクラスタを組んでいないので再起動の時間が数秒程度だったようですが、
クラスタを組んでいた場合はどれくらい時間がかかっていたのかわかりません。
この時間がメンテナス時間を計画する（ダウンタイム計測）ために必要なものになるでしょう。

![pic000202.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/d849d5f7-f8cd-3766-1583-b44fc4e4831e.jpeg)

デプロイが完了しました。
**FuelSlaveのアップデートまでにかかった時間は５０分程（2Nodeぶん）** でした。
なので、おそらく1台あたり25分かかる計算なのかも知れません。（次回3ノードで試せばわかるか・・・。）


## Update手順１１：Mirantis OpenStack 9.1にアップデートされたか確認

下記のコマンドで確認します。

```
cudet -e <ENV_ID>
```
![pic000203.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/097ac35b-67d9-9048-b54e-03e78a08dc8f.jpeg)


「Potential updates: ALL NODES UP-TO-DATE」と表示されているので正常にアップデートされました。

次回の記事では、9.1に関するアップデートの内容とその動作検証を記載したいと思います！

おたのしみに☆彡