1 devstack安裝
1 選擇linux版本及安裝 可靠版本有 Ubuntu 14.04。 使用 最小安裝(minimal install)。 2 下載下傳devstack git clone https://git.openstack.org/openstack-dev/devstack
3 最少配置項的local.conf
-
[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腳本結構
-
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
- $FORCE=yes ./stack.sh
,進而達到要求。但是我個人而言,不建議采用這種方式進來安裝部署。在其他版本上的安裝部署,後面再補上。
版本檢查
下面這段代碼就是主要是在檢查一下OS的版本。
# DISTRO變量就是拿到OS的版本。在Ubuntu上執行,會得到發行版的名字。oneiric。
# 接下來的幾句隻是在進行檢查是否是oneiric版本的Ubuntu
[cpp] view plaincopy
- DISTRO=$(lsb_release -c -s)
- if [[ ! ${DISTRO} =~ (oneiric) ]]; then
- echo "WARNING: this script has only been tested on oneiric"
- if [[ "$FORCE" != "yes" ]]; then
- echo "If you wish to run this script anyway run with FORCE=yes"
- exit 1
- fi
- fi
目錄設定
stack.sh把很多需要安裝的包與其他一些依賴都放到别的檔案裡面的,你可以在/devstack/files中找到這些檔案。但是在腳本中,我們是通過FILES變量來引用到這些配置檔案的位置。
#首先是拿到頂級目錄所在位置。比如/root/devstack,那麼$TOP_DIR="/root/devstack"
#生成FILES變量的值。再去檢查一下這個目錄是否存在。
[cpp] view plaincopy
- TOP_DIR=$(cd $(dirname "$0") && pwd)
- FILES=$TOP_DIR/files
- if [ ! -d $FILES ]; then
- echo "ERROR: missing devstack/files - did you grab more than just stack.sh?"
- exit 1
- fi
設定
這個腳本的可定制性展現在,一些環境變量可以放到别的檔案中,或者是通過設定環境變量來進行處理。比如
[cpp] view plaincopy
- $export MYSQL_PASSWORD=anothersecret
- $./stack.sh
可以達到效果。當然,你也可以把這些語句放在同一行,比如
[cpp] view plaincopy
- $MYSQL_PASSWORD=simple ./stack.sh
也可以把這些設定放到$TOP_DIR/localrc檔案中。
比如:
[cpp] view plaincopy
- $ cat $TOP_DIR/localrc
- .........
- MYSQL_PASSWORD=anothersecret
- MYSQL_USER=hellaroot
一般來說,我們都使用的是一些很敏感的設定,是以為了省事,你也可以運作
[cpp] view plaincopy
- $./stack.sh
(一般而言,如果這樣運作, 腳本 會在發現沒有密碼的時候,叫你輸出密碼,如果輸入密碼為空,那麼會随機生成一個密碼)。
環境變量
對于環境變量而言,一般我們都是放到stackrc檔案中。這個檔案是随着devstack一起釋出的,并且主要是包含了需要使用的git源。如果你想要使用别的源,或者是别的分枝,那麼你可以加入你自己的設定,并把這些設定寫到localrc檔案中。
一般而言localrc裡面的設定會把stackrc檔案中的變量給覆寫掉。這個是很有用的,特别是當你想使用别的源或者分枝的時候。你也可以更改掉一些已有設定,比如
[cpp] view plaincopy
- MYSQL_PASSWORD
- ADMIN_PASSWORD
否則devstack腳本會給你随機生成一個(這個随機生成的密碼還有點長)。
#首先是從stackrc中引入環境變量
#$DEST變量是指的是安裝目錄,一般預設安裝目錄是/opt/stack
#下面是定義了一個函數,其實也就是使用apt-get指令。
[cpp] view plaincopy
- source ./stackrc
- DEST=${DEST:-/opt/stack}
- function apt_get() {
- [[ "$OFFLINE" = "True" ]] && return
- local sudo="sudo"
- [ "$(id -u)" = "0" ] && sudo="env"
- $sudo DEBIAN_FRONTEND=noninteractive apt-get \
- --option "Dpkg::Options::=--force-confold" --assume-yes "$@"
- }
這裡檢查是否已經有stack.sh程式在運作。
[cpp] view plaincopy
- if screen -ls | egrep -q "[0-9].stack"; then
- echo "You are already running a stack.sh session."
- echo "To rejoin this session type 'screen -x stack'."
- echo "To destroy this session, kill the running screen."
- exit 1
- fi
因為Openstack在設計的時候,是用的一般使用者來運作的,主要原因是因為dashboard在運作的時候底層使用的是apache2的伺服器,而apache2不可以在root權限下執行。
如果在運作腳本的時候是使用的是root權限,那麼會自動建立一個stack使用者來執行操作。并且這個使用者會給足夠的權限來進行很多操作
[cpp] view plaincopy
- if [[ $EUID -eq 0 ]]; then
- ROOTSLEEP=${ROOTSLEEP:-10}
- echo "You are running this script as root."
- echo "In $ROOTSLEEP seconds, we will create a user 'stack' and run as that user"
- sleep $ROOTSLEEP
- # 因為這個腳本接下來是按照一個普通使用者來執行的,那麼需要給這個普通使用者以sudo的權限。
- #
- dpkg -l sudo || apt_get update && apt_get install sudo
- if ! getent passwd stack >/dev/null; then
- echo "Creating a user called stack"
- useradd -U -G sudo -s /bin/bash -d $DEST -m stack
- fi
- echo "Giving stack user passwordless sudo priviledges"
- # some uec images sudoers does not have a '#includedir'. add one.
- grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers ||
- echo "#includedir /etc/sudoers.d" >> /etc/sudoers
- ( umask 226 && echo "stack ALL=(ALL) NOPASSWD:ALL" \
- > /etc/sudoers.d/50_stack_sh )
- echo "Copying files to stack user"
- STACK_DIR="$DEST/${PWD##*/}"
- cp -r -f -T "$PWD" "$STACK_DIR" #這裡在拷檔案,額外的拷檔案的動作也可以加在這裡。
- chown -R stack "$STACK_DIR"
- if [[ "$SHELL_AFTER_RUN" != "no" ]]; then
- exec su -c "set -e; cd $STACK_DIR; bash stack.sh; bash" stack
- else
- exec su -c "set -e; cd $STACK_DIR; bash stack.sh" stack
- fi
- exit 1
- else
- # Our user needs passwordless priviledges for certain commands which nova
- # uses internally.
- # Natty uec images sudoers does not have a '#includedir'. add one.
- sudo grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers ||
- echo "#includedir /etc/sudoers.d" | sudo tee -a /etc/sudoers
- TEMPFILE=`mktemp`
- cat $FILES/sudo/nova > $TEMPFILE
- sed -e "s,%USER%,$USER,g" -i $TEMPFILE
- chmod 0440 $TEMPFILE
- sudo chown root:root $TEMPFILE
- sudo mv $TEMPFILE /etc/sudoers.d/stack_sh_nova
- fi
接下來這個就是設定是否是用離線的方式來進行安裝,或者是用上網的方式來進行安裝。
[cpp] view plaincopy
- function trueorfalse() {
- local default=$1
- local testval=$2
- [[ -z "$testval" ]] && { echo "$default"; return; }
- [[ "0 no false False FALSE" =~ "$testval" ]] && { echo "False"; return; }
- [[ "1 yes true True TRUE" =~ "$testval" ]] && { echo "True"; return; }
- echo "$default"
- }
- OFFLINE=`trueorfalse False $OFFLINE`
一般來說, 安裝 方式都是線上的方式來 安裝 的。如果設定的值是True,那麼就是使用離線的方式來進行 安裝 。
配置服務
接下來是設定一些環境變量:這些環境變量主要都是為了安裝某個部件而設定的。
[cpp] view plaincopy
- NOVA_DIR=$DEST/nova
- HORIZON_DIR=$DEST/horizon
- GLANCE_DIR=$DEST/glance
- KEYSTONE_DIR=$DEST/keystone
- NOVACLIENT_DIR=$DEST/python-novaclient
- OPENSTACKX_DIR=$DEST/openstackx
- NOVNC_DIR=$DEST/noVNC
- SWIFT_DIR=$DEST/swift
- SWIFT_KEYSTONE_DIR=$DEST/swift-keystone2
- QUANTUM_DIR=$DEST/quantum
下面的設定是為了Quantum而進行設定。
[cpp] view plaincopy
- # Default Quantum Plugin #看樣子這個應該是一個網絡服務
- Q_PLUGIN=${Q_PLUGIN:-openvswitch}
- # Default Quantum Port #這裡設定端口
- Q_PORT=${Q_PORT:-9696}
- # Default Quantum Host #這裡設定主機
- Q_HOST=${Q_HOST:-localhost}
接下來設定哪些服務要開啟。注意這裡用到的都是縮寫。
[cpp] view plaincopy
- 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
- # Name of the lvm volume group to use/create for iscsi volumes
- VOLUME_GROUP=${VOLUME_GROUP:-nova-volumes}
- VOLUME_NAME_PREFIX=${VOLUME_NAME_PREFIX:-volume-}
- INSTANCE_NAME_PREFIX=${INSTANCE_NAME_PREFIX:-instance-}
接下來是設定需要使用到的底層的服務
[cpp] view plaincopy
- VIRT_DRIVER=${VIRT_DRIVER:-libvirt}
- LIBVIRT_TYPE=${LIBVIRT_TYPE:-kvm}
一般而言我們都是使用kvm+libvirt。如果kvm沒有驅動起來,我們會使用qemu。
設定要使用到的Scheduler
[cpp] view plaincopy
- SCHEDULER=${SCHEDULER:-nova.scheduler.simple.SimpleScheduler}
接下來是拿到主機IP位址。
[cpp] view plaincopy
- if [ ! -n "$HOST_IP" ]; then
- HOST_IP=`LC_ALL=C /sbin/ifconfig eth0 | grep -m 1 'inet addr:'| cut -d: -f2 | awk '{print $1}'`
- if [ "$HOST_IP" = "" ]; then
- echo "Could not determine host ip address."
- echo "If this is not your first run of stack.sh, it is "
- echo "possible that nova moved your eth0 ip address to the FLAT_NETWORK_BRIDGE."
- echo "Please specify your HOST_IP in your localrc."
- exit 1
- fi
- fi
這裡是設定一下是否使用系統日志:
[cpp] view plaincopy
- SYSLOG=`trueorfalse False $SYSLOG`
- SYSLOG_HOST=${SYSLOG_HOST:-$HOST_IP}
- SYSLOG_PORT=${SYSLOG_PORT:-516}
服務逾時設定
[cpp] view plaincopy
- SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
接下這個函數就是為了讀取密碼而寫的。
[cpp] view plaincopy
- function read_password {
- set +o xtrace
- var=$1; msg=$2
- pw=${!var}
- localrc=$TOP_DIR/localrc
- # If the password is not defined yet, proceed to prompt user for a password.
- if [ ! $pw ]; then
- # If there is no localrc file, create one
- if [ ! -e $localrc ]; then
- touch $localrc
- fi
- # Presumably if we got this far it can only be that our localrc is missing
- # the required password. Prompt user for a password and write to localrc.
- echo ''
- echo '################################################################################'
- echo $msg
- echo '################################################################################'
- echo "This value will be written to your localrc file so you don't have to enter it again."
- echo "It is probably best to avoid spaces and weird characters."
- echo "If you leave this blank, a random default value will be used."
- echo "Enter a password now:"
- read -e $var
- pw=${!var}
- if [ ! $pw ]; then
- pw=`openssl rand -hex 10`
- fi
- eval "$var=$pw"
- echo "$var=$pw" >> $localrc
- fi
- set -o xtrace
- }
你如果想設定成為一個固定的密碼,那麼這裡可以改為如下:
[cpp] view plaincopy
- # Presumably if we got this far it can only be that our localrc is missing
- # the required password. Prompt user for a password and write to localrc.
- echo "Set password to nova:"
- pw="nova"
- eval "$var=$pw"
- echo "$var=$pw" >> $localrc
為了簡單起見,後面會一直使用nova做為密碼。(自己 安裝 着玩的時候這麼幹比較好,如果正式用的話,還是用一個靠譜的密碼吧。)
設定網絡:這些設定應該最後都會寫到/etc/nova/nova.conf檔案中的。不過這裡好像是放在安裝目錄中。
[cpp] view plaincopy
- PUBLIC_INTERalt"> FIXED_NETWORK_SIZE=${FIXED_NETWORK_SIZE:-256}
- FLOATING_RANGE=${FLOATING_RANGE:-172.24.4.224/28}
- NET_MAN=${NET_MAN:-FlatDHCPManager}
- EC2_DMZ_HOST=${EC2_DMZ_HOST:-$HOST_IP}
- FLAT_NETWORK_BRIDGE=${FLAT_NETWORK_BRIDGE:-br100}
- VLAN_INTERFACE=${VLAN_INTERFACE:-$PUBLIC_INTERFACE}
下面是設定是否使用多節點模式,如果使用多節點模式,那麼每個計算節點都會與網絡節點都是一體的,通路相應的VM的時候,直接通路相應的實體機則可。
這種模式可以解除SPOF和帶寬的制約。
[cpp] view plaincopy
- 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
- 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
- MYSQL_HOST=${MYSQL_HOST:-localhost}
- MYSQL_USER=${MYSQL_USER:-root}
- read_password MYSQL_PASSWORD "ENTER A PASSWORD TO USE FOR MYSQL."
下面再給出一個連結,這個連結主要是用于連接配接MYSQL資料庫。一般不需要去加上所需要連接配接的DataBase,因為其他幾個服務都是需要通過這個連結去連MySQL。但是每個服務連接配接的資料庫是不一樣的。是以如果是用同一樣的連結+資料庫名,肯定會出錯。一句話,保持下面這個不變就可以了。
[cpp] view plaincopy
- BASE_SQL_CONN=${BASE_SQL_CONN:-mysql://$MYSQL_USER:$MYSQL_PASSWORD@$MYSQL_HOST}
設定RabbitMQ的密碼
[cpp] view plaincopy
- RABBIT_HOST=${RABBIT_HOST:-localhost}
- read_password RABBIT_PASSWORD "ENTER A PASSWORD TO USE FOR RABBIT."
接下來指出Glance的主機與端口,值得注意的是這裡需要給出端口。這個端口按照原文好像是需要指定的,特定的這麼個端口(總之保持不變就是了).。
[cpp] view plaincopy
- GLANCE_HOSTPORT=${GLANCE_HOSTPORT:-$HOST_IP:9292}
Swift設定
需要完善的功能:
TODO:實作對于glance的支援。
TODO: 加入對于不同存儲位置的日志功能。
一般來說,swift驅動的位置與存儲對象是放在swift源碼的内部檔案夾中。當然也可以自已指定一個目錄。
[cpp] view plaincopy
- SWIFT_DATA_LOCATION=${SWIFT_DATA_LOCATION:-${SWIFT_DIR}/data}
同樣的道裡,swift的配置檔案也是放在源碼内部的。當然也可以根據你自己的情況做出調整。
[cpp] view plaincopy
- SWIFT_CONFIG_LOCATION=${SWIFT_CONFIG_LOCATION:-${SWIFT_DIR}/config}
接下來,devstack需要建立一個loop-back的磁盤,這個磁盤會被格式化為XFS格式,并且用來存儲swift資料。一般來說,這個磁盤的大小是1G。變量SWIFT_LOOPBACK_DISK_SIZE指出了這個磁盤的大小。當然你也可以根據自己的情況來調整大小。
[cpp] view plaincopy
- SWIFT_LOOPBACK_DISK_SIZE=${SWIFT_LOOPBACK_DISK_SIZE:-1000000}
接下來是swift需要讀入一個密碼。這一段比較難以了解(主查涉及到swift内部的一些原理與實作)。
[cpp] view plaincopy
- # The ring uses a configurable number of bits from a path’s MD5 hash as
- # a partition index that designates a device. The number of bits kept
- # from the hash is known as the partition power, and 2 to the partition
- # power indicates the partition count. Partitioning the full MD5 hash
- # ring allows other parts of the cluster to work in batches of items at
- # once which ends up either more efficient or at least less complex than
- # working with each item separately or the entire cluster all at once.
- # By default we define 9 for the partition count (which mean 512).
- SWIFT_PARTITION_POWER_SIZE=${SWIFT_PARTITION_POWER_SIZE:-9}
- # We only ask for Swift Hash if we have enabled swift service.
- if [[ "$ENABLED_SERVICES" =~ "swift" ]]; then
- # SWIFT_HASH is a random unique string for a swift cluster that
- # can never change.
- read_password SWIFT_HASH "ENTER A RANDOM SWIFT HASH."
- fi
Keystone
服務密碼:Openstack的元件需要有一個管理者密碼來認證使用者的密碼。
下面則是讀入一個密碼:
[cpp] view plaincopy
- read_password SERVICE_TOKEN "ENTER A SERVICE_TOKEN TO USE FOR THE SERVICE ADMIN TOKEN."
同樣也需要為Horizon輸入一個密碼。
[cpp] view plaincopy
- read_password ADMIN_PASSWORD "ENTER A PASSWORD TO USE FOR HORIZON AND KEYSTONE (20 CHARS OR LESS)."
接下來是設定日志
[cpp] view plaincopy
- LOGFILE=${LOGFILE:-"$PWD/stack.sh.$.log"}
- (
- # So that errors don't compound we exit on any errors so you see only the
- # first error that occurred.
- trap failed ERR
- failed() {
- local r=$?
- set +o xtrace
- [ -n "$LOGFILE" ] && echo "${0##*/} failed: full log in $LOGFILE"
- exit $r
- }
接下來的這個指令比較有用,就是打出每個指令,以及這個指令的輸出,主要是用于檢視在哪裡出錯了。以便及時查錯。
[cpp] view plaincopy
- set -o xtrace
建立目标目錄,并且要保證stack使用者對于這個目錄是可寫的。
[cpp] view plaincopy
- sudo mkdir -p $DEST
- if [ ! -w $DEST ]; then
- sudo chown `whoami` $DEST
- fi
前面講了這麼多,其實都是在講怎麼配置。接下來才是要進行人工操作階段。
安裝依賴包
Openstack用了很多其他的工程。是以需要安裝其他工程。
注意的是:
我們隻安裝對于我們的服務來說是必須的包。
腳本學習---得到作業系統發行版的方法
方法一
[python] view plaincopy
- DISTRO=$(lsb_release -c -s)
可以用來得到作業系統的發行版。
缺點,
雖然這種方法可以在ubuntu上得到類似于oneiric的字樣(如果你的發行版不同,那麼得到的也肯定不一樣)。
至于其他版本,則得到的結果就有點奇怪了。比如我在suse上運作,是得不到相應的結果的。
[python] view plaincopy
- $ lsb_release -c -s
- n/a
方法二
其實作業系統發行版的資訊是寫在/etc/issue 和/etc/issue.net檔案中。為了友善我們用如下指令去檢視吧。
[python] view plaincopy
- $ cat /etc/issue*
在ubuntu下的運作結果如下: [python] view plaincopy
- $ cat /etc/issue*
- Ubuntu 11.10 \n \l
- Ubuntu 11.10
在SUSE下面運作有如下結果:
[python] view plaincopy
- $ cat /etc/issue*
- Welcome to SUSE Linux Enterprise Server 11 SP1 (x86_64) - Kernel \r (\l).
- Welcome to SUSE Linux Enterprise Server 11 SP1 (x86_64) - Kernel %r (%t).
為了簡單起見,我們需要把這些字元串轉化成為小寫,再進行判斷。因為有時候有的發行版在說明的時候會寫SUSE, 而Ubuntu的寫的是Ubuntu,并不是全部都是大寫。
我們用如下腳本來進行測試是否是suse系統
[python] view plaincopy
- <span >"color:#3333FF;">if [[ `cat $DISTRO | grep suse | wc -l` -eq 0 ]]; then
- echo "Not suse"
- exit 1
- fi</span>
腳本學習----如何得到腳本運作時所在目錄。
當在問這個問題的時候,很有可能會回答說是pwd,在C語言裡用的是getcwd()函數。實際上,pwd這個指令傳回值是運作指令時所在路徑,而不是腳本所在目錄。
如果對于這個問題不是很了解。那麼換個問題就是,一個腳本,如何知道自己所在的目錄?這個腳本可以被放在很多位置。
方法一
第一種方法就是這個stack.sh腳本中所提到的,
[python] view plaincopy
- TOP_DIR=$(cd $(dirname "$0") && pwd)
一開始看時,可能不太明白其含義,現解釋如下: [python] view plaincopy
- $0 這個隻能是在腳本裡面使用,在指令行裡面隻會輸出-bash。$0表示的意思是運作腳本的全路徑。
- dirname這個指令就是截取全路徑中的目錄部分比如
- $ dirname /root/stack/nova.sh
- /root/stack
- 實際上,在腳本中,使用dirname $0可能就已經夠用了。之是以再用cd && pwd我覺得主要的原因是怕$0給出的不是全路徑。
方法二
來個簡潔版的,
[python] view plaincopy
- TOP_DIR=`dirname $0`
進而可以确定 腳本 所在目錄。
腳本學習---如何取得全路徑中的路徑
方法一
dirname $par
方法二
pkg_dir=${par%/*}