Devstackはどんなことをしているのか

はじめに

OpenStack (2枚目) Advent Calendar 2014/12/15です。

あまり書慣れていないのですが、がんばります。

この前、DevStackのソースを読んで、Devstackがやっていることを手作業で再現してみるということをやってみたので、Devstackが大体どんなことをやっているのか?を5つのポイントにしてまとめてみました

また、付録としてdevstackに沿って手作業でインストールしたときの手順書を掲載します。興味ある方はご覧ください

Devstackのソースを読むことのすすめ

devstackを普段使っている方、使いたいと思ってる方はざっとでいいので、一度devstackのスクリプトを読むことをオススメします(特に初級〜中級技術者の人)理由としては、下記の点があげられます。

  1. openstackがどういう過程を踏んで、構築されるかが分かる
  2. 手作業でOpenstackをインストールできるようになる
  3. ./stack.shで失敗したときに、その原因の推測が容易にできるようになる
  4. シェルスクリプトに大分なれることができる

本題、Devstackが大体どんなことをしているのか

1. Openstackに必要なパッケージのインストール

 devstack/files/apts 配下に、各コンポーネントの名前(一部プロセス名)のファイルがあり、その中に、必要なパッケージファイルが羅列されています。  Devstackは、ENABLED_SERVICES で指定されているコンポーネントに必要なパッケージファイルを devstack/files/apts 配下のファイルより読み取り、apt-get等でインストールします

2. pipのインストールと、特定のライブラリをあらかじめインストール

 pipは、pythonのパッケージ関連システムです。Openstackはソースコードを取得して、pipでローカルインストールします。

pipのインストール

$curl -o get-pip.py https://bootstrap.pypa.io/get-pip.py
$sudo -E python get-pip.py

prettytableとhttplib2というライブラリは、バージョンの指定があるようなので、先にインストール

$sudo pip install "prettytable=0.7.2"
$sudo pip install "httplib2=0.8"

3. ここからが、肝心のOpenstackコンポーネントのインストール

keystoneとかをインストールする前に共通コンポーネントをインストールする必要がある。

その中でも、「requirements」「pbr」2つの共通コンポーネントは一番最初にインストールする。

3-1. openstack/requirementsコンポーネントのインストール

requirementsコンポーネントは、

各コンポーネントのrequirements.txtをチェックしrequirementsコンポーネントglobal-requirements.txtに定義されていないライブラリはないか?

各コンポーネントのrequirements.txtで定義されているライブラリのバージョンはglobal-requirements.txtより古くないか?

をチェックしてくれるもの。All in One構成を想定して各コンポーネントのライブラリ同士が悪さをしないようにするものらしい。(バージョンの違いとか)

特にインストールとかはせず、checkoutするだけ

$ git clone git://git.openstack.org/openstack/requirements.git stable/juno
3-2. openstack-dev/pbrコンポーネントのインストール

pbrコンポーネントは、

インストールオプションをsetup.cfgに書いて、setuptoolsでインストールするときにsetupメソッドをフックしてその、オプションを適用してくれるらしい。

インストールは下記の手順

$git clone git://git.openstack.org/openstack-dev/pbr.git

$cd /opt/stack/requirements

$./update.py /opt/stack/pbr  #=>requirements.txtのチェックをしてくれる

$sudo pip install /opt/stack/pbr
3-3. その他のコンポーネントのインストール

 その他の共通コンポーネント(openstack/oslo.config , openstack/oslo.messaging など)やkeystone,novaなどのコンポーネントのインストール

どのコンポーネントも手順は、3-2と同じ

  1. gitでcheckout

  2. update.py で requirements.txtをチェック(openstack/requirements)

  3. pip install

4. 設定ファイルの編集、起動

 最後に、各コンポーネントに関する設定ファイルの編集。

多分devstackのスクリプトを読むのが一番めんどくさいのがここ。というのも、devstackでは結構いろんな設定をすることができてそれを柔軟に対応するために、

~~~~が設定されてたら、AとBとCという設定ファイルに*******を追加して、Dという設定ファイルを追加で作成する

みたいなことがたくさん書かれているためである

5. 各クライアントツールを使って初期データの投入

5-1. keystone
  1. 各テナントの作成「admin,demo,service,invisible_to_admin」
  2. 各ユーザの作成「admin,demo」「nova,glance,neutron,cinder」
  3. 各ロールの作成「admin,Member,anotherrole,ResellerAdmin,service」
  4. 各ユーザとテナントに対してロールを設定する(下記に表を示す)
  5. サービスカタログとエンドポイントの登録

ユーザとロールの対応表(参考)

ユーザ テナント ロール
admin admin admin
admin demo admin
demo demo Member,anotherrole
demo invisible_to_admin Member
nova service admin
glance service service
neutron service admin
cinder service admin

→各コンポーネントのユーザは、serviceテナントに所属させる必要がある

5-2. glance
  1. cirrosイメージの登録
5-3. neutron
  1. デモテナント用のプライベートネットワーク、サブネットの作成(dhcp有効)
  2. 外部ネットワーク、サブネットの作成(dhcp無効)
  3. デモテナント用のルータの作成
  4. デモテナント用のルータのインターフェスの作成(プライベートネットワーク)
  5. デモテナント用のルータにgatewayの設定(外部ネットワーク)

→外部ネットワークでは、dhcpが無効になっていることに注意。つまりadminテナントでインスタンスを作って外部ネットワークに直接接続しても、ipが降ってこないのでssh等でアクセスすることができない。

→あと、devstackではデモテナントのプライベートネットワークにホスト(OpenstackをインストールしたPC)上からアクセスできるように、 下記の二つを実施している

  1. br-exインターフェースにIPアドレスを振って(ip addr add dev br-ex)
  2. routeを追加してる(ip route add -net gw <デモテナントのgw側のIFのアドレス>)

6.インストールは終了、あとは遊ぶだけ!

まとめ

今回、devstackがどんなことをしているのか5つのポイントにしてまとめてみましたが、ここでは、設定ファイルの編集については具体的には触れていません。

というのもopenstackの使う機能によって、作る設定ファイル、内容がまったく違うからです。devstackでは、それらに対応するためコードが複雑化しているように見えます。私はこれらの背景より、devstackでどのように設定ファイルを編集しているかを知ることはあまり意味がないと考えています。なのでここでは4ステップ目に「設定ファイルの編集、起動」とだけ記しています。

この後に、Devstackが行っていることを手作業で再現したときの手順メモを付録(別日記)として載せますので、もう少しdevstackがどんなことをしているかを知りたい方、手作業でインストールしてみたい方は参考にしてみてください。