ubuntu 14.04 双节点、双网卡安装和配置openstack

这里做一下配置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来启动之前步骤中上传的镜像,来作为虚拟机。

附上几张图:

































































评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值