天天看點

devstack安裝腳本結構及stack.sh簡介 1 devstack安裝 2 devstack目錄結構3 stack.sh腳本結構 stack.sh 簡介 Sanity Check 

1 devstack安裝

1 選擇linux版本及安裝 可靠版本有 Ubuntu 14.04。 使用 最小安裝(minimal install)。 2 下載下傳devstack git clone https://git.openstack.org/openstack-dev/devstack

3 最少配置項的local.conf

  1. [email protected]:~/devstack$ cat local.conf

    [[local|localrc]]

    #HOST_IP=10.1.1.1

    #SERVICE_HOST=10.1.1.1

    #FLAT_INTERFACE=eth1

    #FIXED_RANGE=192.168.12.0/24

    #NETWORK_GATEWAY=192.168.12.1

    #PUBLIC_NETWORK_GATEWAY=10.1.1.1

    #FIXED_NETWORK_SIZE=256

    #FLOATING_RANGE=10.1.1.0/25

    #MULTI_HOST=1

    LOGFILE=/tmp/stack.sh.log

    ADMIN_PASSWORD=123456

    MYSQL_PASSWORD=123456

    RABBIT_PASSWORD=123456

    SERVICE_PASSWORD=123456

    SERVICE_TOKEN=openstack_kcinakei189kc83jn8nc8j30xjs82mc0gne734bc0a

    #OFFLINE=True

    #RECLONE=False

    #GLANCE_BRANCH=stable/icehouse

    #HORIZON_BRANCH=stable/icehouse

    #KEYSTONE_BRANCH=stable/icehouse

    #NOVA_BRANCH=stable/icehouse

    #GLANCE_BRANCH=stable/icehouse

    #NEUTRON_BRANCH=stable/icehouse

    #RPC

    #ENABLED_SERVICES="$ENABLED_SERVICES,rabbit,-qpid,-zeromq"

    # CEILOMETER

    #enable_service ceilometer-acompute ceilometer-acentral ceilometer-anotification ceilometer-collector ceilometer-api

    #enable_service ceilometer-alarm-notifier ceilometer-alarm-evaluator

    #CEILOMETER_BACKEND=mongodb

    # NEUTRON

    #disable_service n-net

    #enable_service q-svc,q-agt,q-dhcp,q-l3,q-meta,q-metering,neutron,q-lbaas,q-fwaas

    #enable_service tempest

4 開始安裝

cd devstack; ./stack.sh

5 安裝完成

Horizon is now available at http://192.168.128.8/

Keystone is serving at http://192.168.128.8:5000/v2.0/

Examples on using novaclient command line is in exercise.sh

The default users are: admin and demo

The password: 123456

This is your host ip: 192.168.128.8

2 devstack目錄結構

Scripts Generated documentation of DevStack scripts.

stack.sh

functions

functions-common

lib/apache

lib/baremetal

lib/ceilometer

lib/cinder

lib/config

lib/database

lib/glance

lib/heat

lib/horizon

lib/infra

lib/ironic

lib/keystone

lib/ldap

lib/zaqar

lib/neutron

lib/nova

lib/oslo

lib/rpc_backend

lib/sahara

lib/savanna

lib/stackforge

lib/swift

lib/tempest

lib/tls

lib/trove

unstack.sh

clean.sh

run_tests.sh

extras.d/50-ironic.sh

extras.d/70-zaqar.sh

extras.d/70-sahara.sh

extras.d/70-savanna.sh

extras.d/70-trove.sh

extras.d/80-opendaylight.sh

extras.d/80-tempest.sh

Configuration Setting the table

local.conf

stackrc

openrc

exerciserc

eucarc

Tools Support scripts

Filename Link

tools/info.sh

tools/build_docs.sh

tools/create_userrc.sh

tools/fixup_stuff.sh

tools/install_prereqs.sh

tools/install_pip.sh

tools/upload_image.sh

Samples Generated documentation of DevStack sample files.

local.sh

localrc

Exercises Generated documentation of DevStack scripts.

exercise.sh

exercises/aggregates.sh

exercises/boot_from_volume.sh

exercises/bundle.sh

exercises/client-args.sh

exercises/client-env.sh

exercises/euca.sh

exercises/floating_ips.sh

exercises/horizon.sh

exercises/neutron-adv-test.sh

exercises/sahara.sh

exercises/savanna.sh

exercises/sec_groups.sh

exercises/swift.sh

exercises/trove.sh

exercises/volumes.sh

exercises/zaqar.sh

3 stack.sh腳本結構

  1. Sanity Checks

    Prepare the environment

        |->functions

           ->functions-common

        |->lib/config

    Global Settings

    # Phase: local

        |->stackrc

           ->local.conf

    Local Settings

    Configure sudo

    Configure Distro Repositories

    Configure Target Directories

    Common Configuration

        |->lib/database

        |->lib/rpc_backend

    Configure Projects

        |->lib/apache

        |->lib/tls

        |->lib/infra

        |->lib/oslo

        |->lib/stackforge

        |->lib/horizon

        |->lib/keystone

        |->lib/glance

        |->lib/nova

        |->lib/cinder

        |->lib/swift

        |->lib/ceilometer

        |->lib/heat

        |->lib/neutron

        |->lib/baremetal

        |->lib/ldap

        |->lib/dstat

    Extras Source

    # Phase: source

    Interactive Configuration

    Configure logging

    Set Up Script Execution

    Install Packages

    Extras Pre-install

    # Phase: pre-install

    Check Out and Install Source

    Extras Install

    # Phase: install

    Syslog

    Finalize queue installation

    Export Certicate Authority Bundle

    Configure database

    Configure screen

    Start Services

        Keystone

        Horizon

        Glance

        Neutron

        Nova

        Storage Service

        Volume Service

        Compute Service

    Extras Configuration

    # Phase: post-config

    Local Configuration

    # Phase: post-config

    Launch Services

    Install Images

    Create account rc files

    Run extras

    # Phase: extra

    Fin

參考:http://www.verydemo.com/demo_c288_i74960.html

stack.sh 簡介

stack.sh是一個openstack開發人員可以選擇的一種安裝腳本。

這個腳本的主要作用是安裝并配置nova, glance, horizon, 以及keystone。

使用這個腳本,你可以設定一些配置選項,比如使用哪個git源,開啟哪些服務,網絡如何配置,以及各種密碼的設定與管理。通過這個腳本,也可以靈活地在多台機器上運作,通過一個類似的資源進行一種共享式的配置。比如mysql, rabbitmq,進而可以組建一個多機環境下的雲。

為了保證這個腳本足夠簡單,我們假設你是在一個Ubuntu 11.10 Oneiric的機器上執行。當然,這個腳本也可以在VM上運作,或是在實體機上運作。此外,我們把一些apt, pip安裝包放到别的檔案中去了,那麼開始了解這個腳本,以及這些依賴的包。

如果你想進一步的學習或了解,可以去網站

http://devstack.org

Sanity Check 

這個 腳本 首先來說是針對于Oneiric來寫的,如果要在Ubuntu的其他版本上執行,當然也可以通過執行指令

[cpp] view plaincopy

  1. $FORCE=yes ./stack.sh  

,進而達到要求。但是我個人而言,不建議采用這種方式進來安裝部署。在其他版本上的安裝部署,後面再補上。

版本檢查

下面這段代碼就是主要是在檢查一下OS的版本。

# DISTRO變量就是拿到OS的版本。在Ubuntu上執行,會得到發行版的名字。oneiric。

# 接下來的幾句隻是在進行檢查是否是oneiric版本的Ubuntu

[cpp] view plaincopy

  1. DISTRO=$(lsb_release -c -s)  
  2. if [[ ! ${DISTRO} =~ (oneiric) ]]; then  
  3.     echo "WARNING: this script has only been tested on oneiric"  
  4.     if [[ "$FORCE" != "yes" ]]; then  
  5.         echo "If you wish to run this script anyway run with FORCE=yes"  
  6.         exit 1  
  7.     fi  
  8. fi  

目錄設定

stack.sh把很多需要安裝的包與其他一些依賴都放到别的檔案裡面的,你可以在/devstack/files中找到這些檔案。但是在腳本中,我們是通過FILES變量來引用到這些配置檔案的位置。

#首先是拿到頂級目錄所在位置。比如/root/devstack,那麼$TOP_DIR="/root/devstack"

#生成FILES變量的值。再去檢查一下這個目錄是否存在。

[cpp] view plaincopy

  1. TOP_DIR=$(cd $(dirname "$0") && pwd)  
  2. FILES=$TOP_DIR/files  
  3. if [ ! -d $FILES ]; then  
  4.     echo "ERROR: missing devstack/files - did you grab more than just stack.sh?"  
  5.     exit 1  
  6. fi   

設定

這個腳本的可定制性展現在,一些環境變量可以放到别的檔案中,或者是通過設定環境變量來進行處理。比如

[cpp] view plaincopy

  1. $export MYSQL_PASSWORD=anothersecret  
  2. $./stack.sh  

可以達到效果。當然,你也可以把這些語句放在同一行,比如

[cpp] view plaincopy

  1. $MYSQL_PASSWORD=simple ./stack.sh  

也可以把這些設定放到$TOP_DIR/localrc檔案中。

比如:

[cpp] view plaincopy

  1. $ cat $TOP_DIR/localrc  
  2. .........  
  3. MYSQL_PASSWORD=anothersecret  
  4. MYSQL_USER=hellaroot  

一般來說,我們都使用的是一些很敏感的設定,是以為了省事,你也可以運作

[cpp] view plaincopy

  1. $./stack.sh  

(一般而言,如果這樣運作, 腳本 會在發現沒有密碼的時候,叫你輸出密碼,如果輸入密碼為空,那麼會随機生成一個密碼)。

環境變量

對于環境變量而言,一般我們都是放到stackrc檔案中。這個檔案是随着devstack一起釋出的,并且主要是包含了需要使用的git源。如果你想要使用别的源,或者是别的分枝,那麼你可以加入你自己的設定,并把這些設定寫到localrc檔案中。

一般而言localrc裡面的設定會把stackrc檔案中的變量給覆寫掉。這個是很有用的,特别是當你想使用别的源或者分枝的時候。你也可以更改掉一些已有設定,比如

[cpp] view plaincopy

  1. MYSQL_PASSWORD  
  2. ADMIN_PASSWORD  

否則devstack腳本會給你随機生成一個(這個随機生成的密碼還有點長)。

#首先是從stackrc中引入環境變量

#$DEST變量是指的是安裝目錄,一般預設安裝目錄是/opt/stack

#下面是定義了一個函數,其實也就是使用apt-get指令。

[cpp] view plaincopy

  1. source ./stackrc  
  2. DEST=${DEST:-/opt/stack}  
  3. function apt_get() {  
  4.     [[ "$OFFLINE" = "True" ]] && return  
  5.     local sudo="sudo"  
  6.     [ "$(id -u)" = "0" ] && sudo="env"  
  7.     $sudo DEBIAN_FRONTEND=noninteractive apt-get \  
  8.         --option "Dpkg::Options::=--force-confold" --assume-yes "$@"  
  9. }  

這裡檢查是否已經有stack.sh程式在運作。

[cpp] view plaincopy

  1. if screen -ls | egrep -q "[0-9].stack"; then  
  2.     echo "You are already running a stack.sh session."  
  3.     echo "To rejoin this session type 'screen -x stack'."  
  4.     echo "To destroy this session, kill the running screen."  
  5.     exit 1  
  6. fi  

因為Openstack在設計的時候,是用的一般使用者來運作的,主要原因是因為dashboard在運作的時候底層使用的是apache2的伺服器,而apache2不可以在root權限下執行。

如果在運作腳本的時候是使用的是root權限,那麼會自動建立一個stack使用者來執行操作。并且這個使用者會給足夠的權限來進行很多操作

[cpp] view plaincopy

  1. if [[ $EUID -eq 0 ]]; then  
  2.     ROOTSLEEP=${ROOTSLEEP:-10}  
  3.     echo "You are running this script as root."  
  4.     echo "In $ROOTSLEEP seconds, we will create a user 'stack' and run as that user"  
  5.     sleep $ROOTSLEEP  
  6.     # 因為這個腳本接下來是按照一個普通使用者來執行的,那麼需要給這個普通使用者以sudo的權限。  
  7.     #   
  8.     dpkg -l sudo || apt_get update && apt_get install sudo  
  9.     if ! getent passwd stack >/dev/null; then  
  10.         echo "Creating a user called stack"  
  11.         useradd -U -G sudo -s /bin/bash -d $DEST -m stack  
  12.     fi  
  13.     echo "Giving stack user passwordless sudo priviledges"  
  14.     # some uec images sudoers does not have a '#includedir'. add one.  
  15.     grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers ||  
  16.         echo "#includedir /etc/sudoers.d" >> /etc/sudoers  
  17.     ( umask 226 && echo "stack ALL=(ALL) NOPASSWD:ALL" \  
  18.         > /etc/sudoers.d/50_stack_sh )  
  19.     echo "Copying files to stack user"  
  20.     STACK_DIR="$DEST/${PWD##*/}"  
  21.     cp -r -f -T "$PWD" "$STACK_DIR"  #這裡在拷檔案,額外的拷檔案的動作也可以加在這裡。  
  22.     chown -R stack "$STACK_DIR"  
  23.     if [[ "$SHELL_AFTER_RUN" != "no" ]]; then  
  24.         exec su -c "set -e; cd $STACK_DIR; bash stack.sh; bash" stack  
  25.     else  
  26.         exec su -c "set -e; cd $STACK_DIR; bash stack.sh" stack  
  27.     fi  
  28.     exit 1  
  29. else  
  30.     # Our user needs passwordless priviledges for certain commands which nova  
  31.     # uses internally.  
  32.     # Natty uec images sudoers does not have a '#includedir'. add one.  
  33.     sudo grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers ||  
  34.         echo "#includedir /etc/sudoers.d" | sudo tee -a /etc/sudoers  
  35.     TEMPFILE=`mktemp`  
  36.     cat $FILES/sudo/nova > $TEMPFILE  
  37.     sed -e "s,%USER%,$USER,g" -i $TEMPFILE  
  38.     chmod 0440 $TEMPFILE  
  39.     sudo chown root:root $TEMPFILE  
  40.     sudo mv $TEMPFILE /etc/sudoers.d/stack_sh_nova  
  41. fi  

接下來這個就是設定是否是用離線的方式來進行安裝,或者是用上網的方式來進行安裝。

[cpp] view plaincopy

  1. function trueorfalse() {  
  2.     local default=$1  
  3.     local testval=$2  
  4.     [[ -z "$testval" ]] && { echo "$default"; return; }  
  5.     [[ "0 no false False FALSE" =~ "$testval" ]] && { echo "False"; return; }  
  6.     [[ "1 yes true True TRUE" =~ "$testval" ]] && { echo "True"; return; }  
  7.     echo "$default"  
  8. }  
  9. OFFLINE=`trueorfalse False $OFFLINE`   

一般來說, 安裝 方式都是線上的方式來 安裝 的。如果設定的值是True,那麼就是使用離線的方式來進行 安裝 。

配置服務

接下來是設定一些環境變量:這些環境變量主要都是為了安裝某個部件而設定的。

[cpp] view plaincopy

  1. NOVA_DIR=$DEST/nova  
  2. HORIZON_DIR=$DEST/horizon  
  3. GLANCE_DIR=$DEST/glance  
  4. KEYSTONE_DIR=$DEST/keystone  
  5. NOVACLIENT_DIR=$DEST/python-novaclient  
  6. OPENSTACKX_DIR=$DEST/openstackx  
  7. NOVNC_DIR=$DEST/noVNC  
  8. SWIFT_DIR=$DEST/swift  
  9. SWIFT_KEYSTONE_DIR=$DEST/swift-keystone2  
  10. QUANTUM_DIR=$DEST/quantum  

下面的設定是為了Quantum而進行設定。

[cpp] view plaincopy

  1. # Default Quantum Plugin  #看樣子這個應該是一個網絡服務  
  2. Q_PLUGIN=${Q_PLUGIN:-openvswitch}  
  3. # Default Quantum Port  #這裡設定端口  
  4. Q_PORT=${Q_PORT:-9696}  
  5. # Default Quantum Host  #這裡設定主機  
  6. Q_HOST=${Q_HOST:-localhost}  

接下來設定哪些服務要開啟。注意這裡用到的都是縮寫。

[cpp] view plaincopy

  1. ENABLED_SERVICES=${ENABLED_SERVICES:-g-api,g-reg,key,n-api,n-cpu,n-net,n-sch,n-vnc,horizon,mysql,rabbit,openstackx}  

下面是設定volume服務

[cpp] view plaincopy

  1. # Name of the lvm volume group to use/create for iscsi volumes  
  2. VOLUME_GROUP=${VOLUME_GROUP:-nova-volumes}  
  3. VOLUME_NAME_PREFIX=${VOLUME_NAME_PREFIX:-volume-}  
  4. INSTANCE_NAME_PREFIX=${INSTANCE_NAME_PREFIX:-instance-}  

接下來是設定需要使用到的底層的服務

[cpp] view plaincopy

  1. VIRT_DRIVER=${VIRT_DRIVER:-libvirt}  
  2. LIBVIRT_TYPE=${LIBVIRT_TYPE:-kvm}  

一般而言我們都是使用kvm+libvirt。如果kvm沒有驅動起來,我們會使用qemu。

設定要使用到的Scheduler

[cpp] view plaincopy

  1. SCHEDULER=${SCHEDULER:-nova.scheduler.simple.SimpleScheduler}  

接下來是拿到主機IP位址。

[cpp] view plaincopy

  1. if [ ! -n "$HOST_IP" ]; then  
  2.     HOST_IP=`LC_ALL=C /sbin/ifconfig eth0 | grep -m 1 'inet addr:'| cut -d: -f2 | awk '{print $1}'`  
  3.     if [ "$HOST_IP" = "" ]; then  
  4.         echo "Could not determine host ip address."  
  5.         echo "If this is not your first run of stack.sh, it is "  
  6.         echo "possible that nova moved your eth0 ip address to the FLAT_NETWORK_BRIDGE."  
  7.         echo "Please specify your HOST_IP in your localrc."  
  8.         exit 1  
  9.     fi  
  10. fi  

這裡是設定一下是否使用系統日志:

[cpp] view plaincopy

  1. SYSLOG=`trueorfalse False $SYSLOG`  
  2. SYSLOG_HOST=${SYSLOG_HOST:-$HOST_IP}  
  3. SYSLOG_PORT=${SYSLOG_PORT:-516}  

服務逾時設定

[cpp] view plaincopy

  1. SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}  

接下這個函數就是為了讀取密碼而寫的。

[cpp] view plaincopy

  1. function read_password {  
  2.     set +o xtrace  
  3.     var=$1; msg=$2  
  4.     pw=${!var}  
  5.     localrc=$TOP_DIR/localrc  
  6.     # If the password is not defined yet, proceed to prompt user for a password.  
  7.     if [ ! $pw ]; then  
  8.         # If there is no localrc file, create one  
  9.         if [ ! -e $localrc ]; then  
  10.             touch $localrc  
  11.         fi  
  12.         # Presumably if we got this far it can only be that our localrc is missing  
  13.         # the required password.  Prompt user for a password and write to localrc.  
  14.         echo ''  
  15.         echo '################################################################################'  
  16.         echo $msg  
  17.         echo '################################################################################'  
  18.         echo "This value will be written to your localrc file so you don't have to enter it again."  
  19.         echo "It is probably best to avoid spaces and weird characters."  
  20.         echo "If you leave this blank, a random default value will be used."  
  21.         echo "Enter a password now:"  
  22.         read -e $var  
  23.         pw=${!var}  
  24.         if [ ! $pw ]; then  
  25.             pw=`openssl rand -hex 10`  
  26.         fi  
  27.         eval "$var=$pw"  
  28.         echo "$var=$pw" >> $localrc  
  29.     fi  
  30.     set -o xtrace  
  31. }  

你如果想設定成為一個固定的密碼,那麼這裡可以改為如下:

[cpp] view plaincopy

  1. # Presumably if we got this far it can only be that our localrc is missing  
  2. # the required password.  Prompt user for a password and write to localrc.  
  3. echo "Set password to nova:"  
  4. pw="nova"  
  5. eval "$var=$pw"  
  6. echo "$var=$pw" >> $localrc  

為了簡單起見,後面會一直使用nova做為密碼。(自己 安裝 着玩的時候這麼幹比較好,如果正式用的話,還是用一個靠譜的密碼吧。)

設定網絡:這些設定應該最後都會寫到/etc/nova/nova.conf檔案中的。不過這裡好像是放在安裝目錄中。

[cpp] view plaincopy

  1. PUBLIC_INTERalt"> FIXED_NETWORK_SIZE=${FIXED_NETWORK_SIZE:-256}  
  2. FLOATING_RANGE=${FLOATING_RANGE:-172.24.4.224/28}  
  3. NET_MAN=${NET_MAN:-FlatDHCPManager}  
  4. EC2_DMZ_HOST=${EC2_DMZ_HOST:-$HOST_IP}  
  5. FLAT_NETWORK_BRIDGE=${FLAT_NETWORK_BRIDGE:-br100}  
  6. VLAN_INTERFACE=${VLAN_INTERFACE:-$PUBLIC_INTERFACE}  

下面是設定是否使用多節點模式,如果使用多節點模式,那麼每個計算節點都會與網絡節點都是一體的,通路相應的VM的時候,直接通路相應的實體機則可。

這種模式可以解除SPOF和帶寬的制約。

[cpp] view plaincopy

  1. MULTI_HOST=${MULTI_HOST:-False}  

下面一段話比較長,不過也可以看一下:

如果你是在多台實體機上使用FlatDHCP模式,設定"FLAT_INTERFACE"變量,并且要保證這個interface并沒有一個IP。否則你可能會破壞一些東西。

"*DHCP Warning" 這種情況,如果你使用flat interface裝置使用DHCP,發生下面這種情況的時候,可能會讓你呆住,

網絡從flat interface上移到flat network bridge。這種情況完全有可能發生。結果是當你建立第一台虛拟機的時候。這種情況會導緻你的虛拟機出問題,比如連接配接不上,或者登陸失敗。

如果你隻是裝着單機版的來玩玩,那麼你可以使用FLAT_NETWORK_BRIDGE。

[cpp] view plaincopy

  1. FLAT_INTERFACE=${FLAT_INTERFACE:-eth0}  

quantum網絡

你需要確定quantum是在Enabled_services中是開啟的。假如network manager設定成為QuantumManager。

假如你想在這台機器上運作Quantum,那麼最好在ENABLED_SERVICES中要找到q-svc字段。

如果你想在quantum中使用openswitch插件,那麼把 Q_PLUGIN 的值設定為openvswitch。并且需要保證q-agt服務也是在開啟的服務之列。

如果你設定了Quantum網絡,那麼NET_MAN變量的值就被忽略了。

MYSQL 和 RabbitMQ

在這裡,我們配置的目标是讓Nova, Horizon, Glance, 與Keystone都使用MySQL做為其資料庫。這裡他們主要是使用一個單一的服務,但是每個服務都是有他們自己的表資料庫與表單。

一般而言,這裡的腳本會安裝和配置MySQL。如果你想用一個已經有的服務,那麼你需要傳遞/user/password/host參數。也同時需要傳遞MYSQL_PASSWORD參數到每個節點(當你使用的單台機器的時候,這一步就省了吧)。一般而言我都是采用一種最簡單的方式,也就是一台伺服器,也都使用這個伺服器上的MySQL資料庫。

下面的三行代碼分别是設定MySQL的機器位址與使用者名與密碼。在這裡是需要手動輸入密碼。

[cpp] view plaincopy

  1. MYSQL_HOST=${MYSQL_HOST:-localhost}  
  2. MYSQL_USER=${MYSQL_USER:-root}  
  3. read_password MYSQL_PASSWORD "ENTER A PASSWORD TO USE FOR MYSQL."  

下面再給出一個連結,這個連結主要是用于連接配接MYSQL資料庫。一般不需要去加上所需要連接配接的DataBase,因為其他幾個服務都是需要通過這個連結去連MySQL。但是每個服務連接配接的資料庫是不一樣的。是以如果是用同一樣的連結+資料庫名,肯定會出錯。一句話,保持下面這個不變就可以了。

[cpp] view plaincopy

  1. BASE_SQL_CONN=${BASE_SQL_CONN:-mysql://$MYSQL_USER:$MYSQL_PASSWORD@$MYSQL_HOST}  

設定RabbitMQ的密碼

[cpp] view plaincopy

  1. RABBIT_HOST=${RABBIT_HOST:-localhost}  
  2. read_password RABBIT_PASSWORD "ENTER A PASSWORD TO USE FOR RABBIT."  

接下來指出Glance的主機與端口,值得注意的是這裡需要給出端口。這個端口按照原文好像是需要指定的,特定的這麼個端口(總之保持不變就是了).。

[cpp] view plaincopy

  1. GLANCE_HOSTPORT=${GLANCE_HOSTPORT:-$HOST_IP:9292}  

Swift設定

需要完善的功能:

TODO:實作對于glance的支援。

TODO:   加入對于不同存儲位置的日志功能。

一般來說,swift驅動的位置與存儲對象是放在swift源碼的内部檔案夾中。當然也可以自已指定一個目錄。

[cpp] view plaincopy

  1. SWIFT_DATA_LOCATION=${SWIFT_DATA_LOCATION:-${SWIFT_DIR}/data}  

同樣的道裡,swift的配置檔案也是放在源碼内部的。當然也可以根據你自己的情況做出調整。

[cpp] view plaincopy

  1. SWIFT_CONFIG_LOCATION=${SWIFT_CONFIG_LOCATION:-${SWIFT_DIR}/config}  

接下來,devstack需要建立一個loop-back的磁盤,這個磁盤會被格式化為XFS格式,并且用來存儲swift資料。一般來說,這個磁盤的大小是1G。變量SWIFT_LOOPBACK_DISK_SIZE指出了這個磁盤的大小。當然你也可以根據自己的情況來調整大小。

[cpp] view plaincopy

  1. SWIFT_LOOPBACK_DISK_SIZE=${SWIFT_LOOPBACK_DISK_SIZE:-1000000}  

接下來是swift需要讀入一個密碼。這一段比較難以了解(主查涉及到swift内部的一些原理與實作)。

[cpp] view plaincopy

  1. # The ring uses a configurable number of bits from a path’s MD5 hash as  
  2. # a partition index that designates a device. The number of bits kept  
  3. # from the hash is known as the partition power, and 2 to the partition  
  4. # power indicates the partition count. Partitioning the full MD5 hash  
  5. # ring allows other parts of the cluster to work in batches of items at  
  6. # once which ends up either more efficient or at least less complex than  
  7. # working with each item separately or the entire cluster all at once.  
  8. # By default we define 9 for the partition count (which mean 512).  
  9. SWIFT_PARTITION_POWER_SIZE=${SWIFT_PARTITION_POWER_SIZE:-9}  
  10. # We only ask for Swift Hash if we have enabled swift service.  
  11. if [[ "$ENABLED_SERVICES" =~ "swift" ]]; then  
  12.     # SWIFT_HASH is a random unique string for a swift cluster that  
  13.     # can never change.  
  14.     read_password SWIFT_HASH "ENTER A RANDOM SWIFT HASH."  
  15. fi  

Keystone

服務密碼:Openstack的元件需要有一個管理者密碼來認證使用者的密碼。

下面則是讀入一個密碼:

[cpp] view plaincopy

  1. read_password SERVICE_TOKEN "ENTER A SERVICE_TOKEN TO USE FOR THE SERVICE ADMIN TOKEN."  

同樣也需要為Horizon輸入一個密碼。

[cpp] view plaincopy

  1. read_password ADMIN_PASSWORD "ENTER A PASSWORD TO USE FOR HORIZON AND KEYSTONE (20 CHARS OR LESS)."  

接下來是設定日志

[cpp] view plaincopy

  1. LOGFILE=${LOGFILE:-"$PWD/stack.sh.$.log"}  
  2. (  
  3. # So that errors don't compound we exit on any errors so you see only the  
  4. # first error that occurred.  
  5. trap failed ERR  
  6. failed() {  
  7.     local r=$?  
  8.     set +o xtrace  
  9.     [ -n "$LOGFILE" ] && echo "${0##*/} failed: full log in $LOGFILE"  
  10.     exit $r  
  11. }  

接下來的這個指令比較有用,就是打出每個指令,以及這個指令的輸出,主要是用于檢視在哪裡出錯了。以便及時查錯。

[cpp] view plaincopy

  1. set -o xtrace  

建立目标目錄,并且要保證stack使用者對于這個目錄是可寫的。

[cpp] view plaincopy

  1. sudo mkdir -p $DEST  
  2. if [ ! -w $DEST ]; then  
  3.     sudo chown `whoami` $DEST  
  4. fi  

前面講了這麼多,其實都是在講怎麼配置。接下來才是要進行人工操作階段。

安裝依賴包

Openstack用了很多其他的工程。是以需要安裝其他工程。

注意的是:

我們隻安裝對于我們的服務來說是必須的包。

腳本學習---得到作業系統發行版的方法

方法一

[python] view plaincopy

  1. DISTRO=$(lsb_release -c -s)  

可以用來得到作業系統的發行版。

缺點,

雖然這種方法可以在ubuntu上得到類似于oneiric的字樣(如果你的發行版不同,那麼得到的也肯定不一樣)。

至于其他版本,則得到的結果就有點奇怪了。比如我在suse上運作,是得不到相應的結果的。

[python] view plaincopy

  1. $ lsb_release -c -s  
  2. n/a  

方法二

其實作業系統發行版的資訊是寫在/etc/issue 和/etc/issue.net檔案中。為了友善我們用如下指令去檢視吧。

[python] view plaincopy

  1. $ cat /etc/issue*  

在ubuntu下的運作結果如下: [python] view plaincopy

  1. $ cat /etc/issue*  
  2. Ubuntu 11.10 \n \l  
  3. Ubuntu 11.10  

在SUSE下面運作有如下結果:

[python] view plaincopy

  1. $ cat /etc/issue*  
  2. Welcome to SUSE Linux Enterprise Server 11 SP1  (x86_64) - Kernel \r (\l).  
  3. Welcome to SUSE Linux Enterprise Server 11 SP1  (x86_64) - Kernel %r (%t).  

為了簡單起見,我們需要把這些字元串轉化成為小寫,再進行判斷。因為有時候有的發行版在說明的時候會寫SUSE, 而Ubuntu的寫的是Ubuntu,并不是全部都是大寫。

我們用如下腳本來進行測試是否是suse系統

[python] view plaincopy

  1. <span >"color:#3333FF;">if [[ `cat $DISTRO | grep suse | wc -l` -eq 0 ]]; then  
  2.   echo "Not suse"  
  3.   exit 1  
  4. fi</span>  

腳本學習----如何得到腳本運作時所在目錄。

當在問這個問題的時候,很有可能會回答說是pwd,在C語言裡用的是getcwd()函數。實際上,pwd這個指令傳回值是運作指令時所在路徑,而不是腳本所在目錄。

如果對于這個問題不是很了解。那麼換個問題就是,一個腳本,如何知道自己所在的目錄?這個腳本可以被放在很多位置。

方法一

第一種方法就是這個stack.sh腳本中所提到的,

[python] view plaincopy

  1. TOP_DIR=$(cd $(dirname "$0") && pwd)  

一開始看時,可能不太明白其含義,現解釋如下: [python] view plaincopy

  1. $0 這個隻能是在腳本裡面使用,在指令行裡面隻會輸出-bash。$0表示的意思是運作腳本的全路徑。  
  2. dirname這個指令就是截取全路徑中的目錄部分比如  
  3. $ dirname /root/stack/nova.sh  
  4. /root/stack  
  5. 實際上,在腳本中,使用dirname $0可能就已經夠用了。之是以再用cd && pwd我覺得主要的原因是怕$0給出的不是全路徑。  

方法二

來個簡潔版的,

[python] view plaincopy

  1. TOP_DIR=`dirname $0`  

進而可以确定 腳本 所在目錄。

腳本學習---如何取得全路徑中的路徑

方法一

dirname $par

方法二

pkg_dir=${par%/*}

繼續閱讀