这里做一下配置openstack的记录,配置的步骤按照openstack网站上的documentation一步一步操作。有些步骤也写了python脚本来配置,有些地方可能解释的不是很准确。
一、准备环境
系统:ubuntu 14.04 两台实体机器。两台实体机分别用来作为controller node和compute node。网络环境是多节点,每台机器两个网卡。
我的网络环境是,内部网络网关10.0.0.1,外部网络网关192.168.1.1,内部网络通过eth0网卡通信,外部网络通过eth1网卡通信。
1.首先在controller node节点上配置网络,使用如下命令,
sudo gedit /etc/network/interfaces
然后往打开的文件里添加如下内容,我这里将内部网络绑定在eth0网卡上,将外部网络绑定在eth1网卡上。
auto eth0
iface eth0 inet static
address 10.0.0.11
netmask 255.255.255.0
gateway 10.0.0.1
auto eth1
iface eth1 inet static
address 192.168.1.110
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.8
dns-nameservers 192.168.1.8
保存后,重启网络服务,这里有个问题不懂为什么,需要重启电脑才能上网络配置生效,而不是仅通过 /etc/init.d/networking restart命令。
编辑/etc/hosts文件,设置计算节点和网络节点的ip与名字,如下所示,然后保存。注意,需要把127.0.1.1开头的行注释掉。
10.0.0.11 controller
10.0.0.31 compute1
2.到计算节点compute1,编辑/etc/network/interfaces文件,添加如下行,内部网络使用eth0网卡,外部网络使用eth1网卡。eth1根据自己的网络环境配置。
auto eth0
iface eth0 inet static
address 10.0.0.31
netmask 255.255.255.0
gateway 10.0.0.1
auto eth1
iface eth1 inet static
address 192.168.1.140
gateway 192.168.1.8
netmask 255.255.255.0
broadcast 192.168.1.255
dns-nameservers 192.168.1.8
再到/etc/hosts文件夹下,添加如下行,并且注意,要把127.0.1.1开头的行注释掉。10.0.0.31 compute1
10.0.0.11 controller
再使用命令或重启电脑,让网络配置生效。
3.验证网络配置是否成功。
第一步:在compute1节点,ping controller,观察能否ping通;然后ping www.baidu.com观察能否ping通。
ping www.baidu.com
ping controller
第二步:在controller节点上,ping compute1,观察能否ping通;然后ping www.baidu.com观察能否ping通。
ping www.baidu.com
ping compute1
若都能ping通,说明网络配置完成了。
4.安装NTP,因为不同的节点的时间需要同步,所以需要使用Network Time Protocol协议。
在controller节点和compute1节点,都运行如下命令,安装NTP。
sudo apt-get install ntp
并在各节点上编辑/etc/ntp.conf,添加server controller作为NTP的服务器。
5.可以使用如下命令来生成密码,目前还不需要,先记录一下。
openssl rand -hex 10
6.安装数据库,openstack服务大部分情况下需要使用Mysql数据库和mysql的python库。
在controller节点,使用如下命令,来安装mysql的服务端和客户端,以及mysql的python库。
sudo apt-get install mysql-server python-mysqldb
在安装mysql-server时,终端会提示输入mysql root账户的密码,这里统一将openstack的秘密都设置成123456。
安装完成后,需要对mysql的文件进行配置,编辑/etc/mysql/my.conf,在[mysqld]部分修改bind-address,使mysql服务器能被内部管理网络management network的其它机器连接。
bind-address = 10.0.0.11
并在[mysqld]部分添加如下的代码,来设置UTF-8字符集和Innodb等。
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
完成配置后,使用如下命令来重启mysql服务
sudo service mysql restart
最后,使用如下命令来改善mysql数据库的安全性,在执行mysql_secure_installation命令时,除了不用更改密码外,其他都选择为yes。
mysql_install_db
mysql_secure_installation
至此,controller节点上的数据库配置就告一段落了。备注:可以使用如下的命令彻底删除以前安装的mysql,和残留的配置文件
(1)、删除 mysql
sudo apt-get autoremove --purge mysql-server-5.0
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common //这个很重要
(2)、清理残留数据
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
前往compute1节点,使用如下命令,安装mysql的python库。
sudo apt-get install python-mysqldb
7.在controller上安装消息服务器
使用如下命令,安装RabbitMQ
sudo apt-get install rabbitmq-server
这里,消息代理服务器会有一个默认的guest账户,并且密码也是guest,我在这里使用guest账户,但是把密码改为123456,使用如下的命令
sudo rabbitmqctl change_password guest 123456
至此,安装openstack前的环境配置,已经完成。
二、配置身份认证服务
1.在controller端,安装身份认证服务组建使用如下命令,安装认证服务组件keystone。
sudo apt-get install keystone
2.身份认证服务需要使用数据库来存储一些信息,我在controller节点上使用mysql数据库来存储这些信息,因此需要编辑keystone文件夹/etc/keystone/keystone.conf,然后改变其中的[database]部分,将connection修改为如下,其中123456是访问keystone数据库的密码。
mysql://keystone:123456@controller/keystone
3.默认地,ubuntu软件包会创建一个sqlite数据库,所以需要使用如下命令将它删除,以免错误地使用它。
sudo rm /var/lib/keystone/keystone.db
4.使用如下命令,创建数据库,发现按照openstack网站文档的说法是无法连接至数据库的,会出现ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)错误,所以我把/etc/mysql/my.conf文件的bind-address项给注释了,重启数据库服务,然后再连接数据库。
mysql -uroot -p123456
create database keystone;
grant all privileges on keystone.* to 'keystone'@'localhost' identified by '123456';
grant all privileges on keystone.* to 'keystone'@'%' identified by '123456';
5.使用如下命令创建数据库表,这个命令,我不是很理解,先放着吧。
su -s /bin/sh -c "keystone-manage db_sync" keystone
6.使用openssl来生成一个令牌,这个令牌是身份认证和其他openstack服务的公共密钥。我这里运行如下命令,会生成这个字符串“c5dd85f266de7d2828af”。
openssl rand -hex 10
并将这个密钥放到/etc/keystone/keystone.conf的[default]段内,设置admin_token为如下。
admin_token=c5dd85f266de7d2828af
7.修改日志文件的路径
在/etc/keystone/keystone.conf的[default]段内,设置log_dir选项为如下。
log_dir=/var/log/keystone
8.使用如下命令重启keystone服务
sudo service keystone restart
9.根据openstack网站上提供的文档说明,不断有过期的令牌会使数据库占用的空间无限扩大,所以作为实验的测试环境,可以使用如下命令,每隔一个小时来清理这些过期的令牌。先记录一下,命令如下。
(crontab -l -u keystone 2>&1 | grep -q token_flush) || \
echo '@hourly /usr/bin/keystone-manage token_flush >/var/log/keystone/
keystone-tokenflush.log 2>&1' >> /var/spool/cron/crontabs/keystone
10.用第6步的令牌来设置一个临时的环境变量用作验证,来执行后续的操作(我自己的理解),命令如下,
export OS_SERVICE_TOKEN=c5dd85f266de7d2828af
export OS_SERVICE_ENDPOINT=http://controller:35357/v2.0
11.下面创建users、tenants、roles。
使用如下命令创建admin用户,这里密码还是设置成123456,email设置成自己的邮箱
keystone user-create --name=admin --pass=123456 --email=123456@qq.com
运行完成后会看到如下的显示
+----------+----------------------------------+
| Property | Value |
+----------+----------------------------------+
| email | 123456@qq.com |
| enabled | True |
| id | f7c077718bd947a2bb79331ff7060b08 |
| name | admin |
| username | admin |
+----------+----------------------------------+
使用如下命令,创建admin角色,
keystone role-create --name=admin
成功后会看到如下的显示。
+----------+----------------------------------+
| Property | Value |
+----------+----------------------------------+
| id | 9ab6b76a1d3048ea99e180656941c7cf |
| name | admin |
+----------+----------------------------------+
使用如下命令,创建admin用户的租户tenant,
keystone tenant-create --name=admin --description="Admin Tenant"
运行完成后,会看到如下的显示
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | Admin Tenant |
| enabled | True |
| id | d71abb786d9246648633cd63f2da3110 |
| name | admin |
+-------------+----------------------------------+
现在使用如下的命令,将admin user,admin role,admin tenant连接起来,
keystone user-role-add --user=admin --tenant=admin --role=admin
再使用如下的命令,将admin tenant、admin user和_member_role连接起来,
keystone user-role-add --user=admin --role=_member_ --tenant=admin
12.创建一个普通账户,用于普通日常工作
使用如下命令创建一个名为demo的用户,它的用户名是demo,密码仍然是123456,
keystone user-create --name=demo --pass=123456 --email=123456@qq.com
接着创建tenant,
keystone tenant-create --name=demo --description="Demo Tenant"
然后链接demo user, _member_ role,和demo tenant,
keystone user-role-add --user=demo --role=_member_ --tenant=demo
接着创建名为service的tenant。
keystone tenant-create --name=service --description="Service Tenant"
13.定义API终点,以及服务,这样身份认证服务才能追踪.
使用如下的命令,创建Identity Service的服务入口,
keystone service-create --name=keystone --type=identity description="OpenStack Identity"
运行后看到如下的结果
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | OpenStack Identity |
| enabled | True |
| id | 6016a663b7ed4b33ab36b2036b29b7b4 |
| name | keystone |
| type | identity |
+-------------+----------------------------------+
使用如下的命令,为身份认证服务指定一个end point api,
keystone endpoint-create \
--service-id=$(keystone service-list | awk '/ identity / {print $2}') \
--publicurl=http://controller:5000/v2.0 \
--internalurl=http://controller:5000/v2.0 \
--adminurl=http://controller:35357/v2.0
运行后,看到如下所示的结果,
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| adminurl | http://controller:35357/v2.0 |
| id | 57241f443c2846d88da87f6ace709ef5 |
| internalurl | http://controller:5000/v2.0 |
| publicurl | http://controller:5000/v2.0 |
| region | regionOne |
| service_id | 6016a663b7ed4b33ab36b2036b29b7b4 |
+-------------+----------------------------------+
14.最后,来验证身份服务的配置是否成功
首先使用如下的命令,解除之前设置的两个环境变量,
unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT
接着,使用如下的命令,通过用户名和密码来请求一个认证令牌,如果获得了和UserID相关的令牌对,则说明配置正确。
keystone --os-username=admin --os-password=123456 --os-auth-url=http://controller:35357/v2.0 token-get
</pre>我这里运行后,得到如下的结果。<p></p><p></p><pre name="code" class="plain">| Property | Value
| expires | 2014-09-25T15:06:47Z
| id | MIIC+QYJKoZIhvcNAQcCoIIC6jCCAuYCAQExDTALBglghkgBZQMEAgEwggFHBgkqhkiG9w0BBwGgggE4BIIBNHsiYWNjZXNzIjogeyJ0b2tlbiI6IHsiaXNzdWVkX2F0IjogIjIwMTQtMDktMjVUMTQ6MDY6NDcuOTgwMzY3IiwgImV4cGlyZXMiOiAiMjAxNC0wOS0yNVQxNTowNjo0N1oiLCAiaWQiOiAicGxhY2Vob2xkZXIifSwgInNlcnZpY2VDYXRhbG9nIjogW10sICJ1c2VyIjogeyJ1c2VybmFtZSI6ICJhZG1pbiIsICJyb2xlc19saW5rcyI6IFtdLCAiaWQiOiAiZjdjMDc3NzE4YmQ5NDdhMmJiNzkzMzFmZjcwNjBiMDgiLCAicm9sZXMiOiBbXSwgIm5hbWUiOiAiYWRtaW4ifSwgIm1ldGFkYXRhIjogeyJpc19hZG1pbiI6IDAsICJyb2xlcyI6IFtdfX19MYIBhTCCAYECAQEwXDBXMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVW5zZXQxDjAMBgNVBAcMBVVuc2V0MQ4wDAYDVQQKDAVVbnNldDEYMBYGA1UEAwwPd3d3LmV4YW1wbGUuY29tAgEBMAsGCWCGSAFlAwQCATANBgkqhkiG9w0BAQEFAASCAQBMaokVsmXDCn4chWqN55NNSR0cQ1lJYkyhs0gDWGkp4vCXr65TinmZ28g+47i+CpE+WhTeN3R2+hy45u1warAFhT-xQ3Xvsaf85hPbXY5liUp-LUPu+na84vCVE8XePh00qA3YFVlqDGLTuKfYeydBte9ebHv+X6TplOlMaaIhSEff1CQcakfYuO1DJeV-02g3o7kPNYxa5qvVk-zJxiGVIlUjO-EaS8F9umd0Tll14CjO+4pwDs8NVWx1uB9nTSpDvZ5s4yc4K7Y18-5oO58HqLt4m-qR5Leoka4iyjTec-iRY-YsAYMb8Q+-lSdd6VOqydp1T67ocN3NpmG9WY5N |
| user_id | f7c077718bd947a2bb79331ff7060b08
接着,使用如下的命令,在tenant上请求认证,若得到与上述相似的结果,则正确。
keystone --os-username=admin --os-password=123456 --os-tenant-name=admin --os-auth-url=http://controller:35357/v2.0 token-get
接着,可创建admin-openrc.sh文件,然后文件里写如下的环境变量,然后使用source admin-openrc.sh命令来使这些环境变量被读取生效,
export OS_USERNAME=admin
export OS_PASSWORD=123456
export OS_TENANT_NAME=admin
export OS_AUTH_URL=http://controller:35357/v2.0
source admin-openrc.sh
接着运行如下命令,
keystone token-get
运行命令后,看到与上述步骤类似的结果,则说明配置成功,但这个环境变量仅对当前的shell有效。每次要使用时,都需要source一下那个文件。
接着使用如下命令查看用户列表,
keystone user-list
可看到如下的用户列表。
+----------------------------------+-------+---------+------------------+
| id | name | enabled | email |
+----------------------------------+-------+---------+------------------+
| f7c077718bd947a2bb79331ff7060b08 | admin | True | 123456@qq.com |
| 4bc63f2c2f08418eaa5bbf8b0e3c46cd | demo | True | 123456@qq.com |
+----------------------------------+-------+---------+------------------+
使用如下的命令,可查看用户角色列表,
keystone user-role-list --user admin --tenant admin
我这里运行得到如下的结果。
+----------------------------------+----------+----------------------------------+----------------------------------+
| id | name | user_id | tenant_id |
+----------------------------------+----------+----------------------------------+----------------------------------+
| 9fe2ff9ee4384b1894a90878d3e92bab | _member_ | f7c077718bd947a2bb79331ff7060b08 | d71abb786d9246648633cd63f2da3110 |
| 9ab6b76a1d3048ea99e180656941c7cf | admin | f7c077718bd947a2bb79331ff7060b08 | d71abb786d9246648633cd63f2da3110 |
+----------------------------------+----------+----------------------------------+----------------------------------+
至此,身份认证服务就安装完成了。
三、安装和配置openstack的客户端
这里安装openstack的命令行客户端,安装完成后,可通过命令行来调用openstack各个服务的api。
1.这里,由于机器有限,直接在controller节点上,安装openstack的client。这些客户端packages是基于python写的,所以可以使用python的pip工具进行下载,整个下载过程,我使用了如下的脚本进行下载和安装,但是由于网速的问题,有时候可能会出现下载很久的情况,可以重新运行脚本,或改变pip的源,或者直接去python的https://www.python.org/网站上直接搜索下列包,自行安装。
import os
os.system("sudo apt-get install python-pip")
os.system("pip install python-ceilometerclient")
os.system("pip install python-cinderclient")
os.system("pip install python-glanceclient")
os.system("pip install python-heatclient")
os.system("pip install python-keystoneclient")
os.system("pip install python-neutronclient")
os.system("pip install python-novaclient")
os.system("pip install python-swiftclient")
os.system("pip install python-troveclient")
2.使用PROJECT-openrc.sh文件来设置环境变量。因为调用openstack的服务时需要许多环境变量,因此可以通过建立一个文件,来存放这些变量,然后再source该文件,这样即可免去为每个命令书写环境变量参数了,更为方便。方法和设置keystone的环境变量一样,例如,可为demo用户创建demo-openrc.sh,往该文件中写入如下的内容,然后再source demo-openrc.sh。
export <span style="font-family: Arial, Helvetica, sans-serif;">OS_USERNAME=demo</span>
export OS_PASSWORD=123456
export OS_TENANT_NAME=demo
export OS_AUTH_URL=http://controller:35357/v2.0
同时,如果你在命令中也使用了上述变量,那么文件中的变量值是会被覆盖的。四、配置镜像服务(glance)
1.使用如下命令,在控制节点controller上安装镜像服务。
sudo apt-get install glance python-glanceclient
2.镜像服务(Image Service)使用数据库来存储一些(元)信息,这里,像前面的认证服务一样,使用的是Mysql数据库。编辑/etc/glance/glance-api.conf文件和/etc/glance/glance-registry.conf文件,在它们的[database]段中,添加connection字段为如下,其中123456是我们要赋给mysql glance数据库的密码。
connection = mysql://glance:123456@controller/glance
3.使用如下的命令删除ubuntu的glance包默认创建的sqlite数据库。但是ubuntu 14.04下的该目录没发现有这个文件,先不管了。
sudo rm /var/lib/glance/glance.sqlite
4.进入mysql数据库,然后创建glance数据库,命令如下。
mysql -uroot -p123456
create database glance;
grant all privileges on glance.* to 'glance'@'localhost' identified by '123456';grant all privileges on glance.* to 'glance'@'%' identified by '123456';
5.使用如下命令为镜像服务创建数据库表。
sudo su -s /bin/sh -c "glance-manage db_sync" glance
运行完该命令后,可看到glance数据库里,已经有一些表了,如下所示。
mysql> show tables;
+------------------+
| Tables_in_glance |
+------------------+
| image_locations |
| image_members |
| image_properties |
| image_tags |
| images |
| migrate_version |
| task_info |
| tasks |
+------------------+
6.创建一个glance用户,镜像服务可以用这个glance用户,来进行身份认证。并且赋予glance用户的service租户和admin角色,命令如下。
keystone user-create --name=glance --pass=123456 --email=123456@qq.com
keystone user-role-add --user=glance --tenant=service --role=admin;
7.配置镜像服务,让镜像服务使用keystone进行身份认证。编辑/etc/glance/glance-api.conf文件和/etc/glance/glance-registry.conf文件,将[keystone_authtoken]部分的键值对添加或修改为如下,123456是我们设置的密码。
[keystone_authtoken]
auth_uri = http://controller:5000
auth_host = controller
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = 123456
修改[paste_deploy]部分,为如下。
[paste_deploy]
flavor = keystone
8.使用身份认证服务(Identity Service)来注册镜像服务(Image Service),这样其他的OpenStack服务就可以定位到镜像服务了。使用如下的命令来注册镜像服务以及创建终端(end point)。
keystone service-create --name=glance --type=image --description="Openstack Image Service"
keystone endpoint-create \
--service-id=$(keystone service-list | awk '/ image / {print $2}') \
--publicurl=http://controller:9292 \
--internalurl=http://controller:9292 \
--adminurl=http://controller:9292
上面两条命令执行完后,可分别看到如下的结果,
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | Openstack Image Service |
| enabled | True |
| id | 89520bf375784f9484bd0b322b669fef |
| name | glance |
| type | image |
+-------------+----------------------------------+
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| adminurl | http://controller:9292 |
| id | ddf0c7f09ca34aca912a24c25dd80d28 |
| internalurl | http://controller:9292 |
| publicurl | http://controller:9292 |
| region | regionOne |
| service_id | 89520bf375784f9484bd0b322b669fef |
+-------------+----------------------------------+
9.使用如下命令重启keystone服务,以使我们刚才的配置生效
sudo service glance-registry restart
sudo service glance-api restart
10.接下来,验证刚才的镜像服务是否成功安装。
完成这一步需要下载一个小的镜像CirrOS,使用如下命令下载这一镜像,首先创建一个目录,然后进入这个目录使用wget工具来下载这一镜像。
cd /home/hjy/work/openstack/
wget http://cdn.download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-disk.img
使用如下命令,将这个镜像上传至镜像服务(Image Service),先将环境变量设置成admin,然后在用glance命令,上传这个镜像,
source admin-openrc.sh
glance image-create --name "cirros-0.3.2-x86_64" --disk-format qcow2 --container-format bare --is-public True --progress < cirros-0.3.2-x86_64-disk.img
运行完命令后,得到如下所示的结果。
[=============================>] 100%
+------------------+--------------------------------------+
| Property | Value |
+------------------+--------------------------------------+
| checksum | 64d7c1cd2b6f60c92c14662941cb7913 |
| container_format | bare |
| created_at | 2014-09-26T12:34:49 |
| deleted | False |
| deleted_at | None |
| disk_format | qcow2 |
| id | c67bd732-0f39-4bcc-9b52-c120389c3c35 |
| is_public | True |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros-0.3.2-x86_64 |
| owner | d71abb786d9246648633cd63f2da3110 |
| protected | False |
| size | 13167616 |
| status | active |
| updated_at | 2014-09-26T12:34:50 |
| virtual_size | None |
+------------------+--------------------------------------+
可使用如下的命令,来验证刚才的镜像已经上传了,也可查看它的一些特征。
glance image-list
运行该命令后得到如下的结果,发现特征与刚才上传的镜像是一样的。
+--------------------------------------+---------------------+-------------+------------------+----------+--------+
| ID | Name | Disk Format | Container Format | Size | Status |
+--------------------------------------+---------------------+-------------+------------------+----------+--------+
| c67bd732-0f39-4bcc-9b52-c120389c3c35 | cirros-0.3.2-x86_64 | qcow2 | bare | 13167616 | active |
+--------------------------------------+---------------------+-------------+------------------+----------+--------+
接着,可删除刚才放在目录里的镜像文件了,因为它已经上传至镜像服务了。此外,我们还可以使用如下的命令,不通过本地文件系统向镜像服务上传镜像,而直接通过网络。
glance image-create --name="cirros-0.3.2-x86_64" --disk-format=qcow2 \
--container-format=bare --is-public=true \
--copy-from http://cdn.download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-
disk.img
至此,镜像服务就安装完成了。五、配置计算服务
1.在控制节点controller,安装计算服务,使用如下的命令。
sudo apt-get install nova-api nova-cert nova-conductor nova-consoleauth nova-novncproxy nova-scheduler python-novaclient
2.计算服务也使用Mysql数据库,存储必要的信息,修改/etc/nova/nova.conf文件,在[database]部分,添加如下的信息,123456是数据库的密码。
[database]
connection = mysql://nova:123456@controller/nova
3.修改/etc/nova/nova.conf文件,使其能使用RabbitMQ消息代理,在[DEFAULT]部分添加如下的内容,123456是RabbitMQ的密码。
[DEFAULT]
rpc_backend = rabbit
rabbit_host = controller
rabbit_password = 123456
4.将以下的信息添加到/etc/nova/nova.conf文件的[DEFAULT]部分。
[DEFAULT]
my_ip = 10.0.0.11
vncserver_listen = 10.0.0.11
vncserver_proxyclient_address = 10.0.0.11
5.像前面的其它服务一样,这里要删除nova.sqlite数据库,命令如下。
sudo rm /var/lib/nova/nova.sqlite
6.像前面的其它服务一样,这里,进入Mysql数据库,然后创建一个nova数据库,并授予一些权限给它。
mysql -uroot -p123456
create database nova;
grant all privileges on nova.* to 'nova'@'localhost' identified by '123456';
grant all privileges on nova.* to 'nova'@'%' identified by '123456';
7.使用如下的命令创建nova数据库的表。
sudo su -s /bin/sh -c "nova-manage db sync" nova
8.创建nova角色,并把它关联到service租户上,命令如下。source admin-openrc.sh
keystone user-create --name=nova --pass=123456 --email=411637257@qq.com
keystone user-role-add --user=nova --tenant=service --role=admin
执行完可看到如下的结果。
+----------+----------------------------------+| Property | Value |
+----------+----------------------------------+
| email | 411637257@qq.com |
| enabled | True |
| id | 9b203ae31532481caa8ec88393125b6c |
| name | nova |
| username | nova |
+----------+----------------------------------+
9.编辑/etc/nova/nova.conf文件,在[DEFAULT]部分添加如下的内容,将nova使用kestone来进行权限的认证。
[DEFAULT]
auth_strategy = keystone
将以下内容添加到[keystone_authtoken]部分,其中,123456是nova的密码。
[keystone_authtoken]
auth_uri = http://controller:5000
auth_host = controller
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = nova
admin_password = 123456
10.使用如下命令,注册计算服务到认证服务,这样其他的Openstack服务,就可以定位到它,注册服务和指定端点的命令如下。
keystone service-create --name=nova --type=compute --description="OpenStack Compute"
keystone endpoint-create \
--service-id=$(keystone service-list | awk '/ compute / {print $2}') \
--publicurl=http://controller:8774/v2/%\(tenant_id\)s \
--internalurl=http://controller:8774/v2/%\(tenant_id\)s \
--adminurl=http://controller:8774/v2/%\(tenant_id\)s
执行完命令,可看到如下的结果。
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | OpenStack Compute |
| enabled | True |
| id | 5d0d183401924fed8f7fdd79311a5066 |
| name | nova |
| type | compute |
+-------------+----------------------------------+
+-------------+-----------------------------------------+
| Property | Value |
+-------------+-----------------------------------------+
| adminurl | http://controller:8774/v2/%(tenant_id)s |
| id | 914b6ab624494460917787445944c3a7 |
| internalurl | http://controller:8774/v2/%(tenant_id)s |
| publicurl | http://controller:8774/v2/%(tenant_id)s |
| region | regionOne |
| service_id | 5d0d183401924fed8f7fdd79311a5066 |
+-------------+-----------------------------------------+
11.重启计算服务,重启的东西有点多,我就写了一个python脚本,如下。
import os
nova_services = ('nova-api','nova-cert','nova-consoleauth','nova-scheduler','nova-conductor','nova-novncproxy');
for cmd in nova_services:
cmd = "sudo service " + cmd + " restart"
print cmd;
os.system(cmd);
12.使用如下的命令,查看nova服务是否装好了。
nova image-list
运行命令,看到如下的结果,说明nova服务已经配置好了。
+--------------------------------------+---------------------+--------+--------+
| ID | Name | Status | Server |
+--------------------------------------+---------------------+--------+--------+
| c67bd732-0f39-4bcc-9b52-c120389c3c35 | cirros-0.3.2-x86_64 | ACTIVE | |
+--------------------------------------+---------------------+--------+--------+
13.前往计算节点,在计算节点上完成以下步骤。
发现这里配置的内容与以前的步骤重复,然后本人比较懒,就写了一个python的脚本来执行,python代码如下,
import os
import ConfigParser
os.system('apt-get install nova-compute-kvm')
keystone_authtoken = {'auth_uri':'http://controller:5000','auth_host':'controller', 'auth_port':'35357', 'auth_protocol':'http', 'admin_tenant_name':'service', 'admin_user': 'nova', 'admin_password':'123456'}
rabbit = {'rpc_backend':'rabbit', 'rabbit_host':'controller', 'rabbit_password':'123456'}
vnc = {'my_ip':'10.0.0.31', 'vnc_enabled':'True', 'vncserver_listen':'0.0.0.0', 'vncserver_proxyclient_address':'10.0.0.31', 'novncproxy_base_url':'http://controller:6080/vnc_auto.html'}
config = ConfigParser.ConfigParser()
os.system('cp /etc/nova/nova.conf /etc/nova/nova.conf.cp') # copy
print "cp /etc/nova/nova.conf done!"
with open('/etc/nova/nova.conf', 'rw') as cfgfile:
config.readfp(cfgfile)
config.set('DEFAULT', 'auth_strategy','keystone')
config.set('DEFAULT', 'glance_host', 'controller')
sections = config.sections()
if 'keystone_authtoken' not in sections:
config.add_section('keystone_authtoken')
if 'database' not in sections:
config.add_section('database')
# set [database]
config.set('database', 'connection', 'mysql://nova:123456@controller/nova')
for (k,v) in keystone_authtoken.iteritems():
config.set('keystone_authtoken', k, v)
for (k,v) in rabbit.iteritems():
config.set('DEFAULT', k, v)
for (k,v) in vnc.iteritems():
config.set('DEFAULT', k, v)
config.write(open('/etc/nova/nova.conf', 'w'))
output = os.popen("egrep -c '(vmx|svm)' /proc/cpuinfo")
out = output.readlines()
acc_value = out[0].strip()
print "The acc_value is " + acc_value
if (acc_value < 1):
os.system('cp /etc/nova/nova-compute.conf /etc/nova/nova-compute.conf.cp')
with open('/etc/nova/nova-compute.conf', 'rw') as cfgfile:
config.readfp(cfgfile)
sections = config.sections()
if 'libvirt' not in sections:
config.add_section('libvirt')
config.set('libvirt', 'virt_type', 'qemu')
config.write(open('/etc/nova/nova-compute.conf', 'w'))
os.system('rm /var/lib/nova/nova.sqlite')
os.system('service nova-compute restart')
解释一下代码,首先使用如下命令安装Compute安装包,
apt-get install nova-compute-kvm
接着,按如下的内容编辑/etc/nova/nova.conf配置文件,
[DEFAULT]
...
auth_strategy = keystone
...
[database]
# The SQLAlchemy connection string used to connect to the database
connection = mysql://nova:NOVA_DBPASS@controller/nova
[keystone_authtoken]
auth_uri = http://controller:5000
auth_host = controller
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = nova
admin_password = NOVA_PASS
再向该文件里添加如下的内容,以使Compute Service使用RabbitMQ服务[DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller
rabbit_password = 123456
接着继续编辑该文件,使得计算服务可以被远程调用,
[DEFAULT]
...
my_ip = 10.0.0.31
vnc_enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = 10.0.0.31
novncproxy_base_url = http://controller:6080/vnc_auto.html
编辑该文件, 指定镜像服务的地址controller
[DEFAULT]
...
glance_host = controller
这里注意一点,要使用如下的命令,来判断你使用的电脑是否支持硬件加速,如果不支持的话,即命令的返回值小于1,就需要修改/etc/nova/nova-compute.conf,将[libvirt]部分修改为如下。
egrep -c '(vmx|svm)' /proc/cpuinfo
[libvirt]
...
virt_type = qemu
最后就是删除SQLite数据库和重启服务。
rm /var/lib/nova/nova.sqlite
service nova-compute restart
还要注意一点,python脚本应在sudo的权限下执行。
六、增加网络服务
这里,我使用的网络架构是Legacy networking (nova-network)。
1. 使用如下的python脚本在controller node上修改对应的配置文件。
import os
import ConfigParser
config = ConfigPaser.ConfigPaser()
config.readfp(open('/etc/nova/nova.conf',rw))
config.set('DEFAULT', 'network_api_class', 'nova.network.api.API')
config.set('DEFAULT', 'security_group_api', 'nova')
commands = ('service nova-api restart', 'service nova-scheduler restart', 'service nova-conductor restart')
for cmd in commands:
os.system(cmd)
解释一下,代码的作用是修改/etc/nova/nova.conf文件,在这个文件中添加如下的内容,然后重启nova相关的服务。
[DEFAULT]
...
network_api_class = nova.network.api.API
security_group_api = nova
sudo service nova-api restart
sudo service nova-scheduler restart
sudo service nova-conductor restart
2.前往计算节点compute node,使用如下的python脚本配置计算节点的网络。这里的配置目的是用于利用DHCP向虚拟机实例分配外网的IP。
import os
import ConfigParser
os.system('sudo apt-get install nova-network nova-api-metadata')
net_set = {'network_api_class':'nova.network.api.API', 'security_group_api':'nova', 'firewall_driver':'nova.virt.libvirt.firewall.IptablesFirewallDriver', 'network_manager':'nova.network.manager.FlatDHCPManager', 'network_size':'254', 'allow_same_net_traffic':'False', 'multi_host':'True', 'send_arp_for_ha':'True', 'share_dhcp_address':'True', 'force_dhcp_release':'True','flat_network_bridge':'br100','flat_interface':'eth1','public_interface':'eth1'}
config = ConfigParser.ConfigParser()
config.readfp(open('/etc/nova/nova.conf', 'rw'))
for k,v in net_set.iteritems():
config.set('DEFAULT', k, v)
config.write(open('/etc/nova/nova.conf', 'w'))
os.system('service nova-network restart')
os.system('service nova-api-metadata restart')
解释一下,脚本的内容,首先安装nova-network nova-api-metadata,然后编辑/etc/nova/nova.conf,将[DEFAULT]段的数据编辑为如下,其中INTERFACE_NAME是我们外网卡,这里写成eth1。
[DEFAULT]
...
network_api_class = nova.network.api.API
security_group_api = nova
firewall_driver = nova.virt.libvirt.firewall.IptablesFirewallDriver
network_manager = nova.network.manager.FlatDHCPManager
network_size = 254
allow_same_net_traffic = False
multi_host = True
send_arp_for_ha = True
share_dhcp_address = True
force_dhcp_release = True
flat_network_bridge = br100
flat_interface = INTERFACE_NAME
public_interface = INTERFACE_NAME
3.在控制节点上,创建一个虚拟网络,来向各个虚拟机实例分配网络ip。
首先使用如下命令,来设置之前保存在admin-openrc.sh中的环境变量,
source admin-openrc.sh
然后,使用如下命令,给网络服务分配一个ip段,这里吐槽一下官方文档,尼玛,下面的命令都不写等于号,搞得我查半天错误!!
nova network-create demo-net --bridge=br100 --multi-host=T --fixed-range-v4=192.168.1.50/29
之后使用如下命令,可查看刚才用命令创建的网络。
nova net-list
$ nova net-list+--------------------------------------+----------+------------------+
| ID
| Label
| CIDR
|
+--------------------------------------+----------+------------------+
| 84b34a65-a762-44d6-8b5e-3b461a53f513 | demo-net | 203.0.113.24/29 |
+--------------------------------------+----------+------------------+
到此,openstack的基础环境就安装完成了,已经可以跑实例了,但是,为了方便,我还是先安装一下Dashboard。
七、添加dashboard
Dashboard是提供一个web界面,方便管理各个openstack组件的,下面对它进行安装。
1.使用如下命令,安装必要的包
sudo apt-get install apache2 memcached libapache2-mod-wsgi openstack-dashboard
2.删除openstack-dashboard-ubuntu-theme这个软件包,因为它对一些功能有阻碍作用
sudo apt-get remove --purge openstack-dashboard-ubuntu-theme
3.打开/etc/openstack-dashboard/local_settings.py文件,在这个文件中,修改如下代码,使对应选项和/etc/memcached.conf文件中描述的相同,我配置的时候刚好不需要进行修改。
CACHES = {
'default': {
'BACKEND' : 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION' : '127.0.0.1:11211',
}
}
4.继续编辑/etc/openstack-dashboard/local_settings.py文件,设置ALLOWED_HOSTS该段代码为如下,即允许控制节点和计算节点访问。
ALLOWED_HOSTS = ['controller','compute1']
继续修改该文件,将OPENSTACK_HOST改为如下。若是在Controller节点上安装Dashboard,则不需要修改这个选项,因为默认的OPENSTACK_HOST是127.0.0.1。
OPENSTACK_HOST = "controller"
5.用如下的命令重启Apache和memcached服务
sudo service apache2 restart
sudo service memcached restart
6.重启服务后,在浏览器上输入http://controller/horizon,即可看到如下所示的图了
7.往用户名和密码中输入我们之前创建的账户与密码:admin和123456,之后就可进入openstack的web管理界面,如下图所示。
注意:在compute节点,必须要使nova-compute、nova-api-metadata和nova-network这三个服务是启动的。
至此,openstack的基本环境就搭建完毕了,可以启动一个基本实例了,我们可以用dashboard来启动之前步骤中上传的镜像,来作为虚拟机。
附上几张图: