#!/bin/bash
+ I! {. B% ?; @; I4 a. v q) G8 C9 F5 o
8 x; U, q2 W; d0 {- F* c4 t! j' z% N#共两台主机,分别是一台控制节点,一台计算节点
& e3 M' a' G6 {( b; C" ^7 F+ d
#1、控制节点内存4096M。双网卡,分别为eth0:10.0.0.11,eth1:10.0.0.12
A% v5 \; G% D' [. S#2、计算节点内存4096M。双网卡,分别为eth0:10.0.0.31,eth1:10.0.0.32
- N$ P- i* h) f. h# V+ x7 L& p( ^4 {& |7 H/ n) C+ o
#设置阿里云yum源
# L$ A2 \' T5 z5 J) r+ h
+ N, o* H( r$ g0 c4 A; e5 wrm -f /etc/yum.repos.d/CentOS-AppStream.repo /etc/yum.repos.d/CentOS-PowerTools.repo /etc/yum.repos.d/CentOS-centosplus.repo /etc/yum.repos.d/CentOS-Extras.repo && rm -rf /var/cache/yum && yum makecache && yum -y update && yum -y autoremove
; N3 T: t9 g. ` D! S8 \+ L+ j/ w, W, @
6 x- Q0 G+ I" _/ P! B" t/ F#关闭防火墙
2 o A8 x" d0 g0 n# _# {
systemctl stop firewalld && systemctl disable firewalld
" j0 p F& K h. D3 y3 C7 o) ^5 x+ y0 n
#关闭SELinux
3 t& \% X. |. @) ?! g# ?2 P
setenforce 0
|/ U$ d1 e# b2 n) O: F( T
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
3 A9 t$ y; Y4 e3 }, P
8 N6 ?! `5 c9 ?1 {, K#关闭swap分区
W1 O H1 Y5 O. {1 Q# X
swapoff -a
2 M9 f! v( r3 Ised -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
" ~" e) E- P4 i/ a1 E( H/ A
4 r6 N3 r5 d) P) b: s% q#设置内核
% v+ d w0 E7 T9 ], v
modprobe bridge
0 {$ K1 t* r* h# J% u+ I
modprobe br_netfilter
% E2 K3 H$ w- d- N6 Tcat > /etc/sysconfig/modules/neutron.modules <<EOF
- W5 M- `' a- w, W& `+ `% u0 y
#!/bin/bash
8 v& v4 p1 R* v1 M @6 P
modprobe -- bridge
! \ g5 |& B6 b0 {: y9 `modprobe -- br_netfilter
3 z3 @2 }, G5 @3 f: y" A; cEOF
4 D* x; d1 b) E+ qchmod 755 /etc/sysconfig/modules/neutron.modules && bash /etc/sysconfig/modules/neutron.modules
; V9 U. t1 F* N7 X- |& d
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
- I# s1 ?7 N0 e+ _& `4 Q7 O
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
6 _7 G2 H# A' g$ F; T* recho "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf
: W D, k. T c( W, m- Y3 o
echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf
9 `( ]& |" t$ U Psysctl -p
5 `6 H ?. X0 U$ c" T @
, r+ e4 I3 K- h3 x#设置时间同步
* ^# h$ Y9 B: P- ]0 ?6 kyum install -y chrony && yum -y autoremove
; n* a' Q3 m0 K# k' {
sed -i '/^pool/d' /etc/chrony.conf
/ S' f4 v' A0 v' }6 H1 x
sed -i '/^server/d' /etc/chrony.conf
. N# T3 F+ B: B+ z p
echo "pool ntp.aliyun.com iburst" >> /etc/chrony.conf
4 s" q9 l1 U" o7 V
systemctl start chronyd.service && systemctl enable chronyd.service
' y3 K6 E: l3 p
2 X# j" r: e2 w- O; ]* Y
#控制节点 设置hostname
( E4 v0 B4 u: [# k1 X
hostnamectl set-hostname controller
9 Y) P& Z. E' b+ b+ C6 x
/ v# v2 B7 F! [# A# A, L7 x% p, u#计算节点 设置hostname
3 C' G: i* D+ ] lhostnamectl set-hostname compute1
" R" a& N5 r7 f C1 Y/ P/ o+ Y
m9 o% h, { \/ q' C2 S
#添加host
$ z6 H$ ~# J5 ^- {' W
echo "10.0.0.11 controller" >> /etc/hosts
0 T* X- V1 W/ C4 } F; W3 p
echo "10.0.0.31 compute1" >> /etc/hosts
+ O' A. V- N: X% x: o3 \1 A, ~4 L7 G
( d. @; |* ~. V; D7 R6 k+ S#安装基础组件
) \6 w3 d b0 Vyum install -y centos-release-openstack-ussuri
9 H. U$ M4 `+ h' H6 qyum config-manager --set-enabled PowerTools
# B; z8 @( v4 |0 q* Dyum upgrade -y
9 ~4 a6 L9 M$ @1 b9 Z, \yum install -y python3-openstackclient
- O8 c7 A9 m+ B7 k3 a/ b+ f) {+ X. r" D8 U& o* ^6 p6 k; S
#控制节点 安装Mariadb
' m e/ _ Q1 }$ c `
yum install -y mariadb mariadb-server python2-PyMySQL
1 o! F, @7 l+ Q
tee /etc/my.cnf.d/openstack.cnf <<-'EOF'
+ {) f5 S1 a; _. G' ]" {[mysqld]
/ h: {) s6 z# D) Q) t6 Y! |
bind-address = 10.0.0.11
7 V+ {. Q( I) n5 [* Y2 ?5 k0 fdefault-storage-engine = innodb
. ^( z5 p3 y. x0 Binnodb_file_per_table = on
" l3 p7 U v+ I, W; d
max_connections = 4096
" P! j# _7 e! w: S- v% ucollation-server = utf8_general_ci
' k* s s! o9 Z/ z% }character-set-server = utf8
$ b& W+ J" K0 H* q
EOF
0 [: J# _, J0 i0 B l) M0 ~ x; {
systemctl enable mariadb.service && systemctl start mariadb.service
; m+ N5 n' [- A6 zecho -e "\nY\n123456\n123456\nY\nn\nY\nY\n" | mysql_secure_installation
6 Z& j/ J2 ?( |
|+ Z$ X& N8 t* I& |#控制节点 安装RabbitMQ
+ g) f* \" m! G4 B: Y
yum install -y rabbitmq-server
$ \, G" r9 c; y: g0 [systemctl enable rabbitmq-server.service && systemctl start rabbitmq-server.service
5 z" }# F9 N. Drabbitmqctl add_user openstack 123456
; o6 {3 z2 B" J; q" K- y9 X1 g% P
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
2 t+ S* x2 u$ _4 T* Z8 `8 i! Y
8 t% e% r% Y# q#控制节点 安装Memcached
% j2 ^4 @% r9 F% \" U
yum install -y memcached python3-memcached
. z. Z3 K% \5 }5 }: o: g! Used -i "s/-l 127.0.0.1,::1/-l 127.0.0.1,::1,controller/g" /etc/sysconfig/memcached
+ d. [" @+ B% q9 ]) L- J3 msystemctl enable memcached.service && systemctl start memcached.service
0 Q4 _# P( o' Q; u6 Q5 G
9 B0 D) y+ c- t4 W
#控制节点 安装Etcd
w4 w+ m/ P3 {+ T( B/ o1 Y$ {yum install -y etcd
# j2 b; Q& S6 \- {; i g
rm -f /etc/etcd/etcd.conf
% i- k* i8 J4 f" f; G, Q
tee /etc/etcd/etcd.conf <<-'EOF'
d1 B- @- R3 z) Y; _#[Member]
0 N* D: H8 c0 i. h. J" p# C. H) [/ UETCD_DATA_DIR="/var/lib/etcd/default.etcd"
6 R! X4 c7 g' P. G3 h
ETCD_LISTEN_PEER_URLS="http://10.0.0.11:2380
" - ~5 ~8 e0 ~, M" F
ETCD_LISTEN_CLIENT_URLS="http://10.0.0.11:2379
" " C( i+ N" Q) H
ETCD_NAME="controller"
% w3 w7 C) D0 g#[Clustering]
* m. a2 d! V, c- XETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.0.11:2380
" 7 D/ U1 z) K, k# h
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379
" 9 o& e# K6 H+ |$ r6 @, w' r9 L. n& J
ETCD_INITIAL_CLUSTER="controller=http://10.0.0.11:2380
"
$ ^5 W; r- P& w; m5 e- a0 _ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
( Z: P2 p2 h' U1 z
ETCD_INITIAL_CLUSTER_STATE="new"
- |. T5 [" a9 @; W/ b/ T
EOF
& @/ ?$ W' N. Q8 u
systemctl enable etcd && systemctl start etcd
% ^6 h: U' d! k- r" o( X9 H9 o
; F$ g( C2 v; N8 n$ i1 R' M% j8 |! Y) L1 ^#控制节点 安装Identity service
; c4 ^1 W! l5 F9 F4 A; x
mysql -uroot -p123456 -e "CREATE DATABASE keystone"
- P% k+ ~- {7 P% B amysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '123456'"
, h3 @1 d1 z" P4 rmysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '123456'"
2 y+ y9 ^2 ~1 j, R/ Z, z1 v& w1 \" Qyum install -y openstack-keystone httpd python3-mod_wsgi
* K) P$ I/ {: k+ G4 r4 {: @' Msed -i "556c connection = mysql+pymysql://keystone:123456@controller/keystone
" /etc/keystone/keystone.conf : J V- _4 e( l( k1 l
sed -i "2418c provider = fernet" /etc/keystone/keystone.conf
7 M& B4 w8 h8 e, }6 [7 a$ @
su -s /bin/sh -c "keystone-manage db_sync" keystone
6 X, F" y" p2 _4 H0 i/ p9 B# C
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
2 [5 s2 F/ K( \5 \keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
! M- ~1 v. u' ^5 x( j* pkeystone-manage bootstrap --bootstrap-password 123456 \
4 t$ v- I) q4 P4 i
--bootstrap-admin-url http://controller:5000/v3/ \
+ ]0 a* Z5 ^9 h2 ?2 X# Q --bootstrap-internal-url http://controller:5000/v3/ \
" D$ s! t' {2 ^8 E
--bootstrap-public-url http://controller:5000/v3/ \
# k* m% }0 e6 M' v8 N! N5 k# [8 z* O --bootstrap-region-id RegionOne
' m; W l# N6 I7 _echo "ServerName controller" >> /etc/httpd/conf/httpd.conf
Q; J; ]! s: R2 D; e2 a. x! Dln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
[* Y3 w, Z1 c6 v$ R
systemctl enable httpd.service && systemctl start httpd.service
! y2 K" j0 B8 u% o: mecho "export OS_USERNAME=admin" >> /etc/profile
" A1 q/ |. s7 W/ E" }9 i/ {
echo "export OS_PASSWORD=123456" >> /etc/profile
4 S/ ^) M/ X. O& H# N1 b
echo "export OS_PROJECT_NAME=admin" >> /etc/profile
* F% _ i& w1 l: jecho "export OS_USER_DOMAIN_NAME=Default" >> /etc/profile
9 L m' z K9 a4 eecho "export OS_PROJECT_DOMAIN_NAME=Default" >> /etc/profile
7 `1 u+ {6 p& m* ?! B+ \4 N: ^* e
echo "export OS_AUTH_URL=http://controller:5000/v3
" >> /etc/profile 1 e5 a! f1 f6 L5 n! _! A
echo "export OS_IDENTITY_API_VERSION=3" >> /etc/profile
. K6 x1 W8 A& v+ N3 C: ^
source /etc/profile
) \) j3 i! [: l! _2 u
openstack project create --domain default --description "Service Project" service
' |& ~# l% F: s) j1 R: H4 X3 h6 w
#控制节点 安装Image service
5 k- L$ @9 \& dmysql -uroot -p123456 -e "CREATE DATABASE glance"
3 T( A. q' U! t3 M. p( mmysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY '123456'"
+ p6 j1 G$ z; n# r1 J6 O/ L5 l9 _
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY '123456'"
3 S" r- Q. Y6 Oopenstack user create --domain default --password 123456 glance
6 N8 Z) M5 }2 E) e# c+ }openstack role add --project service --user glance admin
6 _# e9 @ b& `openstack service create --name glance --description "OpenStack Image" image
/ G, o" W8 c8 T4 u: ?6 m+ g& gopenstack endpoint create --region RegionOne image public http://controller:9292
' ]5 }+ D: `) r; ~
openstack endpoint create --region RegionOne image internal http://controller:9292
+ f" }& T/ S5 Q8 z, Eopenstack endpoint create --region RegionOne image admin http://controller:9292
+ J4 F+ L9 a) E0 z* _( N2 w# I9 Lyum install -y openstack-glance
; e9 O1 ^$ C9 y s- i4 _8 [sed -i "2062c connection = mysql+pymysql://glance:123456@controller/glance
" /etc/glance/glance-api.conf 4 Y5 n( B' r. ] x
sed -i "5034c www_authenticate_uri = http://controller:5000
" /etc/glance/glance-api.conf 8 g. K) _7 j% h, d9 P
sed -i "5035c auth_url = http://controller:5000
" /etc/glance/glance-api.conf 4 k. F6 \; \+ `3 K9 X/ M$ d! i3 b
sed -i "5036c memcached_servers = controller:11211" /etc/glance/glance-api.conf
1 ]# O6 D e+ ^" V4 Bsed -i "5037c auth_type = password" /etc/glance/glance-api.conf
9 a% `5 W3 U9 ~7 _
sed -i "5038c project_domain_name = Default" /etc/glance/glance-api.conf
3 W" n. L# F1 [6 v5 Y) t+ Lsed -i "5039c user_domain_name = Default" /etc/glance/glance-api.conf
9 g' n4 E" U: ~+ u" A8 Y
sed -i "5040c project_name = service" /etc/glance/glance-api.conf
) W; J6 s$ f$ G- W
sed -i "5041c username = glance" /etc/glance/glance-api.conf
/ D" e- B6 Z( X$ Used -i "5042c password = 123456" /etc/glance/glance-api.conf
0 W; I; M- b' Z8 K0 S; g) t
sed -i "5678c flavor = keystone" /etc/glance/glance-api.conf
6 n& U/ |) G0 c6 R1 nsed -i "3413c stores = file,http" /etc/glance/glance-api.conf
: u. T% {5 N' W; R2 q% Y. Wsed -i "3414c default_store = file" /etc/glance/glance-api.conf
* ]! W5 C7 k4 Z- P
sed -i "3415c filesystem_store_datadir = /var/lib/glance/images/" /etc/glance/glance-api.conf
& [, D3 p" E- T* {5 t$ i1 R4 ~su -s /bin/sh -c "glance-manage db_sync" glance
) L8 E9 T0 H3 } ~. t
systemctl enable openstack-glance-api.service && systemctl start openstack-glance-api.service
; L" A) g0 k; u0 A3 K
7 A5 `) n) J0 J0 N4 D& j#控制节点 安装Placement service
# I: H4 O: J7 W: a
mysql -uroot -p123456 -e "CREATE DATABASE placement"
5 a t4 D4 b$ G; ~
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY '123456'"
, ^1 C( n6 G: K8 Y& ?
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY '123456'"
; U1 Y+ N# n9 \$ h: T
openstack user create --domain default --password 123456 placement
& t0 n8 _" B0 J7 [8 ^
openstack role add --project service --user placement admin
$ E$ P& o& E- Q! y1 J1 n( |( Jopenstack service create --name placement --description "Placement API" placement
5 |- P3 B1 E% r
openstack endpoint create --region RegionOne placement public http://controller:8778
1 S) ~6 u. _" s9 @* L; `( O
openstack endpoint create --region RegionOne placement internal http://controller:8778
8 U4 f6 r# A Z( f
openstack endpoint create --region RegionOne placement admin http://controller:8778
$ x& B$ {! }* U; p. Tyum install -y openstack-placement-api
; M! F9 |% Q- F4 c5 `sed -i "507c connection = mysql+pymysql://placement:123456@controller/placement
" /etc/placement/placement.conf $ G2 m! i, d+ r2 K& X
sed -i "192c auth_strategy = keystone" /etc/placement/placement.conf
5 H/ e+ i3 ~/ P( v8 h% l
sed -i "241c auth_url = http://controller:5000/v3
" /etc/placement/placement.conf $ l+ m: E4 t$ B+ a
sed -i "242c memcached_servers = controller:11211" /etc/placement/placement.conf
2 c! C0 l9 q% Y0 ]! b
sed -i "243c auth_type = password" /etc/placement/placement.conf
; _: X) m9 C% K) B$ Z8 [
sed -i "244c project_domain_name = Default" /etc/placement/placement.conf
% t9 m$ x9 _+ q5 ]6 X/ U* B' x! M
sed -i "245c user_domain_name = Default" /etc/placement/placement.conf
3 O ?4 s; Y6 N" J0 W' {
sed -i "246c project_name = service" /etc/placement/placement.conf
+ i7 y! j7 `4 \- A, v/ \5 G# e. X' Y" ?% O
sed -i "247c username = placement" /etc/placement/placement.conf
& g5 t/ X) B# D$ Esed -i "248c password = 123456" /etc/placement/placement.conf
' q4 k+ c) R, V3 V8 R$ m
su -s /bin/sh -c "placement-manage db sync" placement
9 w* R! d. l4 Q( j2 \systemctl restart httpd
2 a2 ?% k4 _$ F9 _/ W2 {/ J. r4 g% `; ]1 @! ~. Y
#控制节点 安装Compute service
' C' ?. M1 V! ], Q/ T$ \
mysql -uroot -p123456 -e "CREATE DATABASE nova_api"
# c; n/ ?9 w, B) [4 l t. |5 r" Y jmysql -uroot -p123456 -e "CREATE DATABASE nova"
1 i2 a9 k- [1 l) a0 lmysql -uroot -p123456 -e "CREATE DATABASE nova_cell0"
# `/ Y4 p$ G7 j# H$ E8 Q- k2 _
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY '123456'"
6 P# ^$ @( P! k7 _- d* ~mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY '123456'"
! ~- Y9 n1 \9 N9 `3 j& X& fmysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY '123456'"
% s! l4 ?" l0 E" d) X
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY '123456'"
. v/ N) G N4 ]. i6 o
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY '123456'"
B6 L, p; x3 ]
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY '123456'"
0 S3 o+ V4 j q; Kopenstack user create --domain default --password 123456 nova
) d& P" s( I8 @- d0 N& K
openstack role add --project service --user nova admin
. W6 R) f. Q& V' h; v! I. ^# copenstack service create --name nova --description "OpenStack Compute" compute
0 L1 a( x+ R& K) ^openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1
[# Y; s( @1 S/ \# E8 f0 A( _openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1
/ y9 e& H; ]7 r F- A: e _9 ^openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1
; v7 g" X9 Q/ \7 o( u5 cyum install -y openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler
( Y, K/ R9 [7 B/ L, ]
sed -i "2c enabled_apis = osapi_compute,metadata" /etc/nova/nova.conf
" f/ E; x- t3 Nsed -i "3c transport_url = rabbit://openstack:123456@controller:5672/
" /etc/nova/nova.conf
% C4 ?/ t& G* D' |sed -i "4c my_ip = 10.0.0.11" /etc/nova/nova.conf
+ q, i$ }- F5 ^& M9 r$ fsed -i "1079c connection = mysql+pymysql://nova:123456@controller/nova_api
" /etc/nova/nova.conf 4 }1 X0 q( o7 `7 O
sed -i "1622c connection = mysql+pymysql://nova:123456@controller/nova
" /etc/nova/nova.conf
1 R* T, c% x! j L* W1 @' g7 Wsed -i "872c auth_strategy = keystone" /etc/nova/nova.conf
% E8 y+ Y: `+ p1 T3 a: N. d
sed -i "2561c www_authenticate_uri = http://controller:5000/
" /etc/nova/nova.conf
; D6 a6 q6 Y wsed -i "2562c auth_url = http://controller:5000/
" /etc/nova/nova.conf $ u* B+ G+ R8 {5 W# J7 X' l( U8 V
sed -i "2563c memcached_servers = controller:11211" /etc/nova/nova.conf
: M. d( B F# A8 T
sed -i "2564c auth_type = password" /etc/nova/nova.conf
' u$ a1 w9 u r! a) ]& }sed -i "2565c project_domain_name = Default" /etc/nova/nova.conf
5 @. x' P# n$ [3 S
sed -i "2566c user_domain_name = Default" /etc/nova/nova.conf
1 K0 ]* o$ Y. ~! G6 D% Esed -i "2567c project_name = service" /etc/nova/nova.conf
3 w7 K- H5 \+ P2 j! c
sed -i "2568c username = nova" /etc/nova/nova.conf
2 Q% {2 M' {2 y B- N5 W) wsed -i "2569c password = 123456" /etc/nova/nova.conf
9 k& T7 ?# L3 c. ?0 i D$ A1 r3 Q1 Y
sed -i "5171c enabled = true" /etc/nova/nova.conf
! H* k' o. T5 Z
sed -i '5172c server_listen = $my_ip' /etc/nova/nova.conf
8 O, v5 g- z2 ]; P" B" I/ O+ J. ^sed -i '5173c server_proxyclient_address = $my_ip' /etc/nova/nova.conf
- N0 d# d4 y+ K) x1 U& J/ Xsed -i "1937c api_servers = http://controller:9292
" /etc/nova/nova.conf 9 a0 S+ {# I( {- _3 t) f
sed -i "3571c lock_path = /var/lib/nova/tmp" /etc/nova/nova.conf
' N: u, q7 k+ q9 osed -i "4093c region_name = RegionOne" /etc/nova/nova.conf
f S; u7 M/ {' d' e& C
sed -i "4094c project_domain_name = Default" /etc/nova/nova.conf
. \) E! a* ` \1 r; Used -i "4095c project_name = service" /etc/nova/nova.conf
7 x; F) P# b' Z2 Z) |4 wsed -i "4096c auth_type = password" /etc/nova/nova.conf
' s# z+ r! y2 j; e+ H6 A
sed -i "4097c user_domain_name = Default" /etc/nova/nova.conf
) F4 o2 J1 H' m6 N
sed -i "4098c auth_url = http://controller:5000/v3
" /etc/nova/nova.conf / G% N, h& F/ W* {$ P
sed -i "4099c username = placement" /etc/nova/nova.conf
% W$ M- M! X _+ U8 B7 J
sed -i "4100c password = 123456" /etc/nova/nova.conf
2 S. l* `: J+ n+ }* e* R% }8 [8 }
sed -i "4509c discover_hosts_in_cells_interval = 300" /etc/nova/nova.conf
+ h% Z0 j3 o( {5 S& w1 ?
su -s /bin/sh -c "nova-manage api_db sync" nova
/ A2 ` U: I( g6 Y6 I' j5 t7 f- ^3 D2 W
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
! B; t' T. d7 V1 y" k: k' c
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
- R( m. k3 C* {+ Z, t( Psu -s /bin/sh -c "nova-manage db sync" nova
4 V# k0 r( \! \) a: p2 K% F0 W+ h! S
systemctl enable openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service && systemctl start openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
H, _0 o$ Q1 h; G7 K. N
' Q, e) s G0 h+ g/ o#计算节点 安装Compute service
; Q5 z' W0 F! T5 g1 H' \yum install -y openstack-nova-compute
9 D4 ? Q5 r9 p' ^( qsed -i "2c enabled_apis = osapi_compute,metadata" /etc/nova/nova.conf
. C f! Q0 k h+ o' I, {
sed -i "3c transport_url = rabbit://openstack:123456@controller
" /etc/nova/nova.conf
5 S0 k4 g, _- s- _/ k# X$ Rsed -i "4c my_ip = 10.0.0.31" /etc/nova/nova.conf
- h5 f; U. C1 Y
sed -i "872c auth_strategy = keystone" /etc/nova/nova.conf
5 c- K$ |5 k; m5 f$ W4 ysed -i "2561c www_authenticate_uri = http://controller:5000/
" /etc/nova/nova.conf " W& q9 X! w9 X2 H h6 y
sed -i "2562c auth_url = http://controller:5000/
" /etc/nova/nova.conf + p9 k4 ^$ q- R' o3 F
sed -i "2563c memcached_servers = controller:11211" /etc/nova/nova.conf
& h t' P. E1 Used -i "2564c auth_type = password" /etc/nova/nova.conf
% U, E; ^5 ~8 h3 }sed -i "2565c project_domain_name = Default" /etc/nova/nova.conf
. F( |& Z" f2 Z" o
sed -i "2566c user_domain_name = Default" /etc/nova/nova.conf
0 i- v4 P: f ?9 @8 ssed -i "2567c project_name = service" /etc/nova/nova.conf
' V# [. h, Z0 l- [' ]8 W
sed -i "2568c username = nova" /etc/nova/nova.conf
. m% I$ P% E7 D0 U
sed -i "2569c password = 123456" /etc/nova/nova.conf
; ?+ Z6 E' H7 B* ksed -i "5171c enabled = true" /etc/nova/nova.conf
3 d% g9 H2 [$ G9 A* {4 G- ^# [8 V0 Ised -i "5172c server_listen = 0.0.0.0" /etc/nova/nova.conf
) z* N: ?2 F# `$ p2 p3 ^
sed -i '5173c server_proxyclient_address = $my_ip' /etc/nova/nova.conf
6 y# b( Z; k( N& K- |) Q+ ]6 Vsed -i "5174c novncproxy_base_url = http://controller:6080/vnc_auto.html
" /etc/nova/nova.conf
; `8 N- R) W8 J' nsed -i "1937c api_servers = http://controller:9292
" /etc/nova/nova.conf . r# j. n$ e! S! ^
sed -i "3571c lock_path = /var/lib/nova/tmp" /etc/nova/nova.conf
i$ K: ~& ^% i* p; ~$ R
sed -i "4093c region_name = RegionOne" /etc/nova/nova.conf
9 c8 _" R8 w: _. c3 d6 ^sed -i "4094c project_domain_name = Default" /etc/nova/nova.conf
7 U. y& B9 M( E9 W: @% @' X$ Q
sed -i "4095c project_name = service" /etc/nova/nova.conf
( w( Q( P* i8 Y7 c$ Q) |/ tsed -i "4096c auth_type = password" /etc/nova/nova.conf
7 |' e+ |3 I, ?, L ?4 B
sed -i "4097c user_domain_name = Default" /etc/nova/nova.conf
3 l* v4 M4 j6 lsed -i "4098c auth_url = http://controller:5000/v3
" /etc/nova/nova.conf * [$ ^( p, k B6 m2 R4 E
sed -i "4099c username = placement" /etc/nova/nova.conf
# r r* l& N4 H/ A1 `
sed -i "4100c password = 123456" /etc/nova/nova.conf
( K& H) n1 k: Z3 h* Y) n" F
4 }8 r, o: Q% j#执行命令,查看是否支持CPU虚拟化,如果大于0则支持。
7 y- e8 r% w+ M' H: ^$ {
egrep -c '(vmx|svm)' /proc/cpuinfo
/ g* w! M" x) D p3 J3 Q; L4 P7 b
#如果不支持的话还需要执行下面的命令
$ }! m) e6 F L$ ?6 t1 l- \# _sed -i "2722c virt_type = qemu" /etc/nova/nova.conf
' ^# z; q; R! B! j' ]
, E0 `% ]7 d7 w5 K+ V% R5 Osystemctl enable libvirtd.service openstack-nova-compute.service && systemctl start libvirtd.service openstack-nova-compute.service
$ U0 |6 B* D* G- r3 b8 p
' ^8 Q8 ~( A4 N: L& Q#控制节点 计算节点从注册到发现会有延迟,根据discover_hosts_in_cells_interval 配置轮询发现时间,可以执行下面命令手动发现计算节点
- ]# u1 V8 ~- t, X# q$ ^su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
+ E- v5 m! w" a$ I+ V
' l, F2 S- T4 g8 S, x
#控制节点 安装Networking service
/ u1 z, d: P1 I; [6 m+ [4 D) lmysql -uroot -p123456 -e "CREATE DATABASE neutron"
6 v8 z6 R5 W( J* \. W: Q3 M
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY '123456'"
, F0 Y9 {. w1 ^0 [" Y6 |8 F/ k- F' Mmysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY '123456'"
$ B+ }+ p( q+ M; t b, N
openstack user create --domain default --password 123456 neutron
3 ~5 V- i2 G9 T2 w
openstack role add --project service --user neutron admin
5 z9 o ]+ {, ^- A+ o% C
openstack service create --name neutron --description "OpenStack Networking" network
v2 Y- a8 l" M- gopenstack endpoint create --region RegionOne network public http://controller:9696
3 p+ w( N' Y/ Q/ Z: wopenstack endpoint create --region RegionOne network internal http://controller:9696
' A# n _6 x" w7 k1 a8 Q+ aopenstack endpoint create --region RegionOne network admin http://controller:9696
: G2 W1 o2 F, @; N/ q' V
yum install -y openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge ebtables
2 t, U' p. h& ~# }#配置服务器组件
9 K! A0 x: P i6 L9 D: _* ]* Zsed -i "2c core_plugin = ml2" /etc/neutron/neutron.conf
1 r7 M7 y& a- [
sed -i "3c service_plugins = router" /etc/neutron/neutron.conf
. R. ~( ^. f5 T2 |; S" G7 A4 [sed -i "4c allow_overlapping_ips = true" /etc/neutron/neutron.conf
5 f1 q* k; c3 b3 N" i6 L) Fsed -i "5c transport_url = rabbit://openstack:123456@controller
" /etc/neutron/neutron.conf
A' ~9 e& m+ used -i "6c auth_strategy = keystone" /etc/neutron/neutron.conf
5 k, o; ^" K" k ?7 N( D" v
sed -i "7c notify_nova_on_port_status_changes = true" /etc/neutron/neutron.conf
+ o. Z! X8 M. w4 ^, ssed -i "8c notify_nova_on_port_data_changes = true" /etc/neutron/neutron.conf
" g/ t& B0 R8 v+ h1 i3 h5 Hsed -i "254c connection = mysql+pymysql://neutron:123456@controller/neutron
" /etc/neutron/neutron.conf 6 ^* @; Z! N. T8 c
sed -i "359c www_authenticate_uri = http://controller:5000
" /etc/neutron/neutron.conf & [ m5 G5 e" R, }, S; G) U& j
sed -i "360c auth_url = http://controller:5000
" /etc/neutron/neutron.conf 2 e# \" _: `. j5 ?
sed -i "361c memcached_servers = controller:11211" /etc/neutron/neutron.conf
" u" y) ^ \2 ^, N* l5 G* R5 ~4 xsed -i "362c auth_type = password" /etc/neutron/neutron.conf
T1 B! N0 k: i' H- x: c
sed -i "363c project_domain_name = default" /etc/neutron/neutron.conf
3 L, S- f9 ]- |5 X/ ]! j
sed -i "364c user_domain_name = default" /etc/neutron/neutron.conf
! I3 s, ]. P0 \$ a& x1 K8 ?* k
sed -i "365c project_name = service" /etc/neutron/neutron.conf
: g/ N" B. e1 \! E/ U+ S$ _* Z
sed -i "366c username = neutron" /etc/neutron/neutron.conf
6 d9 ^0 \$ t% V- c" c- Dsed -i "367c password = 123456" /etc/neutron/neutron.conf
2 o# N Q! G2 ]3 F
sed -i "521c lock_path = /var/lib/neutron/tmp" /etc/neutron/neutron.conf
% V, S" Q1 A" G* p* r# @
echo "[nova]" >> /etc/neutron/neutron.conf
. J/ i6 Q( K& | z
echo "auth_url = http://controller:5000
" >> /etc/neutron/neutron.conf / } m7 @% D) E6 g
echo "auth_type = password" >> /etc/neutron/neutron.conf
/ I; o# Y. W1 f2 ^4 _echo "project_domain_name = default" >> /etc/neutron/neutron.conf
7 F6 y6 h; y; P- N+ Xecho "user_domain_name = default" >> /etc/neutron/neutron.conf
- t3 v! D0 ?# a! A% ~# ?6 aecho "region_name = RegionOne" >> /etc/neutron/neutron.conf
& p! U1 s; `: T. h; h, A- Z" pecho "project_name = service" >> /etc/neutron/neutron.conf
$ U$ D! E) @8 j% F' b# Y4 i/ L& p
echo "username = nova" >> /etc/neutron/neutron.conf
8 A% i f+ r) N' d- R7 K
echo "password = 123456" >> /etc/neutron/neutron.conf
+ n( Z5 V& {( l6 M+ v. Q
#配置Modular Layer 2 (ML2) plug-in
' K) G. u- X" V$ X, \" Recho "[ml2]" >> /etc/neutron/plugins/ml2/ml2_conf.ini
9 i; e8 U1 Z2 a ?; w/ I- c; l# uecho "type_drivers = flat,vlan,vxlan" >> /etc/neutron/plugins/ml2/ml2_conf.ini
. |# r' ~( S. y f* {+ Z: I1 jecho "tenant_network_types = vxlan" >> /etc/neutron/plugins/ml2/ml2_conf.ini
8 L8 G( y Z2 w+ D1 Aecho "mechanism_drivers = linuxbridge,l2population" >> /etc/neutron/plugins/ml2/ml2_conf.ini
5 ~' ~. o0 J# ~ fecho "extension_drivers = port_security" >> /etc/neutron/plugins/ml2/ml2_conf.ini
+ F7 A- K0 [9 P
echo "[ml2_type_flat]" >> /etc/neutron/plugins/ml2/ml2_conf.ini
3 }7 R1 x) s7 D, F8 S
echo "flat_networks = provider" >> /etc/neutron/plugins/ml2/ml2_conf.ini
- m C3 V8 o8 U Secho "vni_ranges = 1:1000" >> /etc/neutron/plugins/ml2/ml2_conf.ini
: W. F& ?5 ~3 ~5 L
echo "[securitygroup]" >> /etc/neutron/plugins/ml2/ml2_conf.ini
4 k6 [: W, j" B7 H! b
echo "enable_ipset = true" >> /etc/neutron/plugins/ml2/ml2_conf.ini
~4 [# V0 y, m$ ^$ q
#配置Linux bridge agent
3 w& o6 v5 ?$ _% Kecho "[linux_bridge]" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
# _2 l- Y( y! C
#eth1为另外第二张网卡
; O& y3 r: {& O* C- ?+ m+ H* Fecho "physical_interface_mappings = provider:eth1" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
# G& c7 H$ @5 G% @echo "[vxlan]" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
$ z% |1 b2 r: p- y7 g/ A3 E
echo "enable_vxlan = true" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
7 P D; L8 t! }8 A6 ]) w#10.0.0.12为第二张网卡的IP
g4 \% C, Y( v9 e- H( j
echo "local_ip = 10.0.0.12" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
1 X% I) ?& N" l% c
echo "l2_population = true" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
0 p. \2 r- L! ~0 ^# hecho "[securitygroup]" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
3 h' H- X: _2 K0 b/ q
echo "enable_security_group = true" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
& f( Q0 n# S' H; Iecho "firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
! n- K9 q3 t7 ~. Y; G
#配置layer-3 agent
1 j2 W0 l7 X. K4 m1 ~( d
sed -i "2c interface_driver = linuxbridge" /etc/neutron/l3_agent.ini
) D1 `6 ]# k% l! F# M
#配置DHCP agent
; W/ k \# ]5 y; K- q0 I. g4 r
sed -i "2c interface_driver = linuxbridge" /etc/neutron/dhcp_agent.ini
o$ d' G* Y& N+ F7 ?sed -i "3c dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq" /etc/neutron/dhcp_agent.ini
& h( }/ q4 g1 j5 H- U2 k4 Zsed -i "4c enable_isolated_metadata = true" /etc/neutron/dhcp_agent.ini
$ p8 B0 [9 S) z) `( ^6 j5 u; C#配置metadata agent
0 h" W- P/ _3 t4 t) u# E& m7 {
sed -i "2c nova_metadata_host = controller" /etc/neutron/metadata_agent.ini
4 V" V( d2 |# t, z" d6 q5 ssed -i "3c metadata_proxy_shared_secret = 123456" /etc/neutron/metadata_agent.ini
! A' ?% F" g1 h8 W- R+ S
#配置计算服务使用网络服务
' i0 I' @& m" C$ z7 P+ D
sed -i " 3334c auth_url = http://controller:5000
" /etc/nova/nova.conf
* d5 w) l c3 x T: I2 w& [sed -i " 3335c auth_type = password" /etc/nova/nova.conf
" c/ i2 f% a2 N$ o. p& p" p( }
sed -i " 3336c project_domain_name = default" /etc/nova/nova.conf
: u2 z$ ?" ^, m! }8 w4 ~sed -i " 3337c user_domain_name = default" /etc/nova/nova.conf
2 n. J; a0 Z% y9 \$ b0 {3 csed -i " 3338c region_name = RegionOne" /etc/nova/nova.conf
/ u! B/ a; j% m6 K6 [
sed -i " 3339c project_name = service" /etc/nova/nova.conf
! c w% j* o2 B A: used -i " 3340c username = neutron" /etc/nova/nova.conf
# W( j% ^) Y) rsed -i " 3341c password = 123456" /etc/nova/nova.conf
/ H1 l1 W6 n% m' ~3 e, ? ^0 P' O
sed -i " 3342c service_metadata_proxy = true" /etc/nova/nova.conf
7 A0 ]$ n9 H9 k* N% Z
sed -i " 3343c metadata_proxy_shared_secret = 123456" /etc/nova/nova.conf
% ^- S6 L; W/ U7 N1 f& u
ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
" ]( r' v Q+ H7 `% csu -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
$ e6 h& ?# u. r$ G7 |0 Lsystemctl restart openstack-nova-api.service
/ I1 m2 B0 k8 n7 {) `; k
systemctl enable neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service && systemctl start neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service
9 e% h$ W+ j6 x, h% }
systemctl enable neutron-l3-agent.service && systemctl start neutron-l3-agent.service
/ ~% r2 R# {$ N5 [9 C, x
) c, F: U* m7 Z& S#计算节点 安装Networking service
0 F& e7 ?( E9 W. ]; x# }7 Xyum install -y openstack-neutron-linuxbridge ebtables ipset
6 K% J0 S! l7 ^! ^6 Vsed -i "2c transport_url = rabbit://openstack:123456@controller
" /etc/neutron/neutron.conf
8 p& k+ ~ f1 S' Dsed -i "3c auth_strategy = keystone" /etc/neutron/neutron.conf
3 Q/ H7 T5 r3 T, |$ P
sed -i "359c www_authenticate_uri = http://controller:5000
" /etc/neutron/neutron.conf 3 q& y8 v4 T4 f- m, s
sed -i "360c auth_url = http://controller:5000
" /etc/neutron/neutron.conf
0 l. O6 R# F: J* k* Used -i "361c memcached_servers = controller:11211" /etc/neutron/neutron.conf
, ~" K( p# p$ t9 wsed -i "362c auth_type = password" /etc/neutron/neutron.conf
. ]) N5 V( I P/ N6 W" [sed -i "363c project_domain_name = default" /etc/neutron/neutron.conf
- S0 t8 m) H4 R3 {! a k) W/ U& f
sed -i "364c user_domain_name = default" /etc/neutron/neutron.conf
2 M. `, S6 I N5 Z0 y: ?) O3 ysed -i "365c project_name = service" /etc/neutron/neutron.conf
, H& T. @: S2 B% m
sed -i "366c username = neutron" /etc/neutron/neutron.conf
% u( X, R( k n: z
sed -i "367c password = 123456" /etc/neutron/neutron.conf
0 F7 m& m7 T ]% s
sed -i "521c lock_path = /var/lib/neutron/tmp" /etc/neutron/neutron.conf
4 X$ z4 P b( r( I; O
echo "[linux_bridge]" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
% a: h2 r& ?# Y* W R. t#eth1为另外第二张网卡
3 I$ r1 U$ U' ?4 Q
echo "physical_interface_mappings = provider:eth1" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
2 f2 Q. y# d" B2 n9 n! w# |' u hecho "[vxlan]" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
, D5 @" F# K" N7 mecho "enable_vxlan = true" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
) w' A1 @3 \% ~4 I#10.0.0.32为第二张网卡的IP
5 @9 G- }+ W$ L2 G* kecho "local_ip = 10.0.0.32" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
# ^. Y. s3 _( o! O& }" ]) `, f
echo "l2_population = true" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
3 t& s" c; V* ]: y4 |( \ }
echo "[securitygroup]" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
" W4 I4 }$ a" i# oecho "enable_security_group = true" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
3 z8 Y% {) F6 `0 D, Wecho "firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver" >> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
1 \) ~0 Q( u: O* \; j#配置计算服务使用网络服务
0 }9 o* j1 _/ u
sed -i " 3334c auth_url = http://controller:5000
" /etc/nova/nova.conf 7 ?0 s' {8 M# c0 G2 j2 y
sed -i " 3335c auth_type = password" /etc/nova/nova.conf
+ Y3 a a3 ~: ^- w# B$ t" y
sed -i " 3336c project_domain_name = default" /etc/nova/nova.conf
h5 a3 R' Y5 p0 G' ?" dsed -i " 3337c user_domain_name = default" /etc/nova/nova.conf
$ h3 u; }% A* u" Z! y* i
sed -i " 3338c region_name = RegionOne" /etc/nova/nova.conf
8 d3 t4 U" H5 X
sed -i " 3339c project_name = service" /etc/nova/nova.conf
) Z8 k( j% [, a8 k+ I/ o/ Zsed -i " 3340c username = neutron" /etc/nova/nova.conf
! V9 C* [% i, [1 Z4 d- R9 X
sed -i " 3341c password = 123456" /etc/nova/nova.conf
1 q) W& D+ v3 J; w, P
systemctl restart openstack-nova-compute.service
2 h' B8 M, t9 A- m5 B; ]' I
systemctl enable neutron-linuxbridge-agent.service && systemctl start neutron-linuxbridge-agent.service
# p6 t( v8 n; f/ T- Q* s. j
% B9 Q) n5 ~/ f$ h! g#控制节点 安装Dashboard
9 h% i/ ]& K& _5 i6 i0 t' r' ayum install -y openstack-dashboard
$ l( }0 Z: r& O8 ?0 D+ P* Msed -i '118c OPENSTACK_HOST = "controller"' /etc/openstack-dashboard/local_settings
' c! Z3 a( N- Qsed -i "39c ALLOWED_HOSTS = ['*']" /etc/openstack-dashboard/local_settings
( U) M7 W: t# S* ?3 |7 ]sed -i "104c SESSION_ENGINE = 'django.contrib.sessions.backends.cache'" /etc/openstack-dashboard/local_settings
+ y+ p1 a m+ A& b
sed -i "94c CACHES = {" /etc/openstack-dashboard/local_settings
6 s% O' _9 A3 ?& F
sed -i "95c 'default': {" /etc/openstack-dashboard/local_settings
) {* j+ \) E3 N
sed -i "96c 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache'," /etc/openstack-dashboard/local_settings
6 T+ d6 X% j- y: `
sed -i "97c 'LOCATION': 'controller:11211'," /etc/openstack-dashboard/local_settings
& y: U6 l" E. {4 p3 bsed -i "98c }" /etc/openstack-dashboard/local_settings
) w" L, R b& d; n5 m O
sed -i "99c }" /etc/openstack-dashboard/local_settings
" C' Q$ M* h. qsed -i '119c OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3
" % OPENSTACK_HOST' /etc/openstack-dashboard/local_settings
7 c7 }3 J/ e( B" N2 a' x/ d9 ^* Z9 Pecho 'OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True' >> /etc/openstack-dashboard/local_settings
( O( r& S3 J K( Q* C' B; Gecho 'OPENSTACK_API_VERSIONS = {' >> /etc/openstack-dashboard/local_settings
: h" N( i% l; a5 D. h" ]
echo ' "identity": 3,' >> /etc/openstack-dashboard/local_settings
3 J' H. a$ F) ?0 t: d" i: [; Z1 oecho ' "image": 2,' >> /etc/openstack-dashboard/local_settings
, G# g+ o, S9 N% b$ O+ S9 P# i# vecho ' "volume": 3' >> /etc/openstack-dashboard/local_settings
9 C% s c7 K: H9 M. Z) W+ |echo '}' >> /etc/openstack-dashboard/local_settings
" b1 L9 V" ]( L) ~
echo 'OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"' >> /etc/openstack-dashboard/local_settings
, O' a! h7 Y" S1 Y. c" K+ K# D: r
echo 'OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"' >> /etc/openstack-dashboard/local_settings
! k" x* w# d/ K) ]& W8 J" q
sed -i '123c TIME_ZONE = "Asia/Shanghai"' /etc/openstack-dashboard/local_settings
# q3 n3 N( e: T$ T8 B% n! ~echo "WEBROOT = '/dashboard/'" >> /etc/openstack-dashboard/local_settings
, F5 j8 [. X0 E, ^; r0 A g+ v
echo 'WSGIApplicationGroup %{GLOBAL}' >> /etc/httpd/conf.d/openstack-dashboard.conf
' Z8 w0 B" F8 O: G- p
systemctl restart httpd.service memcached.service
+ d" g6 o/ k# F4 q7 [. e( q8 [# K5 \$ D
#安装完成,可访问http://10.0.0.11/dashboard/
查看 % F& m* @" N* O8 ]+ F( V