一、节点准备

node0
controller
centos7.2
node1
trove
node3
nova
node5
cinder
node7
neutron

二、安装keystone,nova,neutron,cinder

使用kolla 在node0,node3,node5,node7上安装keystone,nova,neutron,cinder

三、在node1上安装trove

1、预安装软件

yum insall epel-release -y
yum install python-virtualenv git screen -y
# 安装过程中会用到gcc
yum install gcc -y
# trove的安装中,pycrypto没有安装,需要手动安装,否则会报no modules
pip install pycrypto wrapt==1.10.8

2、编辑/etc/pip.conf

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com

3、创建用户

useradd -m a

4、初始环境

su - a
virtualenv ven/bin/activate
pip install pip --upgrade

5、下载并安装trove

git clone https://github.com/openstack/trove.git
cd trove
git checkout stable/newton
pip install -r requirements.txt
# 如果使用python setup.py develop将不会安装trove时python的path,使用作一个指向
# python setup.py develop
python setup.py install

6、创建数据库

mysql -hmariadb_host -uroot -p 
CREATE DATABASE trove;
GRANT ALL PRIVILEGES ON trove.* TO 'trove'@'%' IDENTIFIED BY '123456';

7、创建trove的user,endpoint

# user
openstack user create --domain default --password-prompt trove
openstack role add --project service --user trove admin
openstack user set --project service trove

# service
openstack service create --name trove \
  --description "Database" database

# endpoint
openstack endpoint create --region RegionOne \
  database public http://node1_ip:8779/v1.0/%\(tenant_id\)s
openstack endpoint create --region RegionOne \
  database internal http://node1_ip:8779/v1.0/%\(tenant_id\)s
openstack endpoint create --region RegionOne \
  database admin http://node1_ip:8779/v1.0/%\(tenant_id\)s

8、准备配置文件

mkdir -p ~/log/trove
mkdir -p /etc/trove
cd trove
cp etc/trove/trove.conf.sample /etc/trove/trove.conf
cp etc/trove/api-paste.ini /etc/trove/
cp etc/trove/trove-taskmanager.conf.sample /etc/trove/trove-taskmanager.conf
cp etc/trove/trove-guestagent.conf.sample /etc/trove/trove-guestagent.conf
cp etc/trove/trove-conductor.conf.sample /etc/trove/trove-conductor.conf

cd /etc/trove

9、配置trove

  • 编辑 trove.conf, trove-taskmanager.conf and trove-conductor.conf

[DEFAULT]
log_dir = /home/a/log/trove
log_file = trove-api.log

如果是trove-taskmanager.conf
log_file = trove-taskmanager.log

如果是trove-conductor.conf
log_file = trove-conductor.log

auth_strategy = keystone
trove_auth_url = http://node0_ip:5000/v2.0
nova_compute_url = http://node0_ip:8774/v2
cinder_url = http://node0_ip:8776/v1 # traskmanager.conf中未配置些项 
#swift_url = http://node0_ip:8080/v1/AUTH_
notifier_queue_hostname = node0_ip

[database]
connection = mysql+pymysql://trove:123456@node0_ip/trove


[DEFAULT]
rpc_backend=rabbit


[oslo_messaging_rabbit]
rabbit_host=node0_ip
rabbit_port=5672
rabbit_userid=openstack
rabbit_password=rabbit_password
  • 编辑trove.conf

[DEFAULT]
auth_strategy = keystone
add_addresses = True
# network_label_regex = ^NETWORK_LABEL$ # nova-network 配置此项
network_label_regex = .* # neutron 配置此项
api_paste_config = /etc/trove/api-paste.ini

max_accepted_volume_size = 10 # 每instance可以使用最大cinder volume size


[keystone_authtoken]
...
auth_uri = http://node0_ip:5000
auth_url = http://node0_ip:35357
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = trove
password = 123456
  • 编辑trove-taskmanager.conf

[DEFAULT]
nova_proxy_admin_user = trove
nova_proxy_admin_pass = TROVE_PASS
nova_proxy_admin_tenant_name = service
taskmanager_manager = trove.taskmanager.manager.Manager
#nova_proxy_admin_tenant_id =

network_driver = trove.network.nova.NovaNetwork
default_neutron_networks =

# 若启用安全组,创建trove实例中会有报错,"From port must be an integer."
trove_security_groups_support = False

# 如果在guest agent运行在centos7中,需要配置以下几项
guest_config = /etc/trove/trove-guestagent.conf
guest_info = guest_info
injected_config_location = /etc/trove/
cloudinit_location = /etc/trove/cloudinit
  • 编辑 trove-guestagent.conf

[DEFAULT]
log_dir = /var/log/trove/
#log_file = logfile.txt
#log_config_append = /etc/trove/trove-logging-guestagent.conf
#log_dir = /home/a/log/trove/
log_file = trove-guestagent.log

rpc_backend=rabbit

[oslo_messaging_rabbit]
rabbit_host=node0_ip
rabbit_port=5672
rabbit_userid=openstack
rabbit_password = rabbit_password

[DEFAULT]
nova_proxy_admin_user = admin
nova_proxy_admin_pass = ADMIN_PASS
nova_proxy_admin_tenant_name = service
trove_auth_url = http://node0_ip:35357/v2.0

10、 Populate trove database

trove-manage --config-file /etc/trove/trove.conf  db_sync

11、 启动servie

su - a
screen -S trove-api trove-api \
   --config-file /etc/trove/trove.conf

screen -S trove-taskmanager trove-taskmanager \
  --config-file /etc/trove/trove-taskmanager.conf

screen -S trove-conductor trove-conductor \
  --config-file /etc/trove/trove-conductor.conf

四、使用trove

1、下载并上传mysql p_w_picpath

wget http://tarballs.openstack.org/trove/p_w_picpaths/ubuntu/mysql.qcow2
glance p_w_picpath-create --name "mysqlTest" --disk-format qcow2 \
  --container-format bare \
  --file mysql.qcow2

2、Create a datastore

trove-manage \
  --config-file /etc/trove/trove.conf \
  datastore_update mysql ''

3、Update the datastore to use the new p_w_picpath

# glance_p_w_picpath_ID替换为上面mysqlTest的ID,glance_p_w_picpath_ID后面的有一对单引号,引号间无空白字符
trove-manage --config-file /etc/trove/trove.conf \
  datastore_version_update \
  mysql mysql-5.6 mysql glance_p_w_picpath_ID '' 1

4、创建一个mysql实例

# mysql_instance_1后面的2为flavor的ID,可替换为别的flovar id,--size 为cinder volume的大小
trove create mysql_instance_1 2 --size 5 --databases myDB \
    --users userA:password --datastore_version mysql-5.6 \
    --datastore mysql

五、补充说明

1、20170105补充说明

在20170105,python-novaclient已经发布7.0.0,在源码安装trove过程中,默认安装python-novaclient(7.0.0),导致trove list报错,需要将python-novaclient替换为6.0.0

pip uninstall python-novaclient
pip install python-novaclient==6.0.0

2、20170419补充说明

在20170419,newton 中的bug,导致trove list报错,此bug已经在ocata中修复

stable/newton 6a7d1aa

trove/common/remote.py 101行

    client = Client(CONF.nova_client_version, context.user, context.auth_token,
                    bypass_url=url, tenant_id=context.tenant,
                    auth_url=PROXY_AUTH_URL)

context.auth_token需要修改为auth_token=contex.auth_token,Client第三个参数为password,传入contex.auth_token会导致keytone认证失败。