(付録)Devstackはどんなことをしているのか

この記事は、Devstackはどんなことをしているのかの付録記事になっており、下記の2部構成になっております。

  • devstackのソースを読むときに非常にお世話になったコマンド
  • devstackを読みながら、インストールしたときの手順書

付録1.devstackのソースを読むときに非常にお世話になったコマンド

devstackは、シェルスクリプトであり。他のファイルで定義されている関数をsourceコマンドで動的に読み込みます。そのため、簡単に関数の定義や変数の定義がある場所を調べることができないのですが、そのような場合はgrepコマンドを下記のように使うと便利です。

 $grep -n "" * */* */*/*  | grep <検索したい文字列>
 

使用例(AGENT_BINARYという変数がどこで使われているか調べたいとき)

$grep -n "" * */* */*/* | grep AGENT_BINARY
lib/neutron:489:    run_process q-agt "python $AGENT_BINARY --config-file $NEUTRON_CONF --config-file /$Q_PLUGIN_CONF_FILE"
lib/neutron:507:        run_process q-domua "python $AGENT_BINARY --config-file $NEUTRON_CONF --config-file /$Q_PLUGIN_CONF_FILE.domU"
lib/neutron_plugins/bigswitch_floodlight:44:    AGENT_BINARY="$NEUTRON_DIR/neutron/plugins/bigswitch/agent/restproxy_agent.py"
lib/neutron_plugins/brocade:41:    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-linuxbridge-agent"
lib/neutron_plugins/ibm:102:    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-ibm-agent"
lib/neutron_plugins/linuxbridge_agent:49:    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-linuxbridge-agent"
lib/neutron_plugins/nec:78:    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-nec-agent"
lib/neutron_plugins/ofagent_agent:72:    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-ofagent-agent"
lib/neutron_plugins/oneconvergence:63:    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-nvsd-agent"
lib/neutron_plugins/openvswitch_agent:66:    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-openvswitch-agent"
lib/neutron_plugins/ryu:53:    AGENT_BINARY="$NEUTRON_DIR/neutron/plugins/ryu/agent/ryu_neutron_agent.py"

付録2.ソースからインストールする際の、手順のメモ(殴り書きなので、適宜微修正をしないといけないかもしれません)

注意していただきたいこと

<****>は適宜自分の環境に置き換えて入力してください。

構築した環境について

  • Openstackバージョン:stable/junoを想定
  • 環境:ubuntu14.04
  • 構成:ALL in One
  • インストールコンポーネント:keystone,nova,cinder,glance,neutron
  • 設定:基本的に、標準の設定を想定
  • Novaのハイパーバイザー: kvm + qemu
  • Neutron:ml2プラグイン + ovsエージェント

(1)$ mkdir /opt/stack #インストール先のディレクトリを作成

(2)rabbitmqで名前解決が必要になるため、hostnameファイルに下記を追加

127.0.0.1  localhost

   

(3)依存パッケージのインストール(適宜Devstackの files/<component-name> を確認する方が確実)

dist指定があるものは、ディストリビューションのバージョンがdistに指定されているバージョンの場合だけインストール。NOPRIMEはインストールしない

general

   * bridge-utils

   * pylint

   * python-setuptools

   * screen

   * unzip

   * wget

   * psmisc

   * git

   * lsof # useful when debugging

   * openssh-server

   * openssl

   * python-virtualenv

   * python-unittest2

   * iputils-ping

   * wget

   * curl

   * tcpdump

   * euca2ools # only for testing client

   * tar

   * python-cmd2 # dist:precise

   * python-dev

   * python2.7

   * bc

keystone

   * python-lxml

   * python-pastescript

   * python-pastedeploy

   * python-paste

   * sqlite3

   * python-pysqlite2

   * python-sqlalchemy

   * python-mysqldb

   * python-webob

   * python-greenlet

   * python-routes

   * libldap2-dev

   * libsasl2-dev

nova

   * bridge-utils

   * pylint

   * python-setuptools

   * screen

   * unzip

   * wget

   * psmisc

   * git

   * lsof # useful when debugging

   * openssh-server

   * openssl

   * python-virtualenv

   * python-unittest2

   * iputils-ping

   * wget

   * curl

   * tcpdump

   * euca2ools # only for testing client

   * tar

   * python-cmd2 # dist:precise(12.04LTS)

   * python-dev

   * python2.7

   * bc

n-cpu

   * lvm2

   * open-iscsi

   * open-iscsi-utils # Deprecated since quantal dist:precise

   * genisoimage

   * sysfsutils

   * sg3-utils

   * python-guestfs # NOPRIME

n-api

   * python-dateutil

   * msgpack-python

   * fping

n-novnc

   * python-numpy

glance

   * gcc

   * libffi-dev

   * libmysqlclient-dev  # testonly

   * libpq-dev           # testonly

   * libssl-dev          # testonly

   * libxml2-dev

   * libxslt1-dev        # testonly

   * python-eventlet

   * python-routes

   * python-greenlet

   * python-sqlalchemy

   * python-wsgiref

   * python-pastedeploy

   * python-xattr

   * python-iso8601

   * zlib1g-dev           # testonly

cinder

   * tgt

   * lvm2

   * qemu-utils

   * libpq-dev

   * open-iscsi

   * open-iscsi-utils # Deprecated since quantal dist:precise

neutron

   * ebtables

   * iptables

   * iputils-ping

   * iputils-arping

   * mysql-server #NOPRIME

   * sudo

   * python-boto

   * python-iso8601

   * python-paste

   * python-routes

   * python-suds

   * python-pastedeploy

   * python-greenlet

   * python-kombu

   * python-eventlet

   * python-sqlalchemy

   * python-mysqldb

   * python-pyudev

   * python-qpid # dist:precise

   * dnsmasq-base

   * dnsmasq-utils # for dhcp_release only available in dist:precise

   * rabbitmq-server # NOPRIME

   * qpidd # NOPRIME

   * sqlite3

   * vlan

(4)pipのインストール

(4−1)https://bootstrap.pypa.io/get-pip.pyをダウンロード

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

(5)特定のライブラリだけバージョンを指定して、あらかじめインストールし、アップデートされないようにReadOnlyにする

   Openstackを使うにあたって、下記のバージョン依存がある

   (5−1)sudo pip install "prettytable=0.7.2"

$sudo pip install "prettytable=0.7.2"

   (5−2)sudo pip install "httplib2=0.8"

$sudo pip install "httplib2=0.8"

   (5−3)アップデートされないように、644のパーミッションを設定する

$sudo chmod 644 /usr/lib/python2.7/dist-package/prettytable-0.7.2*
$sudo chmod 644 /usr/lib/python2.7/dist-package/httplib2*

→Devstackだと上記コマンドだけど、sudo chmod 555のじゃないと意味ないんじゃないか?

(6)RPCバックエンド(amqpサーバ) のインストール

$ sudo apt-get install rabbitmq-server

(7)DBサーバのインストール、簡単な初期設定

  (7−1)$ sudo apt-get install mysql-server #インストール

$sudo apt-get install mysql-server

  (7−2)~/.my.cnf の作成(mysqlコマンドを引数無しで実行すると、これの値が参照される)

~/.my.cnf

[client]
user=<user名>
password=<password>
host=<host名>

(8)neutronのエージェントが依存するパッケージ(agentが操作する対象の仮想スイッチ等)をインストール(ml2_plugin/openvswitchの場合)

   (8−1)カーネルが3.13よりバージョンが低ければ、「openvswitch-datapath-dkms」もaptでインストール

$sudo apt-get install openvswitch-datapath-dkms

   (8−2)openvswitchとかインストール

$sudo apt-get install make fakeroot dkms openvswitch-switch linux-headers-<kernel_version>

    →kernel_versionは:「cat /proc/version | cut -d " " -f3」で取得できる

Openstackコンポーネントのインストール

(9)openstack/requirementsコンポーネント

   → 各コンポーネントの依存関係が定義されるファイル(requirements.txt,test-requirements.txt)のバージョンをOpenstack内で統一してくれる、requirementsファイルに定義されていないライブラリは使用されないことを約束する

   →使い方は、$python update.py <コンポーネントのソースディレクトリのパス>

   →2つのコンポーネントがtestというライブラリを使用するとするときに、1つ目のコンポーネントがバージョン0.8を使っていて、もう片方がバージョン1.2を使っている場合。1つ目のコンポーネントが最初にインストールされると、2つ目のコンポーネントでバージョン0.8のライブラリを使うことになるのでエラーが起きることがある。その解決策として作られた。

  (9−1)cd /opt/stack

$cd /opt/stack

     (9−2)git clone git://git.openstack.org/openstack/requirements.git stable/juno

$git clone git://git.openstack.org/openstack/requirements.git stable/juno

(10)openstack-dev/pbrコンポーネント

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

  (10−1)cd /opt/stack

$cd /opt/stack

  (10−2)git clone git://git.openstack.org/openstack-dev/pbr.git

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

  (10−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (10−4)./update.py /opt/stack/pbr

$./update.py /opt/stack/pbr

    →pbrのrequirements.txt,test-requirements.txtで定義されているライブラリがglobal-requirementsに定義されているか、バージョンは古くないかを検査してくれる

  (10−5)sudo pip install /opt/stack/pbr

$sudo pip install /opt/stack/pbr

(11)openstack/cliffコンポーネント

   →CLIフレームワーク、各コンポーネントCLIソフトウェアを作成するときに使われている模様

  (11−1)cd /opt/stack

$cd /opt/stack

  (11−2)git clone git://git.openstack.org/openstack/cliff.git

$git clone git://git.openstack.org/openstack/cliff.git 

    (11−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (11−4)./update.py /opt/stack/cliff

$./update.py /opt/stack/cliff

  (11−5)sudo pip install /opt/stack/cliff

$sudo pip install /opt/stack/cliff

(12)openstack/oslo.configコンポーネント

   →Openstack共通のコンフィグとかが入っている

  (12−1)cd /opt/stack

$cd /opt/stack

  (12−2)git clone git://git.openstack.org/openstack/oslo.config.git

$git clone git://git.openstack.org/openstack/oslo.config.git

  (12−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (12−4)./update.py /opt/stack/oslo.config

$./update.py  /opt/stack/oslo.config

  (12−5)sudo pip install /opt/stack/oslo.config

$sudo pip install /opt/stack/oslo.config

(13)openstack/oslo.messagingコンポーネント

   →コンポーネント間の通信処理(amqp)を行うライブラリ

  (13−1)cd /opt/stack

$cd /opt/stack

  (13−2)git clone git://git.openstack.org/openstack/oslo.messaging.git

$git clone git://git.openstack.org/openstack/oslo.messaging.git

  (13−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (13−4)./update.py /opt/stack/oslo.messaging

$./update.py /opt/stack/oslo.messaging

  (13−5)sudo pip install /opt/stack/oslo.messaging

$sudo pip install /opt/stack/oslo.messaging

(14)openstack/oslo.rootwrapコンポーネント

   →各コンポーネントは、SU権限が必要な処理をすることがある、Cinderだったらmountとかneutronだったらrouteの追加とか

  (14−1)cd /opt/stack

$cd /opt/stack

  (14−2)git clone git://git.openstack.org/openstack/oslo.rootwrap.git

$git clone git://git.openstack.org/openstack/oslo.rootwrap.git

  (14−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (14−4)./update.py /opt/stack/oslo.rootwrap

$./update.py /opt/stack/oslo.rootwrap

  (14−5)sudo pip install /opt/stack/oslo.rootwrap

$sudo pip install /opt/stack/oslo.rootwrap

(15)openstack/pycadfコンポーネント

   →よくわからないhttp://docs.openstack.org/developer/pycadf/

  (15−1)cd /opt/stack

$cd /opt/stack

  (15−2)git clone git://git.openstack.org/openstack/pycadf.git

$git clone git://git.openstack.org/openstack/pycadf.git

  (15−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (15−4)./update.py /opt/stack/pycadf

$./update.py /opt/stack/pycadf

  (15−5)sudo pip install /opt/stack/pycadf

$sudo pip install /opt/stack/pycadf

(16)openstack/stevedoreコンポーネント

   →Pythonプラグイン機構を抽象化するためのもの

  (16−1)cd /opt/stack

$cd /opt/stack

  (16−2)git clone git://git.openstack.org/openstack/stevedore.git

$git clone git://git.openstack.org/openstack/stevedore.git

  (16−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (16−4)./update /opt/stack/stevedore

$./update /opt/stack/stevedore

  (16−5)sudo pip install /opt/stack/stevedore

$sudo pip install /opt/stack/stevedore

(17)openstack/taskflowコンポーネント

  (17−1)cd /opt/stack

$cd /opt/stack

  (17−2)git clone git://git.openstack.org/openstack/taskflow.git

$git clone git://git.openstack.org/openstack/taskflow.git

  (17−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (17−4)./update /opt/stack/taskflow

$./update /opt/stack/taskflow

  (17−5)sudo pip install /opt/stack/taskflow

$sudo pip install /opt/stack/taskflow

(18)python-keystoneclientコンポーネントのインストール

  (18−1)cd /opt/stack

$cd /opt/stack

  (18−2)git clone git://git.openstack.org/openstack/python-keystoneclient.git

$git clone  git://git.openstack.org/openstack/python-keystoneclient.git

  (18−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (18−4)./update /opt/stack/python-keystoneclient

$./update /opt/stack/python-keystoneclient

  (18−5)sudo pip install /opt/stack/python-keystoneclinet

$sudo pip install /opt/stack/python-keystoneclinet

  (18−6)mode -644 owner <実行ユーザ>でpython-keystoneclient/etc/bash_completion.d/keystone.bash_completionを/etc/bash_completion.d配下にコピー

$sudo install -D -m 0644 -o <実行ユーザ> {/opt/stack/python-keystoneclient/etc/bash_completion.d/,/etc/bash_completion.d/}keystone.bash_completion

(19)python-glanceclientコンポーネントのインストール

  (19−1)cd /opt/stack

$cd /opt/stack

  (19−2)git clone git://git.openstack.org/openstack/python-glanceclient.git

$git clone git://git.openstack.org/openstack/python-glanceclient.git

  (19−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (19−4)./update.py /opt/stack/python-glanceclient

$./update.py /opt/stack/python-glanceclien

  (19−5)sudo pip install /opt/stack/python-glanceclient

$sudo pip install /opt/stack/python-glanceclient

  (19−6)mode -644 owner <実行ユーザ>でpython-glanceclient/etc/bash_completion.d/glance.bash_completionを/etc/bash_completion.d配下にコピー

$sudo install -D -m 0644 -o <実行ユーザ> {/opt/stack/python-glanceclient/etc/bash_completion.d/,/etc/bash_completion.d/}glance.bash_completion

(20)python-neutronclientコンポーネントのインストール

  (20−1)cd /opt/stack

$cd /opt/stack

  (20−2)git clone git://git.openstack.org/openstack/python-neutronclient.git

$git clone git://git.openstack.org/openstack/python-neutronclient.git

  (20−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (20−4)./update.py /opt/stack/python-neutronclient

$./update.py /opt/stack/python-neutronclient

  (20−5)sudo pip install /opt/stack/python-neutronclient

$sudo pip install /opt/stack/python-neutronclient

  (20−6)mode 644 owner <実行ユーザ>でpython-neutronclient/etc/bash_completion.d/neutron.bash_completionを/etc/bash_completion.d配下にコピー

$sudo install -D -m 0644 -o <実行ユーザ> {/opt/stack/python-neutronclient/etc/bash_completion.d/,/etc/bash_completion.d/}neutron.bash_completion

(21)python-novaclientコンポーネントのインストール

  (21−1)cd /opt/stack

$cd /opt/stack

  (21−2)git clone git://git.openstack.org/openstack/python-novaclient.git

$git clone git://git.openstack.org/openstack/python-novaclient.git

  (21−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (21−4)./update.py /opt/stack/python-novaclient

$./update.py /opt/stack/python-novaclient

  (21−5)sudo pip install /opt/stack/python-novaclient

$sudo pip install /opt/stack/python-novaclient

  (21−6)mode 644 owner <実行ユーザ>でpython-novaclient/etc/bash_completion.d/nova.bash_completionを/etc/bash_completion.d配下にコピー

$sudo install -D -m 0644 -o <実行ユーザ> {/opt/stack/python-novaclient/etc/bash_completion.d/,/etc/bash_completion.d/}nova.bash_completion

(22)openstackclientコンポーネントのインストール ( 696line in stack.sh )

  (22−1)cd /opt/stack

$cd /opt/stack

  (22−2)git clone git://git.openstack.org/openstack/python-openstackclient.git

$git clone git://git.openstack.org/openstack/python-openstackclient.git

  (22−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (22−4)./update.py /opt/stack/python-openstackclient

$./update.py /opt/stack/python-openstackclient

  (22−5)sudo pip install /opt/stack/python-openstackclient

$sudo pip install /opt/stack/python-openstackclient

(23)Keystoneのインストール

  (23−1)cd /opt/stack

$cd /opt/stack

  (23−2)git clone git://git.openstack.org/openstack/keystone.git stable/juno

$git clone git://git.openstack.org/openstack/keystone.git stable/juno

  (23−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (23−4)./update.py /opt/stack/keystone

$./update.py /opt/stack/keystone

  (23−5)sudo pip install /opt/stack/keystone

$sudo pip install /opt/stack/keystone

(24)Keystoneの設定

  (24−1)cd /opt/stack/keystone

$cd /opt/stack/keystone

  (24−2)sudo mkdir /etc/keystone ; sudo chown <実行ユーザ> /etc/keystone

$sudo mkdir /etc/keystone
$sudo chown <実行ユーザ> /etc/keystone

  (24−3)Keystoneのソースディレクトリから下記の設定ファイルを/etc/keystone配下にコピー         ・keystone.conf.sample → keystone.conf         ・keystone-paste.ini         ・policy.json

$cp /opt/stack/keystone/etc/keystone.conf.sample /etc/keystone
$cd /opt/stack/keystone/etc/keystone-pate.ini /etc/keystone
$cd /opt/stack/keystone/etc/policy.json  /etc/keystone

  (24−4)keystone.confを以下のように編集

keystone.conf

[DEFAULT]
public_endpoint=http://<keystoneが動くIP>:%(public_port)s/
admin_endpoint=http://<keystoneが動くIP>:%(admin_port)s/
admin_token=<admin portのtoken>
use_syslog=True
public_bind_host=0.0.0.0
admin_bind_host=0.0.0.0
[assignment]
driver=keystone.assignment.backends.sql.Assignment 
[auth]
[cache]
[catalog]
driver=keystone.catalog.backends.sql.Catalog
[credential]
[database]
connection=mysql://user:password@127.0.0.1/keystone?charset=utf8
[ec2]
driver=keystone.contrib.ec2.backends.sql.Ec2
[endpoint_filter]
[endpoint_policy]
[federation]
[identity]
driver=keystone.identity.backends.sql.Identity
[identity_mapping]
[kvs]
[ldap]
[matchmaker_redis]
[matchmaker_ring]
[memcache]
[oauth1]
[os_inherit]
[paste_deploy]
config_file=/etc/keystone/keystone-paste.ini
[policy]
[revoke]
[saml]
[signing]
[ssl]
[stats]
[token]
driver=keystone.token.backends.sql.Token
[trust]

(25)Glanceのインストール

  (25−1)cd /opt/stack

$cd /opt/stack

  (25−2)git clone git://git.openstack.org/openstack/glance.git stable/juno

$git clone git://git.openstack.org/openstack/glance.git stable/juno

  (25−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (25−4)./update.py /opt/stack/glance

$./update.py /opt/stack/glance

  (25−5)sudo pip install /opt/stack/glance

$sudo pip install /opt/stack/glance

(26)Glanceの設定

  (26−1)sudo mkdir /etc/glance ; sudo chown <実行ユーザ> /etc/glance

$sudo mkdir /etc/glance
$sudo chown <実行ユーザ> /etc/glance

  (26−2)cp /opt/stack/glance/etc/glance-registory.conf /etc/glance

$cd /opt/stack/glance/etc/glance-registory.conf  /etc/glance

  (26−3)glance-registory.conf の設定を以下のように編集

glance-registry.conf

[DEFAULT]
debug=True
sql_connection=mysql://<user名>:<password>@127.0.0.1/glance?charset=utf8
use_syslog=True
bind_host = 0.0.0.0
bind_port = 9191
backlog = 4096
api_limit_max = 1000
limit_param_default = 25
rabbit_host = localhost
rabbit_port = 5672
rabbit_use_ssl = false
rabbit_userid = guest
rabbit_password = guest
rabbit_virtual_host = /
rabbit_notification_exchange = glance
rabbit_notification_topic = notifications
rabbit_durable_queues = False
qpid_notification_exchange = glance
qpid_notification_topic = notifications
qpid_hostname = localhost
qpid_port = 5672
qpid_username =
qpid_password =
qpid_sasl_mechanisms =
qpid_reconnect_timeout = 0
qpid_reconnect_limit = 0
qpid_reconnect_interval_min = 0
qpid_reconnect_interval_max = 0
qpid_reconnect_interval = 0
qpid_heartbeat = 5
qpid_protocol = tcp
qpid_tcp_nodelay = True
[database]
[keystone_authtoken]
auth_host=<keystoneのIP>
auth_port=35357
auth_protocol=http
cafile=
auth_uri=http://<keystoneのIP>:35357/v2
signing_dir=/var/cache/glance/registry
identity_uri = http://127.0.0.1:35357
admin_tenant_name = service
admin_user = glance
admin_password = stack
[paste_deploy]
flavor=keystone
[profiler]

  (26−4)cp /opt/stack/glance/etc/glance-api.conf /etc/glance

$cp /opt/stack/glance/etc/glance-api.conf /etc/glance

  (26−5)glance-api.confを下記のように編集

glance-api.conf

[DEFAULT]
debug=True
sql_connection=mysql://<user名>:<password>@127.0.0.1/glance?charset=utf8
use_syslog=True
bind_host = 0.0.0.0
bind_port = 9191
backlog = 4096
api_limit_max = 1000
limit_param_default = 25
rabbit_host = localhost
rabbit_port = 5672
rabbit_use_ssl = false
rabbit_userid = guest
rabbit_password = guest
rabbit_virtual_host = /
rabbit_notification_exchange = glance
rabbit_notification_topic = notifications
rabbit_durable_queues = False
qpid_notification_exchange = glance
qpid_notification_topic = notifications
qpid_hostname = localhost
qpid_port = 5672
qpid_username =
qpid_password =
qpid_sasl_mechanisms =
qpid_reconnect_timeout = 0
qpid_reconnect_limit = 0
qpid_reconnect_interval_min = 0
qpid_reconnect_interval_max = 0
qpid_reconnect_interval = 0
qpid_heartbeat = 5
qpid_protocol = tcp
qpid_tcp_nodelay = True
[database]
[keystone_authtoken]
auth_host=<keystoneのIP>
auth_port=35357
auth_protocol=http
cafile=
auth_uri=http://<keystonのIP>:35357/v2
signing_dir=/var/cache/glance/registry
identity_uri = http://127.0.0.1:35357
admin_tenant_name = service
admin_user = glance
admin_password = stack
[paste_deploy]
flavor=keystone
[profiler]

  (26−6)下記のファイルを/opt/stack/glance/etc から /etc/glanceにコピー        ・glance-cache.conf        ・glance-registry-paste.ini        ・glance-api-paste.ini        ・policy.json        ・schema-image.json

$cp /opt/stack/glance/etc/glance-cache.conf /etc/glance
$cp /opt/stack/glance/etc/glance-registry-paste.ini /etc/glance
$cp /opt/stack/glance/etc/glance-api-paste.ini /etc/glance
$cp /opt/stack/glance/etc/policy.json /etc/glance
$cp /opt/stack/glance/etc/shcema-image.json /etc/glance

(27)Cinderのインストール     (27−1)cd /opt/stack

$cd /opt/stack

  (27−2)git clone git://git.openstack.org/openstack/cinder.git stable/juno

$git clone git://git.openstack.org/openstack/cinder.git stable/juno

  (27−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (27−4)./update.py /opt/stack/cinder

$./update.py /opt/stack/cinder

  (27−5)sudo pip install /opt/stack/cinder

$sudo pip install /opt/stack/cinder

(28)Cinderの設定

  (28−1)sudo mkdir /etc/cinder ; sudo chown <実行ユーザ> /etc/cinder

$sudo mkdir /etc/cinder
$sudo chown <実行ユーザ> /etc/cinder

  (28−2)cp /opt/stack/cinder/etc/policy.json /etc/cinder

$cp /opt/stack/cinder/etc/policy.json  /etc/cinder

  (28−3)rootwrapの設定

   (28−3−1)mkdir -m 755 /etc/cinder/rootwrap.d

 $mkdir -m 755 /etc/cinder/rootwrap.d

   (28−3−2)cp /opt/stack/cinder/etc/rootwrap.d/* /etc/cinder/rootwrap.d/

 $cp /opt/stack/cinder/etc/rootwrap.d/* /etc/cinder/rootwrap.d/

     (28−3−3)sudo chown -R root:root /etc/cinder/rootwrap.d

 $sudo chown -R root:root /etc/cinder/rootwrap.d

   (28−3−4)sudo chmod 644 /etc/cinder/rootwrap.d/*

 $sudo chmod 644 /etc/cinder/rootwrap.d/*

   (28−7)cp /opt/stack/cinder/etc/rootwrap.conf /etc/cinder/

 $cp /opt/stack/cinder/etc/rootwrap.conf /etc/cinder/

   (28−8)/etc/cinder/rootwrap.confを下記のように追加

rootwrap.conf

filters_path = /etc/cinder/rootwrap.conf

   (28−9)sudo chown root:root /etc/cinder/rootwrap.conf

$sudo chown root:root /etc/cinder/rootwrap.conf

   (28−10)sudo chmod 0644 /etc/cinder/rootwrap.conf

$sudo chmod 0644 /etc/cinder/rootwrap.conf

   (28−11)/etc/sudoers.d/cinder-rootwrapを下記の内容で作成

cinder-rootwrap

<実行ユーザ> ALL=(root) NOPASSWD : /usr/bin/cinder-rootwrap /etc/cinder/rootwrap.conf *

  (28−12)cp /opt/stack/cinder/etc/api-paste.ini /etc/cinder

$cp /opt/stack/cinder/etc/api-paste.ini  /etc/cinder

  (28−13)cp /opt/stack/cinder/etc/cinder.conf.sample /etc/cinder/cinder.conf

$cp /opt/stack/cinder/etc/cinder.conf.sample /etc/cinder/cinder.conf

  (28−14)cinder.confを下記のように変更

cinder.conf

[DEFAULT]
auth_strategy=keystone
debug=True
verbose=True
volume_group=stack-volumes
volume_name_template=volume-%s
my_ip=<cinderのipアドレス>
iscsi_helper = tgtadm
sql_connection=mysql://<user名>:<password>@127.0.0.1/cinder?charset=utf8
api_paste_config=/etc/cinder/api-paste.ini
rootwrap_config=/etc/cinder/rootwrap.conf
osapi_volume_extension=cinder.api.contrib.standard_extensions
state_path=/opt/stack/data/cinder
lock_path=/opt/stack/data/cinder
periodic_interval=60
use_syslog=True
rpc_backend=cinder.openstack.common.rpc.impl_kombu
rabbit_hosts=<rabbitmqのIP>
rabbit_password=stack
[BRCD_FABRIC_EXAMPLE]
[CISCO_FABRIC_EXAMPLE]
[database]
[fc-zone-manager]
[keymgr]
[keystone_authtoken]
auth_host=<keystoneのIP>
auth_port=35357
auth_protocol=http
admin_tenant_name=service
admin_user=cinder
admin_password=stack
signing_dir=/var/cache/cinder
cafile=
auth_uri=http://<keystoneのIP>:35357/v2.0
[matchmaker_redis]
[matchmaker_ring]
[profiler]
[ssl]

※CINDER_DRIVER(local.conf[localrc]に指定する環境変数)に何も指定しないと、defaultという値が入るが、devstack/lib/cinder_plugins/配下にdefaultというファイルはないため、driverの設定は行われない。

(29)Neutronのインストール

  (29−1)cd /opt/stack

$cd /opt/stack

  (29−2)git clone git://git.openstack.org/openstack/neutron.git stable/juno

$git clone git://git.openstack.org/openstack/neutron.git stable/juno

  (29−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (29−4)./update,py /opt/stack/neutron

$./update,py  /opt/stack/neutron

  (29−5)sudo pip install /opt/stack/neutron

$sudo pip install  /opt/stack/neutron  

   ※Devstackでは、ENABLE_SERVICESにryuとかmidonetとか指定すると、third_partyのインストール処理もここで実行される(Devstackでは対応遅れてる)

(30)Novaのインストール

  (30−1)ハイパーバイザーのインストール

    (30−1−1)libvirtqemu-kvmのインストール

$sudo apt-get install qemu-kvm,libvirt-bin,python-libvirt,python-guestfs

  (30−2)novncをclone

$git clone https://github.com/kanaka/noVNC.git

  (30−3)novaのソースを取得

$git clone git://git.openstack.org/openstack/nova.git stable/juno

  (30−4)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (30−5)./update.py /opt/stack/nova

$./update.py /opt/stack/nova

  (30−6)sudo pip install /opt/stack/nova

$sudo pip install /opt/stack/nova

  (30−7)sudo install -D -m 0644 -o <実行ユーザ> /opt/stack/nova/tools/nova-manage.bash_completion /etc/bash_completion.d/nova-manage.bash_completion

$sudo install -D -m 0644 -o <実行ユーザ> /opt/stack/nova/tools/nova-manage.bash_completion /etc/bash_completion.d/nova-manage.bash_completion

(31)Novaの以前の設定等があれば削除

  (31−1)iptablesの内容を削除

         # Delete rules
         sudo iptables -S -v | sed "s/-c [0-9]* [0-9]* //g" | grep "nova" | grep "\-A" |  sed "s/-A/-D/g" | awk '{print "sudo iptables",$0}' | bash
         # Delete nat rules
         sudo iptables -S -v -t nat | sed "s/-c [0-9]* [0-9]* //g" | grep "nova" |  grep "\-A" | sed "s/-A/-D/g" | awk '{print "sudo iptables -t nat",$0}' | bash
         # Delete chains
         sudo iptables -S -v | sed "s/-c [0-9]* [0-9]* //g" | grep "nova" | grep "\-N" |  sed "s/-N/-X/g" | awk '{print "sudo iptables",$0}' | bash
         # Delete nat chains
         sudo iptables -S -v -t nat | sed "s/-c [0-9]* [0-9]* //g" | grep "nova" |  grep "\-N" | sed "s/-N/-X/g" | awk '{print "sudo iptables -t nat",$0}' | bash

  (31−2)sudo virsh list --allをして、novaのprefixが付くvmを削除

$sudo virsh destroy 
$sudo virsh undefine --managed-save

  (31−3)ISCIセッションの削除

tgts=$(sudo iscsiadm --mode node | grep volume- | cut -d ' ' -f2)
for target in $tgts; do
  sudo iscsiadm --mode node -T $target --logout || true
done
sudo iscsiadm --mode node --op delete || true

  (31−4)過去のnovaで作ったvmのデータの削除

$sudo rm -fr /opt/stack/data/nova/instances/*

            (31−5)過去のnovaに関するデータのディレクトリやキャッシュの削除

$sudo rm -fr /opt/stack/data/nova
$sudo rm -fr /var/cache/nova     

(32)Novaの設定

  (32−1)sudo mkdir /etc/nova ; sudo chown <実行ユーザ> /etc/nova

$sudo mkdir /etc/nova
$sudo chown <実行ユーザ>  /etc/nova

  (32−2)policy.json を本番環境にコピー

$cp /opt/stack/nova/etc/policy.json /etc/nova

  (32−3)nova-api用の設定

    (32−3−1)api-paste.iniファイルを本番環境にコピー

$cp /opt/stack/nova/etc/api-paste.ini /etc/nova

     (32−4)nova-compute用の設定

    (32−4−1)ipフォワーディングを有効

$sudo sysctl -w net.ipv4.ip_forward=1

    (32−4−2)SELinuxが動いていたら、virt_use_execmem(ゲストOSの executable memory and executable_stack を有効にする) 組み込みルールをONにする

$sudo setsebool virt_use_execmem on

    (32−4−3)vmのデータを格納するディレクトリを作成、所有ユーザの変更

$mkdir -p /opt/stack/nova/instances
$sudo chown <実行ユーザ>  /opt/stack/nova/instances

→novaでvmを作成すると、vmごとにフォルダが作られ、instances/<vmごとに付けられる乱数>のディレクトリの中は下記のようになる

$ ls /opt/stack/nova/instances/kflksalfdjafdj
-rw-rw---- 1 libvirt-qemu kvm         18549 Nov 27 21:40 console.log
-rw-r--r-- 1 libvirt-qemu kvm      11010048 Nov 27 21:41 disk
-rw-rw-r-- 1 libvirt-qemu kvm        419840 Nov 27 19:25 disk.config
-rw-r--r-- 1 stack          libvirtd      176 Nov 27 19:25 disk.info
-rw-rw-r-- 1 stack          libvirtd     2697 Nov 27 19:25 libvirt.xml

  (32−5)nova.confの作成と編集

nova.conf

[DEFAULT]
verbose=True
debug=True
auth_strategy=keystone
use_syslog=True

#
allow_resize_to_same_host=True

api_paste_config=/etc/nova/api-paste.ini
rootwrap_config=/etc/nova/rootwrap.conf
scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler

dhcpbridge_flagfile=/etc/nova/nova.conf

force_dhcp_release=True
fixed_range=
default_floating_pool=public

#s3_host=
#s3_port=8080

osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions

my_ip=<実行するホストIP>

osapi_compute_workers=4
ec2_workers=4
metadata_workers=4

#neutron
#
network_api_class=nova.network.neutronv2.api.API
neutron_admin_username=neutron
neutron_admin_password=stack
neutron_admin_auth_url=http://<neutronの認証サーバのIP(普通はkeystone)>/v2.0
neutron_auth_strategy=keystone
neutron_admin_tenant_name=service
neutron_region_name=RegionOne
neutron_url=http://<neutron-ip>:9696
service_neutron_metadata_proxy=True

libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtGenericVIFDriver
linuxnet_interface_driver=
vif_plugging_is_fatal=True
vif_plugging_timeout=300

sql_connection=mysql://<user名>:<パスワード>@127.0.0.1/nova?charset=utf8

instance_name_template=instance-%08x

volume_api_class=nova.volume.cinder.API

state_path=/opt/stack/data/nova
lock_path=/opt/stack/data/nova

instances_path=/opt/stack/data/nova/instances

force_config_drive=always

logging_context_format_string="%(asctime)s.%(msecs)03d %(levelname)s %(name)s [%(request_id)s %(user_name)s %(project_name)s] %(instance)s%(message)s"

novncproxy_base_url=http://<novncproxyを動かしてるip>:6080/vnc_auto.html
xvpvncproxy_base_url=http://<xvpnvncproxyを動かしてるip>:6081/console

vnc_enabled=true
vncserver_listen=127.0.0.1
vncserver_proxyclien_address=127.0.0.1

ec2_dmz_host=<nova-api or nova-api-ec2を動かしてるサーバのIP>


rpc_backend=nova.openstack.common.rpc.impl_kombu
rabbit_hosts=<rabbitmqのIP>
rabbit_password=stack

glance_api_servers=<glanceのIP>:9292

use_usb_tablet=False
default_ephemeral_format=ext4
compute_driver=libvirt.LibvirtDriver

#firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver
firewall_driver=nova.virt.firewall.NoopFirewallDriver
security_group_api=neutron


[conductor]
workers=4


[osapi_v3]
enabled=True

[keystone_authtoken]
auth_host=<keystoneのIP>
auth_port=35357
auth_protocol=http

admin_tenant_name=service
admin_user=nova
admin_password=stack
signing_dir=/var/cache/nova

cafile=


[libvirt]
virt_type=qemu
cpu_mode=none
injection_partition=-2

[keymgr]
fixed_key = 962A3A8992C79BB4A2968AB28417F75D2D286FB16F2C537B26B8AE39CB1F6C92

  (32−6)nova-compute かつ hypervisorにlibvirtlibvirtのインターフェースを使ってHypervisorを操作する)を使用する場合の設定

    (32−6−1)Neutronのml2プラグイン or openvswitchプラグインでopenvswitch agentを使う場合、/etc/libvirt/qemu.confに下記の設定を追加または、編集

cgroup_device_acl = [
   "/dev/null", "/dev/full", "/dev/zero",
   "/dev/random", "/dev/urandom",
   "/dev/ptmx", "/dev/kvm", "/dev/kqemu",
   "/dev/rtc", "/dev/hpet","/dev/net/tun",
                                     ]

    (32−6−2)実行ユーザを libvirtdグループに追加

$sudo usermod -G libvirtd <実行ユーザ>

    (32−6−3)libvirtdを再起動

$sudo service libvirtd restart

(33)Horizonのインストール

  (33−0)djangoのuser認証モジュール(contrib.auth framework)のkeystoneを使うモジュールのインストール   (33−1)cd /opt/stack

$cd /opt/stack

  (33−2)git clone git://git.openstack.org/openstack/django_openstack_auth.git

$git clone git://git.openstack.org/openstack/django_openstack_auth.git

  (33−3)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (33−4)./update.py /opt/stack/django_openstack_auth

$./update.py /opt/stack/django_openstack_auth

  (33−5)sudo pip install /opt/stack/django_openstack_auth

$sudo pip install /opt/stack/django_openstack_auth

     (33−6)ApacheWSGIモジュールのインストール   (33−7)apache2 , libapache2-mod-wsgiをパッケージ管理ツールからインストール

$sudo apt-get install apache2 libapache2-mod-wsgi

  (33−8)wsgiモジュールを有効化

$a2enmod wsgi

   →実際は、/etc/apache2/mod-availablesの設定ファイルを、mod-enablesにシンボリックリンクを張る      (33−9)Horizonのソースを取得、インストール   (33−10)cd /opt/stack

$cd /opt/stack

  (33−11)git clone git://git.openstack.org/openstack/horizon.git stable/juno

$git clone git://git.openstack.org/openstack/horizon.git  stable/juno

  (33−12)cd /opt/stack/requirements

$cd /opt/stack/requirements

  (33−13)./update.py /opt/stack/horizon

$./update.py /opt/stack/horizon

  (33−14)sudo pip install /opt/stack/horizon

$sudo pip install /opt/stack/horizon

(34)rsyslogの設定

  (34−1)openstack用の設定ファイルの作成

$sudo touch /etc/rsyslog.d/90-stack-m.conf

  (34−2)90-stack-m.confを下記のように編集

90-stack-m.conf

$ModLoad imrelp
$InputRELPServerRun 516

  (34−3)rsyslogdを再起動

$sudo service rsyslog restart

(35)RabbitMQの設定

  (35−1)パスワードの変更

$rabbitmqctl  change_password guest <password>

  (36)Mysqlの設定

  (36−1)rootユーザのパスワード設定

$sudo mysqladmin -u root password <password>

  (36−2)すべてのホストからアクセスしてくるrootユーザにグローバルレベル('.')のすべて操作権限を与える

$sudo mysql -uroot -p<password> -h127.0.0.1 -e "GRANT ALL PRIVILEGES ON *.* TO '$DATABASE_USER'@'%'   identified by '$DATABASE_PASSWORD';"

  (36−3)/etc/mysql/my.cnfを作成、以下のように変更

     [mysqld]セクションに

       ・bind-address=0.0.0.0

       ・default-storage-engine=InnoDB

       を追記

  (36−4)sudo service mysql restart

$sudo service mysql restart

*devstackだとこのあたりで、screenの起動や設定を行う *devstackだとこのあたりで、起動した各プロセスが正常に動いているかどうかを管理するためのディレクトリ/opt/stack/statusを作成する *devstackだとこのあたりで、dstatの起動や設定を行う

Openstakコンポーネントの起動〜初期化処理〜

「ここから先は、tmuxなりscreenで各プロセスごとにwindowを用意することをおすすめします」

Keystone

(37)Keystoneの初期設定

  (37−1)DBの作成

$mysql
>DROP DATABASE IF EXISTS keystone
>CREATE DATABASE keystone CHARACTER SET utf8

  (37−2)DBのマイグレーション

$keystone-manage db_sync

     (37−3)PKIのセットアップ

$sudo rm -fr /etc/keystone/ssl
$keystone-manage pki_setup

  (37−4)authキャッシュ用のディレクトリ作成

$sudo mkdir -p /var/cache/keystone/auth
$sudo chown <実行ユーザ> /var/cache/keystone/auth

(38)Keystoneの起動

  (38−1)apache経由か単体で起動する場合かで、条件分岐

  (38−1[apache])apache経由で起動する場合は、apache用のコンフィグファイルをsite-enablesに設定し、apacheを再起動

  (38−1[単体])単体で受ける場合、keystone-allコマンドを実行

$keystone-all --config-file /etc/keystone/keystone.conf --debug

  (38−2)keystoneが動いてるか確認、curlでレスポンスが帰ってくるかどうか

$curl --noproxy '*' -k http://<ip>:35375/v2.0/

  (38−3)openstack client (python-openstack-client) を使うための環境変数を設定

       →servicetoken(設定ファイルで設定している)を用いて認証する。

$export OS_TOKEN=<keystone設定ファイルに記入した、service_token>
$export OS_URL=http://<ip>:5000/v2.0

  (38−4)openstack client を使い下記のような、テナント(プロジェクト)、ユーザ、ロールを作成

# Tenant               User       Roles
# ------------------------------------------------------------------
# --                       --             servic
# --                       --             ResellerAdmin
# --                       --             Member
# admin                admin      admin
# demo                 admin      admin
# demo                 demo       Member, anotherrole
# invisible_to_admin   demo       Member
# service               --             --

    (38−4−1) adminテナントの作成

$openstack project create  admin

    (38−4−2) adminテナントを主要テナントとするadminユーザを作成する

$openstack user create admin --project  <project-id(admin)> --email admin@example.com --password admin-password 

    (38−4−3) adminロールを作成

$openstack role create admin

    (38−4−4) adminユーザにadminテナントのadmin権限を与える

$openstack role add <role-id(admin)>  --project  <project-id(admin)> --user <user-id(admin)>

    (38−4−5) serviceテナントの作成、serviceロールを作成

        →各コンポーネントは、このserviceテナントのユーザ(role:admin)にならないといけない

$openstack project create service
$openstack role create service

    (38−4−6) ResellerAdminロールを作成

        → swiftの中のadminロールは、自分のテナントの管理しかできないが

        → ResellerAdminロールは、すべてのテナントの管理ができるため、Nova , Ceilometer等はこちらを使う

        → ResellerAdminロールの名前は、swiftswift-proxy.confで設定できる

$openstack role create ResellerAdmin

    (38−4−7)Memberロールを作成

        → SwiftとHorizonで使われるロール

$openstack role create Member

    (38−4−8)anotherroleロールを作成

        → 一般的な権限として使われるロールを作成

$openstack role create antherrole

    (38−4−9)invisible_to_adminテナントの作成

        → adminユーザが見ることのできないテナント

$openstack project create invisible_to_admin

    (38−4−10)demoテナントとdemoユーザを作成

$openstack project create demo
$openstack user create demo --project <project-id(demo)> --email demo@example.com --password <demo-pass>

    (38−4−11)demoユーザとadminユーザの権限の設定

$openstack role add --project <project-id(demo)> --user <user-id(demo)> <role-id(member)>
$openstack role add --project <project-id(demo)> --user <user-id(admin)> <role-id(admin)>
$openstack role add --project <project-id(demo)> --user <user-id(demo)> <role-id(another role)>
$openstack role add --project <project-id(invisible_to_admin)> --user <user-id(demo)> <role-id(Member)>

  (38−5)Keystoneコンポーネントのサービスカタログの登録、エンドポイントの登録 (38−5−1)サービスの登録

$openstack service create  keystone --type identity ---description "Keystone Identity Service"

    (38−5−2)エンドポイントの登録

$openstack endpoint create <service-id(keystone)> --region RegionOne 
    --publicurl http://<ip>:5000/v2.0
    --adminurl http://<ip>:35375/v2.0
    --internalurl http://<ip>:5000/v2.0

   →public_url:インターネット経由のアクセス(エンドユーザを想定)

   →admin_url:管理操作用のアクセス

   →internal_url:他のOpenStackコンポーネント用のLAN経由のアクセス

  (38−6)Novaコンポーネントのユーザ作成、サービスカタログの登録、エンドポイントの登録

    (38−6−1)novaユーザの作成、serviceテナントのadmin権限の付与

$openstack user create nova --password <password> --project <project-id(service)> --email nova@example.com 
$openstack add role <role-id(admin)> --project <project-id(service)> --user <user-id(nova)>

    (38−6−2)novaのサービスカタログの登録

$openstack service create nova --type=compute --description="Nova Compute Service"

    (38−6−3)novaのエンドポイントの登録

$openstack endpoint create <service-id(nova)> --region RegionOne 
   --publicurl  "http://<ip>:8774/v2/$(tenant_id)s"
   --adminurl  "http://<ip>:8774/v2/$(tenant_id)s"
   --internalurl  "http://<ip>:8774/v2/$(tenant_id)s"    

    (38−6−4)nova v3 API用のサービスの登録

$openstack service create novav3 --type=computev3 --description="Nova Compute Service V3"

    (38−6−5)nova v3 API用のエンドポイントの登録

$openstack endpoint create $NOVA_V3_SERVICE --region RegionOne 
   --publicurl "http://<ip>:8774/v3"
   --adminurl "http://<ip>:8774/v3"
   --internalurl  "http://<ip>:8774/v3"

    (38−6−6)EC2互換API用のサービスの登録

$openstack service create  ec2 --type ec2  --description "EC2 Compatibility Layer"

    (38−6−7)EC2互換API用のエンドポイントの登録

$openstack endpoint create ec2 --region RegionOne
   --publicurl  "http://<ip>:8773/services/Cloud"
   --adminurl  "http://<ip>:8773/services/Admin"
   --internalurl  "http://<ip>:8773/services/Cloud"

    (38−6−8)novaがswift経由でイメージをダウンロードする可能性がある場合(swiftが有効になっている場合)ResellerAdmin ロールを付与する必要がある

$openstack  add role <role-id(ResellerAdmin)>  --project <project-id(service)> --user <user-id(nova)>

  (38−7)Glanceコンポーネントのユーザ作成、サービスカタログの登録、エンドポイントの登録

    (38−7−1)glanceユーザの作成、serviceテナントのadmin権限の付与

$openstack user create glance --password <password>  --project <project-id(service) --email glance@example.com
$openstack  add role <role-id(admin)> --project <project-id(service)>  --user <user-id(glance) >

    (38−7−2)glanceのサービスカタログの登録

$openstack service create  --type image --description "Glance Image Service"  glance

    (38−7−3)glanceのエンドポイントの登録

$openstack endpoint create  glance --region RegionOne
   --publicurl  "http://<ip>:9292"
   --adminurl  "http://<ip>:9292"
   --internalurl  "http://<ip>:9292"

  (38−8)Cinderコンポーネントのユーザ作成、サービスカタログの登録、エンドポイントの登録

     (38−8−1)Cinderユーザの作成、serviceテナントのadmin権限の付与

$openstack user create cinder  --password <password> --project <project-id(service)> --email cinder@example.com
$openstack role add <role-id(admin)>  --project <project-id(service)>  --user <user-id(cinder)>

    (38−8−2)Cinder v1API用のサービスカタログを登録する

$openstack service create cinder --type  volume  --description="Cinder Volume Service" 

    (38−8−3)Cinder v1API用のエンドポイントを登録する

$openstack endpoint create <service-id(cinder)>  --region RegionOne
   --publicurl  http://<ip>:8776/v1/$(tenant_id)s
   --adminurl  http://<ip>:8776/v1/$(tenant_id)s
   --internalurl http://<ip>:8776/v1/$(tenant_id)s

    (38−8−4)Cinder v2API用のサービスカタログを登録する

$openstack  service create cinderv2  --type=volumev2 --description="Cinder Volume Serbvice V2"

    (38−8−5)Cinder v2API用のエンドポイントを登録する

$openstack endpoint create cinderv2 --region RegionOne
   --publicurl  http://<ip>:8776/v2/$(tenant_id)s
   --adminurl  http://<ip>:8776/v2/$(tenant_id)s
   --internalurl http://<ip>:8776/v2/$(tenant_id)s

  (38−9)Neutronコンポーネントのユーザ作成、サービスカタログの登録、エンドポイントの登録

    (38−9−1)Neutronユーザの作成、serviceテナントのadmin権限の付与

$openstack user create neutron --password <pass> --project <project-id(service)> --email neutron@example.com
$openstack role  add  <role-id(admin)> --project <project-id(service)> --user <user-id(neutron)>

    (38−9−2)Neutron API用のサービスカタログを登録

$openstack service create neutron --type=network  --description="Network Service"

    (38−9−3)Neutron API用のエンドポイントを登録する

$openstack endpoint  create  <service-id(neutron)>  --region RegionOne
   --publicurl  "http://<ip>:9696/"
   --adminurl  "http://<ip>:9696/"
   --internalurl "http://<ip>:9696/"

(39)Token-flow authの終了

  →各々のコンポーネントのユーザを作成したので、token認証をやめる。

$unset OS_TOKEN
$unset OS_URL

(40)password認証のための環境変数を設定

$export OS_AUTH_URL=http://<ip>:5000/v2.0
$export OS_TENANT_NAME=admin
$export OS_USERNAME=admin
$export OS_PASSWORD=<pass>
Horizon

(41)Horizonの初期設定

  (41−1)/opt/stack/horizon/openstack_dashboard/local/localsettings.py.exampleをlocalsettings.pyにリネーム

    →horizon GUIで有効にするタブ、設定などを定義する(ex, ロードバランサー、ファイヤーウォール)

  (41−2)localsettings.pyを自分の環境に合わせて、変更   
  (41−3)apacheがドキュメントルートとして使うディレクトリを作成する

$sudo mkdir -p /opt/stack/horizon/.blackhole

  (41−4) 000-defaultのサイトを無効にする

$sudo a2dissite 000-default

  (41−5)/etc/apache2/sites-available配下に、horizon.confを下記のように作成する

horizon.conf

<VirtualHost *:80>
    WSGIScriptAlias / /opt/stack/horizon/openstack_dashboard/wsgi/django.wsgi
    WSGIDaemonProcess horizon user=<実行ユーザ> group=<実行ユーザ> processes=3 threads=10 home=/opt/stack/horizon
    WSGIApplicationGroup %{GLOBAL}

    SetEnv APACHE_RUN_USER <実行ユーザ>
    SetEnv APACHE_RUN_GROUP <実行ユーザ>
    WSGIProcessGroup horizon

    DocumentRoot /opt/stack/horizon/.blackhole/
    Alias /media /opt/stack/horizon/openstack_dashboard/static

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /opt/stack/horizon/>
        Options Indexes FollowSymLinks MultiViews
        Require all granted
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog /var/log/apache2/horizon_error.log
    LogLevel warn
    CustomLog /var/log/apache2/horizon_access.log combined
</VirtualHost>

WSGISocketPrefix /var/run/apache2

(42)apacheを再起動して、horizonを有効にする

$sudo service apache start
Glance

(43)Glanceの初期設定

  (43−1)Glance イメージを格納するディレクトリを作成

$mkdir -p /opt/stack/data/glance/images

     (43−2)Glance イメージのローカルキャッシュディレクトリを作成

$mkdir -p /opt/stack/data/glance/cache

  (43−3)Glance用のDBを作成

$mysql
>DROP DATABASE IF EXISTS glance 
>CREATE DATABASE glance CHARACTER SET utf8

  (43−4)DBのマイグレーション

$glance-manage db_sync

  (43−5)cache用のディレクトリの作成

$sudo mkdir -p /var/cache/glance/api
$sudo chown <実行ユーザ> /var/cache/glance/api
$sudo mkdir -p /var/cache/glance/registry
$sudo chown <実行ユーザ> /var/cache/glance/registry
Neutron

(44)Neutronの初期設定

  (44−1)設定ファイル格納ディレクトリの作成、ownerの変更

$sudo mkdir /etc/neutron
$sudo chown <実行ユーザ> /etc/neutron

  (44−2)設定ファイルのひな形のコピー

$cp /opt/stack/neutron/etc/neutron.conf /etc/neutron

  (44−3)設定ファイルを下記のように編集

neutron.conf

[DEFAULT]
verbose = True
debug = True
policy_file = /etc/neutron/policy.json
allow_overlapping_ips = True
auth_strategy = keystone
notify_nova_on_port_status_change = True
norify_nova_on_port_data_change = True
nova_url = http://<nova-api>:8774/v2
nova_admin_username = nova
nova_admin_password = <nova-password>
nova_admin_tenant_id = <nova-admin-tenant-id>
nova_admin_auth_url = http://<nova-amin-api>:35357/v2.0
state_path = /opt/stack/data/neutron
rpc_backend = neutron.openstack.common.rpc.impl_kombu
rabbit_hosts = <rabbit-ip>
rabbit_password = <rabbit-password>
lock_path = $state_path/lock
core_plugin = ml2
service_plugins = neutron.services.l3_router.l3_router_plugin.L3RouterPlugin
[matchmaker_redis]
[matchmaker_ring]
[quotas]
[agent]
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
[keystone_authtoken]
auth_host = <keystone-ip>
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = neutron
admin_password = <neutron-pass>
signing_dir = /var/cache/neutron
[database]
[service_providers]
service_provider=LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
service_provider=VPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default

  (44−4)ml2プラグイン用の設定ファイルのひな形をコピー

$mkdir -p /etc/neutron/plugins/
$cp  /opt/stack/neutron/etc/neutron/plugins/ml2/ml2_conf.ini  /etc/neutron/plugins/

  (44−5)ml2_conf.iniを下記のように編集

ml2_conf.ini

[ml2]
mechanism_drivers=openvswitch,linuxbridge
type_drivers=local,flat,vlan,gre,vxlan
[ovs]
local_ip = <ip>
[database]
connection=mysql://<user>:<pass>@<ip>/neutron_ml2?charset=utf8
[ml2_type_flat]
[ml2_type_vlan]
[ml2_type_gre]
[ml2_type_vxlan]
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[agent]
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf

  (44−6)rootwrap設定

    (44−6−1)mkdir -p -m 755 /etc/neutron/rootwrap.d

$mkdir -p -m 755 /etc/neutron/rootwrap.d

    (44−6−2)cp -pr /opt/stack/neutron/etc/neutron/rootwrap.d/* /etc/neutron/rootwrap.d/

$cp -pr /opt/stack/neutron/etc/neutron/rootwrap.d/* /etc/neutron/rootwrap.d/

    (44−6−3)sudo chown -R root:root /etc/neutron/rootwrap.d

$sudo chown -R root:root /etc/neutron/rootwrap.d

    (44−6−4)sudo chmod 644 /etc/neutron/rootwrap.d/*

$sudo chmod 644 /etc/neutron/rootwrp.d/*

    (44−6−5)rootwrap.confのコピー

$cp -p /opt/stack/neutron/etc/neutron/rootwrap.conf /etc/neutron

    (44−6−6)rootwrap.confを下記のように追記

rootwrap.conf

filters_path = /etc/cinder/rootwrap.conf

    (44−6−7)sudo chown root:root /etc/neutron/rootwrap.conf

$sudo chown root:root /etc/neutron/rootwrap.conf

      (44−6−8)sudo chmod 0644 /etc/neutron/rootwrap.conf

$sudo chmod 0644 /etc/neutron/rootwrap.conf

    (44−6−9)/etc/sudoers.d/neutron-rootwrapを下記内容で作成

neutron-rootwrap

<実行ユーザ> ALL=(root) NOPASSWD: /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf *

  (44−7)neutron-l2agentとneutron-serverの共通初期化処理

    (44−7−1)api-paste.ini , policy.jsonをコピー

$cp /opt/stack/neutron/etc/api-paste.ini /etc/neutron/api-paste.ini
$cp /opt/stack/neutron/etc/policy.json /etc/neutron/policy.json

  (44−8)neutron-l2agentの初期化処理

    (44−8−1)neutron-ovs-cleanupを実行

$neutron-ovs-cleanup

    (44−8−2)br-intブリッジの作成

$sudo ovs-vsctl --no-wait -- --may-exist add-br br-int
    #→--no-wait:vswitchd からの応答を待たない(switchedが起動していないときに使わないとエラーで落ちる)
    #→ --may-exist :同じ名前のbridgeがいても、新しく作る(初期化される)
$sudo ovs-vsctl --no-wait br-set-external-id br-int bridge-id br-int

  (44−9)neutron-dhcpagentの初期化処理

    (44−9−1)設定ファイルのコピー

$cp  /opt/stack/neutron/etc/dhcp_agent.ini  /etc/neutron/dhcp_agent.ini

    (44−9−2)dhcp_agent.iniを下記のように編集

[DEFAULT]
verbose = True
debug = True
use_namespaces = True
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
ovs_use_veth = False
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_agent_manager = neutron.agent.dhcp_agent.DhcpAgentWithStateReport

  (44−10)neutronl3-agentの初期化処理

    (44−10−1)設定ファイルのコピー

$cp  /opt/stack/neutron/etc/l3_agent.ini  /etc/l3_agent.ini

    (44−10−2)l3_agent.iniを下記のように編集

[DEFAULT]
verbose = True
debug = True
use_namespaces = True
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
ovs_use_veth = False
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
external_network_bridge = br-ex
l3_agent_manager = neutron.agent.l3_agent.L3NATAgentWithStateReport

    (44−10−3)$neutron-ovs-cleanupを実行

    (44−10−4)br-exブリッジを作成

$sudo ovs-vsctl --no-wait --may-exist add-br br-ex
$sudo ovs-vsctl br-set-external-id br-ex bridge-id br-ex

       (44−10−5)br-exに割り当てられたIPを削除

$sudo ip addr flush dev br-ex

  (44−11)neutron-metaagentの初期化処理

    (44−11−1)設定ファイルコピー

$cp  /opt/stack/neutron/etc/metadata_agent.ini /etc/neutron/metadata_agent.ini

    (44−11−2)metadata_agent.iniの設定を下記のように変更する

[DEFAULT]
verbose = True
debug = True
nova_metadata_ip = <nova-ip>
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
auth_host = <keystone-ip>
auth_port = 35375
auth_protocol = http
admin_tenant_name = service
admin_user =  neutron
admin_password = <password>

    (44−11−3)cache用のディレクトリの作成

$sudo mkdir -p /var/cache/neutron

  (44−12)neutron-debug-command用の初期化処理

    (44−12−1)設定ファイルをコピー

$cp /opt/stack/neutron/etc/l3_agent.ini  /etc/neutron/debug.ini

    (44−12−2) 下記のように、設定ファイルを変更

debug.ini

[DEFAULT]
verbose = False
debug = False
use_namespaces = True
ovs_use_veth = False
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
external_network_bridge = br-ex
[agent]
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf

  (44−13)neutron用のDBの作成

$mysql
>DROP DATABASE IF EXISTS neutron
>CREATE DATABASE neutron CHARACTER SET utf8

  (44−14)DBのマイグレーション

$neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2_plugin.ini upgrade head

(45)neutron-dhcpagent用の初期化

  (45−1)NetworkManagerから実行されたdnsmasq以外のdnsmasqプロセスをkill

pidof NetworkManagerの出力がなにもなければ、「$sudo killall dnsmasq」

  (45−2)iptablesのエントリを削除(clean_iptables in lib/nova)

# Delete rules
$sudo iptables -S -v | sed "s/-c [0-9]* [0-9]* //g" | grep "nova" | grep "\-A" |  sed "s/-A/-D/g" | awk '{print "sudo iptables",$0}' | bash

# Delete nat rules
$sudo iptables -S -v -t nat | sed "s/-c [0-9]* [0-9]* //g" | grep "nova" |  grep "\-A" | sed "s/-A/-D/g" | awk '{print "sudo iptables -t nat",$0}' | bash

# Delete chains
$sudo iptables -S -v | sed "s/-c [0-9]* [0-9]* //g" | grep "nova" | grep "\-N" |  sed "s/-N/-X/g" | awk '{print "sudo iptables",$0}' | bash

# Delete nat chains
$sudo iptables -S -v -t nat | sed "s/-c [0-9]* [0-9]* //g" | grep "nova" |  grep "\-N" | sed "s/-N/-X/g" | awk '{print "sudo iptables -t nat",$0}' | bash

  (45−3)ホストOSのIPフォワーディングを有効にする

$sudo sysctl -w net.ipv4.ip_forward=1
Volume Service

(46)Cinderの初期設定

  (46−1)Cinder用のDBの作成

$mysql
>DROP DATABASE IF EXISTS cinder
>CREATE DATABASE cinder CHARACTER SET utf8

  (46−2)DBのマイグレーション

$cinder-manage db_sync

  (46−3)Cinder用ボリュームグループの作成

     (46−3−1)ボリュームグループのフィジカルボリュームにするための、イメージを作成

$truncate -s 20000 /opt/stack/data/cinder/stack-image-backing-file

     (46−3−2)ループバックでバイスとimageファイルの結びつけ

$sudo losetup -f  --show  /opt/stack/data/cinder/stack-image-backing-file

     (46−3−3)ボリュームグループの作成

$sudo vgcreate  stack-volume <ループバックデバイス(例:/dev/loop0)>

     (46−3−4)tgtで後で使用するディレクトリの作成

$sudo mkdir -p /opt/stack/data/cinder/volumes

  (46−4)iscsiターゲットを削除

$sudo tgtadm --op show --mode target #→iscsiターゲットの確認
$sudo tgt-admin --delete <tgt-id>   #→iscsiターゲットを削除

  (46−5)もし、論理ボリュームが残っていたら削除

  (46−6)キャッシュ用ディレクトリを作成

$sudo mkdir  /var/cache/cinder/
$sudo chown <実行ユーザ> /var/cache/cinder
Nova

(47)Novaの初期設定

  (47−1)Nova用のDBの作成

$mysql
>DROP DATABASE  IF EXISTS nova
>CREATE DATABASE CHARACTER SET latin1  #=>なぜlatin1?

  (47−2)DBのマイグレーション

$nova-manage db_sync

  (47−3)キャッシュ用のディレクトリの作成

$sudo mkdir -p  /var/cache/nova
$sudo chown <実行ユーザ>  /var/cache/nova

  (47−4)キーペアを保存するディレクトリの作成

$sudo mkdir -p /opt/stack/data/nova/keys
$sudo chown -R <実行ユーザ>  /opt/stack/data/nova

  ※Devstackだとこのあたりで、neutronを使うためにnovaの設定ファイルを編集する(novaのセキュリティグループの無効化とか)

Openstakコンポーネントの起動〜起動〜

Glance

(48)glance-registryの起動

$glance-registry  --config-file /etc/glance/glance-registry.conf

(49)glance-apiの起動

$glance-api  --config-file /etc/glance/glance-api.conf

(50)glanceにイメージの登録(ここは、なんでもいいのでイメージを登録)

  (50−1) tokenの取得

$keystone token-get

  (50−2)イメージの登録(イメージは適当にさがしてください)

$glance --os-auth-token <token> --os-image-url http://<ip>:9292 image-create --name "test" --is-public True --disk-format=qcow2  --copy-from "<imageのurl>"
Nova

(51)nova-apiの起動

$nova-api
Neuron

(52)neutron-serverの起動

$neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2_plugin.ini

(53)neutron-l2-agentの起動(neutron-openvswitch-agent)

$neutron-openvswitch-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2_plugin.ini

(54)neutron-dhcp-agentの起動

$neutron-dhcp-agent --config-file /etc/neutron/neutron.conf  --config-file /etc/neutron/dhcp_agent.ini

(55)neutron-l3-agentの起動

$neutron-l3-agent --config-file /etc/neutron/neutron.conf  --config-file /etc/neutron/l3_plugin.ini

(56)neutron-metadata-agentの起動

$neutron-metadata-agent  --config-file /etc/neutron/neutron.conf  --config-file /etc/neutron/metadata_agent.ini

(57)初期ネットワークの作成(demoテナントのネットワークとか)

  (57−1)デモテナントのプライベートネットワーク作成

$openstack project list #→demoテナントのidをメモ
$neutron net-create --tenant-id <tenant-id(demo)> "private"

  (57−2)デモテナントのプライベートサブネットの作成

$neutron subnet-create --tenant-id <tenant-id(demo)>  --ip_version 4 --gateway 192.168.0.1 --name "private-subnet" <net-id(57-1で作ったやつ)> "192.168.0.0/24"

  (57−3)デモテナントのルータの作成

$neutron router-create --tenant-id <tenant-id(demo)>

  (57−4)デモテナントのルータを"private-subnet"サブネットに接続

$neutron router-interface-add <router-id(57-3で作ったやつ)> <subnet-id(57-2で作ったやつ)>

  (57−5)外部ネットワークの作成

$neutron net-create "public"  --router:external=True

  (57−6)外部ネットワークのサブネットの作成

$neutron subnet-create --ip_version 4 --gateway 172.16.0.1 --name "public-subnet" <net-id(57-5で作ったやつ)> "172.16.0.0/24"  --enable_dhcp=False

  (57−7)デモテナントのルータを外部ネットワークにつなぐ

 $neutron router-gateway-set  <router-id(57-3で作ったやつ)> <net-id(57-7で作ったやつ)>

  (57−8)ホストのbr-exインターフェースに57-6のgatewayに指定したipアドレスを設定

 $sudo ip addr add  172.16.0.1/24 dev br-ex

  (57−9)br-exインターフェースをアップ

 $sudo ip link set br-ex up

  (57−10)デモテナントのprivateネットワークへのrouteをホストに追加

 $sudo route add -net 192.168.0.0/24 gw 172.16.0.1
Nova

(58)nova-computeの起動

$sg libvirtd nova-compute --config-file /etc/nova/nova.conf

  (59)nova-conductorの起動

$nova-conductor --config-file /etc/nova/nova.conf

(60)nova-schedulerの起動

$nova-scheduler --config-file /etc/nova/nova.conf

(61)nova-novncproxyの起動

$nova-novncproxy --config-file /etc/nova/nova.conf --web /opt/stack/noVNC

(62)nova-xvpvncproxyの起動

$nova-xvpvncproxy --config-file /etc/nova/nova.conf

(63)nova-consoleauthの起動

$nova-consoleauth  --config-file /etc/nova/nova.conf
Cinder

(64)/opt/stack/data/cinder/volumesのシンボリックリンクを/etc/tgt/stack.dに置く

$sudo ln -sf  /opt/stack/data/cinder/volumes  /etc/tgt/stack.d

(65)tgt用の設定ファイルを作成

$echo "include /etc/tgt/stack.d/*" | sudo tee -a /etc/tgt/targets.conf

(66)tgtサービスの再起動

$sudo service tgt restart

(67)tgtの設定

$sudo tgtadm --mode system --op update --name debug --value on

(68)cinder-apiの起動

$cinder-api --config-file /etc/cinder/cinder.conf

(69)cinder-schedulerの起動

$cinder-scheduler --config-file /etc/cinder/cinder.conf

(70)cinder-backupの起動

$cinder-backup --config-file /etc/cinder/cinder.conf

(71)cinder-volumeの起動

$cinder-volume --config-file  /etc/cinder/cinder.conf

おめでとうございます。ここまで無事たどりついたらOpenstackが動いているはずです。