安装mysql,mysql的python绑定
apt-get install mysql-server
安装过程中会要求设定mysql的root账户的密码,这里假定设为mysql_root
mysql的配置文件在/etc/mysql/my.cnf
打开/etc/mysql/my.cnf,找到[mysqld]一节,将其修改为控制节点的IP(0.0.0.0表示所有地址都可以)
[mysqld] ... bind-address = 10.14.39.202
编辑/etc/mysql/my.cnf
[mysqld] ... collation-server = utf8_general_ci init-connect = 'SET NAMES utf8' character-set-server = utf8
编辑/etc/mysql/my.cnf
[mysqld] ... default-storage-engine = innodb
重启mysql服务
sudo service mysql restart
删除匿名与测试数据库,但不更改已设定的密码
sudo mysql_install_db sudo mysql_secure_installation
使用mysql客户端进行root帐号登录测试
mysql -u root -p
回车后输入安装时设定的root密码(假定为mysql_root),然后查看数据库列表
admin@controller:~$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2857 Server version: 5.5.37-0ubuntu0.14.04.1 (Ubuntu) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; ...
sudo apt-get install rabbitmq-server
rabbitmq中有一个guest的默认用户起帐户密码也为guest,这里我们修改一下这个默认帐号的密码(rabbit123)
sudo rabbitmqctl change_password guest rabbit123
由于我们想让keystone使用mysql数据库而不是sqlite文件数据库,所以必须先为其创建一个空数据库(keystone)和访问帐号(直接使用root帐号,存在很大安全隐患),该帐号仅有keystone数据库内的所有权限,并且可以通过任意地址访问:
$ mysql -u root -p mysql> CREATE DATABASE keystone; mysql> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone_dbpass'; mysql> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone_dbpass'; mysql> exit
这里我们假设新创建的这个帐号的密码时keystone_dbpass
sudo apt-get install keystone
keystone配置文件为/etc/keystone/keystone.conf
修改keystone.conf文件中database节的connection字段
[database] connection = mysql://keystone:keystone_dbpass@controller/keystone
删除原sqlite数据库文件
sudo rm /var/lib/keystone/keystone.db
使用以下命令随机生成一个token
openssl rand -hex 10
修改keystone配置文件,将其中的DEFAULT一节中修改admin_token字段
[DEFAULT] # A "shared secret" between keystone and other openstack services admin_token = ADMIN_TOKEN
修改keystone配置文件,将其中的DEFAULT一节中修改log_dir字段
[DEFAULT] ... log_dir = /var/log/keystone
配置cron定时清理日志文件
$ sudo su # (crontab -l 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/root
验证
admin@controller:~$ sudo crontab -l @hourly /usr/bin/keystone-manage token_flush >/var/log/keystone/keystone-tokenflush.log 2>&1
在mysql中创建keystone相关表
$ sudo su # keystone-manage db_sync
验证
$ mysql -u root -p mysql>use keystone; Database changed mysql> show tables; +-----------------------+ | Tables_in_keystone | +-----------------------+ | assignment | | credential | | domain | | endpoint | | group | | migrate_version | | policy | | project | | region | | role | | service | | token | | trust | | trust_role | | user | | user_group_membership | +-----------------------+ 16 rows in set (0.00 sec)
sudo service keystone restart
为了以后的openstack服务能够顺利进行,我们需要创建一个管理用户和普通用户以便测试,同时添加相关的租户空间.
由于keystone系统刚刚配置完成,其中没有任何用户,我们需要使用keystone客户端对其服务访问,创建一个管理用户.在没有用户的情况下我们可以提供配置时设定的ADMIN_TOKEN通过keystone的验证,从而进行一些管理动作(创建用户等,服务注册等).当管理用户创建且keystone服务被注册后,我们就可以使用用户名密码的形式通过keystone验证,进行后续的管理操作了.设定keystone验证所需的环境变量如下:
$ export OS_SERVICE_TOKEN=ADMIN_TOKEN $ export OS_SERVICE_ENDPOINT=http://controller:35357/v2.0
其中ADMIN_TOKEN请用keystone配置时设定的值替换.
$ keystone user-create --name=admin --pass=ADMIN_PASS --email=ADMIN_EMAIL $ keystone role-create --name=admin $ keystone tenant-create --name=admin --description="Admin Tenant" $ keystone user-role-add --user=admin --tenant=admin --role=admin $ keystone user-role-add --user=admin --role=_member_ --tenant=admin
其中__member__是keystone的一个默认用户角色,多数OpenStack服务对其开放,另外多数OpenStack的服务对名为admin的用户开放管理权限. 其中ADMIN_PASS 为管理用户的密码.
普通用户(名为demo),作为一个普通OpenStack用户,不具有OpenStack管理配置权限,但是他可以在自己的租户空间内进行虚拟机,虚拟网络的配置等.其配置如下:
$ keystone user-create --name=demo --pass=DEMO_PASS --email=DEMO_EMAIL $ keystone tenant-create --name=demo --description="Demo Tenant" $ keystone user-role-add --user=demo --role=_member_ --tenant=demo
其中DEMO_PASS 为普通用户(demo)的密码.
每一个OpenStack内的服务都有自己的keystone用户账户和密码,在以后配置各个服务的过程中会逐个创建.为了简单起见,让各个服务用户都共享一个租户空间.现在首先为这些服务用户创建一个租户空间以便他们可以添加到这个空间中来.
$ keystone tenant-create --name=service --description="Service Tenant"
依然使用创建上述创建用户时所用的两个环境变量设定.首先创建keystone服务准备向自己注册自己...
$ keystone service-create --name=keystone --type=identity --description="OpenStack Identity"
创建service endpoint,即服务注册
$ 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
在上一节中我们通过设定ADMIN_TOKEN环境变量的形式,通过keystone验证进行管理操作.既然已经创建了一个管理用户,我们就可以直接通过用户名密码的形式对keystone进行管理访问了.首先为了排除干扰,删除原先设定的两个环境变量:
$ unset OS_SERVICE_TOKEN $ unset OS_SERVICE_ENDPOINT
然后使用keystone的python客户端,提供用户名和密码进行访问
$ keystone --os-username=admin --os-password=ADMIN_PASS --os-auth-url=http://controller:35357/v2.0 token-get $ keystone --os-username=admin --os-password=ADMIN_PASS \ --os-tenant-name=admin --os-auth-url=http://controller:35357/v2.0 \ token-get
其中前者取回用户id和对应的token,后者返回tenantid和对应的token,测试是否通过验证并访问对应tenant.
由于以后的配置中需要频繁的使用keystone进行一些服务创建注册工作(另外其他OpenStack客户端也是通过相同的方式进行验证的),通过每次在命令行中指定验证参数的方式显得过于繁琐,我们可以创建一个包含了验证信息的一个脚本在每次需要运行管理用户权限的相关OpenStack客户端之前运行即可,其实是设定一些环境变量,而默认情况下,各个OpenStack客户端都会读取他们进行验证.现在创建一个名为admin-openrc.sh的脚本:
export OS_USERNAME=admin export OS_PASSWORD=ADMIN_PASS export OS_TENANT_NAME=admin export OS_AUTH_URL=http://controller:35357/v2.0
然后在当前shell环境内执行他们(不能将脚本设为可执行,然后运行脚本,这样设定环境变量只会存在于为了运行该脚本而新建的一个shell中,当脚本执行完毕,该shell退出后,当前shell中的环境变量其实没有发生任何改变),执行如下命令(等同于手工一条一条输完脚本文件中的命令)
$ source ./admin-openrc.sh
为了少输入几个字符"source"可以用"."替代如下
$ . ./admin-openrc.sh
然后我们可以进行验证:
$ . ./admin-openrc.sh $ keystone user-list +----------------------------------+---------+---------+--------------------------+ | id | name | enabled | email | +----------------------------------+---------+---------+--------------------------+ | 67af10efaae54455815c1069b87942a4 | admin | True | [email protected] | | fb041f3a239c407e805a1c3891da6621 | demo | True | [email protected] | +----------------------------------+---------+---------+--------------------------+
可以看到刚刚创建的两个用户
当提供keystone验证信息后,可以从其他主机远程访问控制节点上的服务,为了日后管理与测试方便我们建议在每台节点的admin用户的home目录下创建以下两个用于设定验证信息的文件
内容如下:
export OS_USERNAME=admin export OS_PASSWORD=ADMIN_PASS export OS_TENANT_NAME=admin export OS_AUTH_URL=http://controller:35357/v2.0
内容如下:
export OS_USERNAME=demo export OS_PASSWORD=DEMO_PASS export OS_TENANT_NAME=demo export OS_AUTH_URL=http://controller:35357/v2.0
可以在一个节点上创建这两个脚本,测试通过后,用scp命令将两个脚本复制到其他节点.这里假设从控制节点上scp到其他两个节点:
$ scp admin-openrc.sh admin@network:/home/admin $ scp open-openrc.sh admin@network:/home/admin $ scp admin-openrc.sh admin@compute1:/home/admin $ scp open-openrc.sh admin@compute1:/home/admin
glance服务可以用Object Storage作为存储后台,也可以之间使用本地文件系统,默认情况下映像保存在/var/lib/glance/images/目录下.这里我们先使用本地文件存储, 由于常用的映像一般都是上GB的,所以一定要保证在节点上有足够的空间.glance包括两部分如下:
本页具体内容参见 官方指导
与配置keystone服务类似,glance服务需要使用一个数据库来保存映像的相关信息,可以使用sqlite文件数据库,也可以使用mysql,为了方便集中管理,这里应该使用mysql,所以我们需要为其创建一个数据库和相应的帐号glance,密码假定为glance_dbpass。
$ mysql -u root -p mysql> CREATE DATABASE glance; mysql> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance_dbpass'; mysql> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_dbpass';
删除原来的sqlite文件
sudo rm /var/lib/glance/glance.sqlite
glance使用keystone进行账户管理,所以需要在keystone系统中为其创建一个用于服务管理的帐号,这里使用keystone的python进行这项工作,客户端的使用参见OpenStack客户端与验证.这里我们假定创建的这个keystone帐号(glance)使用的密码为glance_pass
$ . admin-openrc.sh $ keystone user-create --name=glance --pass=glance_pass [email protected] $ keystone user-role-add --user=glance --tenant=service --role=admin
sudo apt-get install glance python-glanceclient
将配置文件中[database]小节的数据库连接字符串修改为(假定用户密码为glance_dbpass):
[database] connection = mysql://glance:glance_dbpass@controller/glance
将配置文件中[DEFAULT]小节中相应字段修改为(假设先前rabbitmq服务guest用户的密码是rabiit123):
[DEFAULT] ... rpc_backend = rabbit rabbit_host = controller rabbit_password = rabbit123
由于我们将keystone作为glance的身份验证服务,需要对配置文件的[keystone_authtoken]小节进行修改:
[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 = glance_pass
这里我们假定glance用户的密码为glance_pass, 同时在[paste_deploy]小节中指定使用keystone作为身份验证服务:
[paste_deploy] ... flavor = keystone
注意不需要配置消息队列服务
参见glance-api.conf相应部分配置
参见glance-api.conf相应部分配置
sudo glance-manage db_sync
验证
mysql -u root -p mysql>use glance; mysql>show tables;
向keystone系统注册服务,客户端的使用参见OpenStack客户端与验证
$ . admin-openrc.sh $ 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
sudo service glance-registry restart sudo service glance-api restart
通过上传一个OpenStack环境下的超小型Linux映像进行对glance服务的验证: 首先下载该小型映像(不到15MB)
wget http://cdn.download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-disk.img
进行导入身份验证环境变量参见客户端的使用参见OpenStack客户端与验证,进行上传
admin@network:~$ . admin-openrc.sh admin@network:~$ glance image-create --name "cirros_64_uploadtest" --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-05-24T14:07:31 | | deleted | False | | deleted_at | None | | disk_format | qcow2 | | id | ed1911c0-be7e-41fc-9532-eacc426353fe | | is_public | True | | min_disk | 0 | | min_ram | 0 | | name | cirros_64_uploadtest | | owner | 1c949ef8c0e749f5a43c93c58ae28379 | | protected | False | | size | 13167616 | | status | active | | updated_at | 2014-05-24T14:07:32 | | virtual_size | None | +------------------+--------------------------------------+
列出glance中的映像
admin@network:~$ glance image-list +--------------------------------------+-----------------------+-------------+------------------+------------+--------+ | ID | Name | Disk Format | Container Format | Size | Status | +--------------------------------------+-----------------------+-------------+------------------+------------+--------+ | ed1911c0-be7e-41fc-9532-eacc426353fe | cirros_64_uploadtest | qcow2 | bare | 13167616 | active | +--------------------------------------+-----------------------+-------------+------------------+------------+--------+
本页依照官方指定进行配置,具体请参见
与其他服务类似,nova管理服务也需要用到数据库,默认可以使用sqlite文件数据库,这里我们设定为mysql,所以为其创建一个库和相应权限的账户,假设密码为nova_dbpass
$ mysql -u root -p mysql> CREATE DATABASE nova; mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova_dbpass'; mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_dbpass';
移除sqlite文件
sudo rm /var/lib/nova/nova.sqlite
与其他服务一样,nova管理部分也使用keystone作为身份验证服务,因此需要为其添加相应的账户,客户端的使用参见OpenStack客户端与验证
$ . admin-openrc.sh $ keystone user-create --name=nova --pass=nova_pass [email protected] $ keystone user-role-add --user=nova --tenant=service --role=admin
这里假设帐号nova的用户名为nova_pass
sudo install nova-api nova-cert nova-conductor nova-consoleauth nova-novncproxy nova-scheduler python-novaclient
nova配置文件位于/etc/nova/nova.conf
编辑配置文件加入如下[database]小节:
[database] connection = mysql://nova:nova_dbpass@controller/nova
这里假定nova使用的数据库帐号密码nova_dbpass
外部访问虚拟机可以通过VNC进行,编辑配置文件,在[DEFAULT]节中配置VNC服务参数如下:
[DEFAULT] ... my_ip = 10.14.39.202 vncserver_listen = 10.14.39.202 vncserver_proxyclient_address = 10.14.39.202
10.14.39.202为本(控制)节点的ip.
由于各个节点之间需要用到消息队列进行通信,为其配置rabbitmq消息队列,编辑配置文件,在[DEFAULT]一节中加入如下字段:
[DEFAULT] ... rpc_backend = rabbit rabbit_host = controller rabbit_password = rabbit123
这里假定rabbitmq默认用户(guest)的密码已经被改为rabbit123
为了与keystone服务通信,编辑配置文件,在[DEFAULT]节中设定使用keystone作为身份验证服务,并且在[keystone_authtoken]节(没有则加入)中加入刚刚在前置工作中设定的keystone帐号
[DEFAULT] ... auth_strategy = keystone [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
这里假定nova服务keystone密码已在前置工作设定为nova_pass
编辑配置文件 /etc/nova/nova.conf,在[DEFAULT]节中设定相关字段如下:
[DEFAULT] ... service_neutron_metadata_proxy = true neutron_metadata_proxy_shared_secret = metadatasecret
这里的neutron_metadata_proxy_shared_secret字段值在配置网络节点时需要用到.
初始数据库数据
sudo nova-manage db sync
向keystone注册服务,以便其他服务能够知晓访问
$ 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
直接复制执行即可,这里的controller即为hosts文件中设定的控制节点的主机名
建议在admin的home目录下创建一个脚本文件nova_restart.sh以便日后管理,其内如下:
#! /bin/bash service nova-api restart \ && service nova-cert restart \ && service nova-consoleauth restart \ && service nova-scheduler restart \ && service nova-conductor restart \ && service nova-novncproxy restart
修改权限
chmod +x nova_restart.sh
执行以使各个配置生效
./nova_restart.sh
列出映像,可以看到在验证glance服务时创建的cirros映像,说明nova服务已经可以和glance通信了
admin@controller:~$ . admin-openrc.sh admin@controller:~$ nova image-list +--------------------------------------+-----------------------+--------+--------------------------------------+ | ID | Name | Status | Server | +--------------------------------------+-----------------------+--------+--------------------------------------+ | ed1911c0-be7e-41fc-9532-eacc426353fe | cirros_64_uploadtest | ACTIVE | | +--------------------------------------+-----------------------+--------+--------------------------------------+
本页依照官方指导进行配置,参见
同样我们把mysql作为网络服务的数据库,因而在mysql中为其添加一个库和相应的帐号(假定密码为neurton_dbpass)
$ mysql -u root -p mysql> CREATE DATABASE neutron; mysql> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neurton_dbpass'; mysql> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neurton_dbpass';
neutron同样使用keystone作为后台身份验证,因此需要为其创建相应的keystone帐号(假定密码为neutron_pass)
$ . admin-openrc.sh $ keystone user-create --name neutron --pass neutron_pass --email [email protected] $ keystone user-role-add --user neutron --tenant service --role admin
sudo apt-get install neutron-server neutron-plugin-ml2
在没有特别的说明的情况下,下文指的配置文件为/etc/neutron/neutron.conf
修改配置文件[database]小节中(没有则添加)的数据库连接字符串
[database] ... connection = mysql://neutron:neutron_dbpass@controller/neutron
修改配置文件中[DEFAULT]节中auth_strategy字段(没有则添加),指定使用keystone作为身份验证后台
[DEFAULT] ... auth_strategy = keystone
然后修改配置文件中[keystone_authtoken]小节中的相关字段(没有则添加)如下
[keystone_authtoken] ... auth_uri = http://controller:5000 auth_host = controller auth_protocol = http auth_port = 35357 admin_tenant_name = service admin_user = neutron admin_password = neutron_pass
修改配置文件中[DEFAULT]节中的配置如下
[DEFAULT] ... rpc_backend = neutron.openstack.common.rpc.impl_kombu rabbit_host = controller rabbit_password = rabbit123
假定rabbit默认用户(guest)的密码设定为rabbit123
为了使nova计算服务使用neutron网络需要进行一些配置包括两个配置文件(是一个双向的过程,因此涉及两个方面)
修改neutron服务的配置文件,向配置文件的[DEFAULT]小节中加入(修改)以下内容
[DEFAULT] ... notify_nova_on_port_status_changes = True notify_nova_on_port_data_changes = True nova_url = http://controller:8774/v2 nova_admin_username = nova nova_admin_tenant_id = SERVICE_TENANT_ID nova_admin_password = nova_pass nova_admin_auth_url = http://controller:35357/v2.0
其中假定nova的keystone密码为nova_pass, SERVICE_TENANT_ID可以通过以下命令获得
$ . admin-openrc.sh $ keystone tenant-get service $ keystone tenant-get service +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Service Tenant | | enabled | True | | id | 696d11c35f27442a877571422e063f1f | | name | service | +-------------+----------------------------------+
修改nova服务的配置文件,向其中的[DEFAULT]小节中加人(或修改为)如下内容
[DEFAULT] ... network_api_class = nova.network.neutronv2.api.API neutron_url = http://controller:9696 neutron_auth_strategy = keystone neutron_admin_tenant_name = service neutron_admin_username = neutron neutron_admin_password = neutron_pass neutron_admin_auth_url = http://controller:35357/v2.0 linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver firewall_driver = nova.virt.firewall.NoopFirewallDriver security_group_api = neutron
配置涉及两个文件:
修改neutron配额文件,向其中的[DEFAULT]小节中加人(或修改为)如下内容:
[DEFAULT] ... core_plugin = ml2 service_plugins = router allow_overlapping_ips = True verbose = True
其中将verbose设定为true便于调试分析,并且注释掉(在行开头加入一个#)所有[service_providers]节中的内容。
在配置文件中的[ml2]小节中,修改为如下内容:
[ml2] ... type_drivers = gre tenant_network_types = gre mechanism_drivers = openvswitch
即neutron节点之间的数据传输使用GRE隧道,采用OpenVSwitch实现机制
在[ml2_type_gre]小节中,修改GRE隧道id范围,如下:
[ml2_type_gre] ... tunnel_id_ranges = 1:1000
修改[securitygroup]小节,指定防火墙为iptables实现,启用安全组,内容如下:
[securitygroup] ... firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver enable_security_group = True
向keystone体系提供neutron服务信息,以便其他服务能够访问
$ keystone service-create --name neutron --type network --description "OpenStack Networking" $ keystone endpoint-create \ --service-id $(keystone service-list | awk '/ network / {print $2}') \ --publicurl http://controller:9696 \ --adminurl http://controller:9696 \ --internalurl http://controller:9696
执行在nova部署时创建的脚本nova_restart.sh
sudo ./nova_restart.sh
建议创建一个脚本文件neutron_restart.sh便于日后管理,内容如下
#! /bin/bash service neutron-server restart
修改权限
chmod +x neutron_restart.sh
重启服务,以便应用最新的配置
sudo ./neutron_restart.sh
admin@controller:~$ sudo su [sudo] password for admin: root@controller:/home/admin# nova-manage service list Binary Host Zone Status State Updated_At nova-cert controller internal enabled :-) 2014-05-25 07:47:45 nova-consoleauth controller internal enabled :-) 2014-05-25 07:47:44 nova-scheduler controller internal enabled :-) 2014-05-25 07:47:38 nova-conductor controller internal enabled :-) 2014-05-25 07:47:46
应有以上类似输出,特别注意status列,:-)表示服务正常