OpenStack keystoneをwindowsで構築してみた


始め

KeystoneをcloneしてPycharmで開いてみた。色んなmissing packagesの警告が出た。
「これ嫌だな。」
この話はここから始まった。

何年か前にPycharmのmissing packagesを解消しようとしたことがあった。その時にはPyPIとwindows用wheelで解決しようとしたが、結局失敗。名前は思い出さないがWindows用のpackageがないものがあった。

それを今回はconda install -c conda-forgeを利用してやってみた。これだけ使っては上手くいけない場合もあったのでPyPIも使いながらインストールすると何となくdependencyを揃うことが出来た。(私はconda3をインストールしたのでpython3.6の環境だ。)
時には pip install "pysaml2<4.0.3,>=4.0.2" こんなコマンドも使った。

「へー、もし動ける?」

結果、動けた。

参考文書はやっぱりopenstack document。
https://docs.openstack.org/keystone/latest/install/keystone-install-rdo.html#install-and-configure-components

基本コンセプトは、以下をWindows上に実行すること

  • conda create -n openstack && activate openstack
  • cd c:\dev\keystone && pip install -e .
  • package 設置
  • mysqlをインストール
  • keystone-manage db_syncでテーブル自動生成する
  • keystone-manage bootstrapでテーブルに基本情報をInsertする
  • apache24をインストールする
  • mod_wsgiをインストールする
  • http.confを設定する
  • apache24を起動

conda create -n openstack && activate openstack

virtualenvも良いけどconda-forgeが提供するwindows用packageは最高。今はvirtualenvは使わない。pycharmもinterpreter設定画面でcondaをサポートしてくれてるし。

cd c:\dev\keystone && pip install -e .

keystoneをforkしてからcloneした。これから沢山のbranchを作りながらいじってみるから。

package 設置

ここはconda search <packagename>pip search <packagename>で何となく出来る

mysqlをインストール

一応最新をインストールした。「No thanks, just start my download」
設置したコンポネントはserver only

keystone-manage db_syncでテーブル自動生成する

keystone-manage bootstrapでテーブルに基本情報をInsertする

apache24をインストールする


apacheloungeで最新をインストールした。

mod_wsgiをインストールする


windows用precompiled wheelをダウンロードした。

http.confを設定する

LoadFile "c:/programdata/anaconda3/envs/openstack/python36.dll"
LoadModule wsgi_module "c:/programdata/anaconda3/envs/openstack/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "c:/programdata/anaconda3/envs/openstack"
Include conf/wsgi-keystone.conf


wsgi-keystone.confは最初はc:\dev\keystone\httpd\wsgi-keystone.confをcopyしてやってみた。失敗。

理由はWindows用のmod_wsgiには具現されてないfeatureがあったこと。

色々工夫して成功したのが以下の内容だ。

Listen 5000
Listen 35357

<VirtualHost *:5000>
    # WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    # WSGIProcessGroup keystone-public
    # WSGIScriptAlias / /usr/local/bin/keystone-wsgi-public
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public.py
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    # LimitRequestBody 114688
    #<IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    #</IfVersion>
    ErrorLog /var/log/apache2/keystone.log
    CustomLog /var/log/apache2/keystone_access.log combined

    # <Directory /usr/local/bin>
    <Directory /usr/bin>
        # <IfVersion >= 2.4>
            Require all granted
        # </IfVersion>
        # <IfVersion < 2.4>
        #    Order allow,deny
        #    Allow from all
        # </IfVersion>
    </Directory>
</VirtualHost>

<VirtualHost *:35357>
    # WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    # WSGIProcessGroup keystone-admin
    # WSGIScriptAlias / /usr/local/bin/keystone-wsgi-admin
    WSGIScriptAlias / /usr/bin/keystone-wsgi-admin.py
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    # LimitRequestBody 114688
    #<IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    #</IfVersion>
    ErrorLog /var/log/apache2/keystone.log
    CustomLog /var/log/apache2/keystone_access.log combined

    # <Directory /usr/local/bin>
    <Directory /usr/bin>
        # <IfVersion >= 2.4>
            Require all granted
        # </IfVersion>
        #<IfVersion < 2.4>
        #    Order allow,deny
        #    Allow from all
        #</IfVersion>
    </Directory>
</VirtualHost>

# Alias /identity /usr/local/bin/keystone-wsgi-public
Alias /identity /usr/bin/keystone-wsgi-public.py
<Location /identity>
    SetHandler wsgi-script
    Options +ExecCGI

    # WSGIProcessGroup keystone-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>

# Alias /identity_admin /usr/local/bin/keystone-wsgi-admin
Alias /identity_admin /usr/bin/keystone-wsgi-admin.py
<Location /identity_admin>
    SetHandler wsgi-script
    Options +ExecCGI

    # WSGIProcessGroup keystone-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>

keystone-wsgi-public.pyとkeystone-wsgi-admin.pyはkeystone repositoryでは提供されてないので、ubuntuのやつをcopyしてshebangだけ#!/ProgramData/Anaconda3/envs/openstack/pythonにした。

apache24を起動



次やってみたいこと

一応、dbからではなくcsvファイルから認証するようにするにはことをいじればいいか調べたい。
以上。

後書き

Apacheなしで起動することもできた。

このファイルをPycharmでDebugモードで実行することもできる。