
私はjujuを使ってMAASをベースにOpenStackを作成しました。インスタンス、プロジェクトなどを作成しました。データベースとOpenStackの設定ファイルのバックアップを作成しました。サービスを破壊して削除することでテストリカバリを試しています。キーストーン回復可能かどうかを確認するためです。また、keystone データベースも削除しました。(バックアップされています) そこで、juju を使用して、壊れた古い keystone を破棄し、新しい keystone をデプロイします。これで、すべてのプロジェクト (テナント) がなくなり、インスタンスがどのプロジェクトにも属さなくなることを除けば、実際に再び実行できるようになります。そこで、keystone データベースをトークンなしで復元しましたが、そうすると、horizon で、keystone がクライアントを認証しないというエラーが表示されます。
壊れたキーストーン ノードを復元する最善の方法は何でしょうか? juju でキーストーンをやり直すと、新しいトークンが取得されるようです。juju は、何らかの方法で古いトークンを新しいキーストーンに挿入できますか?
答え1
発生している問題は、keystone チャームが keystone データベースの外部にいくつかの情報を保存することです。具体的には、サービスのユーザー名とパスワードがディスク上にローカルに保存されるため、keystone に関連する追加のサービス ユニットがある場合、keystone サービスは要求されたユーザーの正しいパスワードを関連するサービスに渡すことができます。
また、keystone をデプロイするときに admin-password と admin-token の設定を指定していない場合も問題が発生します。keystone サービス ユニットは、明示的に設定されていない場合はこれらをランダムに生成するため、keystone サービス ユニットを削除して新しいものを追加すると、これらが変更されます。
最終的に、データベース内のハッシュされたパスワードのセット (最初のサービス ユニットによって作成) が、2 番目のキーストーン サービス ユニットのディスク上に生成されたパスワードと一致しなくなります。
理想的には、juju の何らかの汎用オブジェクト ストレージ機能 (object-put/object-get など) によってこれを修正しますが、これはサポートされている機能ではありません。
パスワードとトークンのディスク上の保存はすべて /var/lib/keystone で行われます。keystone サービス ユニット自体のバックアップの一部としてこれらを取り出すことはできるかもしれませんが、これらのファイルを復元する前にサービス リレーションが開始されるため、新しいサービス ユニットを追加すると競合が発生します。
OpenStack チャームのメンテナーの一人として、私はこれについてもう少し考えて、もっとエレガントなものができるかどうか検討してみます。