[置顶] Ubuntu下Swift、Keystone和Horizon安装集成小结

版权声明:本博客欢迎转载,转载时请以超链接形式标明文章原始出处!谢谢!
博客地址:http://blog.csdn.net/i_chips


Ubuntu下Swift、Keystone和Horizon安装集成小结

崔炳华

2013年12月4日

1       环境准备

1.1        版本

  • Linux系统版本:Ubuntu Server 12.04.1 LTS;
  • Python版本:2.7.3(稍后安装);
  • Swift版本:1.8.0(稍后安装);
  • Python-swiftclient版本:1.8.0(稍后安装);
  • Keystone版本:0.4.1(稍后安装);
  • Python-keystoneclient版本:0.4.1(稍后安装);

注意,python-keystoneclient与Keystone的版本需要统一,否则可能会出现版本兼容性问题,采用依赖项的方式安装python-keystoneclient,可确保不会出现版本兼容性问题。

1.2        节点IP

  • Proxy Node IP/Auth Node IP:172.17.10.14。

1.3        替换镜像(可选步骤)

“网速较慢”或者“安装软件失败”的情况下,可以考虑替换成国内的镜像:

vsroot@ubuntu:~$ sudo sed -i's#us.archive.ubuntu.com#mirrors.163.com#g' /etc/apt/sources.list

vsroot@ubuntu:~$ sudo apt-get update

1.4        系统时间

vsroot@ubuntu:~$ date #查看系统时间是否正确,正确的话则忽略下面两步

vsroot@ubuntu:~$ sudo date -s"2013-11-04 15:05:57" #设置系统时间

vsroot@ubuntu:~$ sudo hwclock –w #写入硬件时间

1.5        关闭防火墙

请确保已关闭SELinux。

vsroot@ubuntu:~$ sudo ufw disable #关闭防火墙

2      安装Swift

Swift多节点或者单节点的安装流程,具体请参考本人写的《Ubuntu下Swift多节点安装测试小结》或者《Ubuntu下Swift单节点安装测试小结》,本文不再介绍。

3      安装Keystone

3.1        安装相关库

root@ubuntu:~$ sudo apt-get installpython-dev libxml2-dev libxslt1-dev libsasl2-dev libsqlite3-dev libssl-devlibldap2-dev

3.2        安装Keystone库

root@ubuntu:~$ git clonehttps://github.com/openstack/keystone.git

root@ubuntu:~$ cd keystone

root@ubuntu:~/keystone$ pythontools/install_venv.py

root@ubuntu:~/keystone$ sudo pip install -rrequirements.txt #安装Keystone依赖库

以下两条命令可以确认Keystone是否安装成功:

root@ubuntu:~/keystone$ source.venv/bin/activate

root@ubuntu:~/keystone$ python

3.3        配置Keystone

root@ubuntu:~/keystone$ mkdir -p/etc/keystone

root@ubuntu:~/keystone$ cp ~/keystone/etc/*/etc/keystone/

root@ubuntu:~/keystone$ mv/etc/keystone/keystone.conf.sample /etc/keystone/keystone.conf

root@ubuntu:~/keystone$ mv/etc/keystone/logging.conf.sample /etc/keystone/logging.conf

Keystone的核心配置文件是/etc/keystone/keystone.conf,如果不希望采用默认值,可对其手动设置,例如:

public_bind_host = 172.17.10.14

admin_bind_host = 172.17.10.14

3.4        启动Keystone服务

初始化并同步数据库schema,Keystone会自动连接数据库,完成Table创建等工作(该命令在哪个目录执行,keystone.db就在哪里生成,并会同步到/etc/keystone/下):

root@ubuntu:~/keystone$ keystone-managedb_sync

初始化证书到/etc/keystone/ssl(以哪个用户来配置的keystone,就写哪个用户):

root@ubuntu:~/keystone$ keystone-managepki_setup --keystone-user root --keystone-group root

启动Keystone服务:

root@ubuntu:~/keystone$ sudo keystone-all

注意,上面这条命令必须在~/keystone这个目录下以root身份执行,否则后续使用keystoneuser-list等命令时,可能会报如下错:An unexpected error prevented the server from fulfilling yourrequest. (OperationalError) no such table: domain u'SELECT domain.id ASdomain_id, domain.name AS domain_name, domain.enabled AS domain_enabled,domain.extra AS domain_extra \nFROM domain \nWHERE domain.id = ?' ('default',)(HTTP 500)。

3.5        导入环境变量

root@ubuntu:~/keystone$ exportSERVICE_TOKEN=ADMIN

root@ubuntu:~/keystone$ exportSERVICE_ENDPOINT=http://172.17.10.14:35357/v2.0

root@ubuntu:~/keystone$ vim ~/.bashrc

export SERVICE_TOKEN=ADMIN

exportSERVICE_ENDPOINT=http://172.17.10.14:35357/v2.0

root@ubuntu:~/keystone$ . ~/.bashrc #使之立即生效

3.6        Keystone常用查看命令

root@ubuntu:~/keystone$ keystonetenant-list

root@ubuntu:~/keystone$ keystoneuser-list

root@ubuntu:~/keystone$ keystone role-list

root@ubuntu:~/keystone$ keystoneservice-list

root@ubuntu:~/keystone$ keystoneendpoint-list

3.7        Keystone常用创建命令

新建租户,会生成Tenantid:

root@ubuntu:~/keystone$ keystonetenant-create --name adminTenant --description "Admin Tenant"--enabled true

新建用户,需要用到上一步的Tenantid:

root@ubuntu:~/keystone$ keystoneuser-create --tenant_id 095d76c15c774e0e98164dcec5ca53b3 --name admin --passopenstack --enabled true

新建角色,会生成Roleid:

root@ubuntu:~/keystone$ keystonerole-create --name adminRole

为用户增加角色,将刚才创建的User、Tenant和Role关联起来:

root@ubuntu:~/keystone$ keystoneuser-role-add \

--user-id 8c6129dcbd5e48f1bf2b6046e0d3a96b \

--tenant-id 095d76c15c774e0e98164dcec5ca53b3\

--role-id e8be8ab4927846bd97f5ade85790d32a

3.8        访问Keystone获取Token

访问认证授权地址,预期都会成功获取授权:

root@ubuntu:~/keystone$ curl -d'{"auth": {"tenantName": "adminTenant","passwordCredentials":{"username": "admin", "password":"openstack"}}}' -H"Content-type: application/json" http://172.17.10.14:35357/v2.0/tokens | python -mjson.tool

root@ubuntu:~/keystone$ curl -d'{"auth": {"tenantName": "adminTenant","passwordCredentials":{"username": "admin", "password":"openstack"}}}' -H"Content-type: application/json" http://172.17.10.14:5000/v2.0/tokens | python -mjson.tool

4      Swift和Keystone的调试

Swift需要通过Keystone来完成用户的身份认证与权限控制,而不是采用自带的TempAuth。

4.1        修改Swift配置文件

修改Swift中的proxy-server配置文件/etc/swift/proxy-server.conf。在其中添加authtoken与keystoneauth组件,并将pipeline中的tempauth改为authtoken与keystoneauth,表示采用Keystone而不是TempAuth来完成用户身份认证和权限控制。

authtoken是python-keystoneclient中的组件,用于访问Keystone;keystoneauth是Swift中的组件,用于一些附加的条件设置。

root@ubuntu:~/keystone$ vim /etc/swift/proxy-server.conf

[DEFAULT]

#cert_file = /etc/swift/cert.crt

#key_file = /etc/swift/cert.key

bind_port = 8080

workers = 8

user = swift

 

[pipeline:main]

#pipeline = healthcheck cache tempauthproxy-logging proxy-server

pipeline = healthcheck cache authtoken keystoneauth proxy-logging proxy-server

 

[app:proxy-server]

use = egg:swift#proxy

allow_account_management = true

account_autocreate = true

set log_level = DEBUG

set log_name = proxy-server

 

[filter:proxy-logging]

use = egg:swift#proxy_logging

 

[filter:tempauth]

use = egg:swift#tempauth

user_system_root = testpass .adminhttps://172.17.10.14:8080/v1/AUTH_system

set log_level = DEBUG

set log_name = tempauth

 

[filter:authtoken]

paste.filter_factory =keystoneclient.middleware.auth_token:filter_factory

auth_host = 172.17.10.14

auth_port = 35357

auth_protocol = http

service_host = 172.17.10.14

service_port = 5000

admin_token = ADMIN

set log_level = DEBUG

set log_name = authtoken

 

[filter:keystoneauth]

use = egg:swift#keystoneauth

operator_roles = adminRole, swiftoperator

reseller_prefix = AUTH_

set log_level = DEBUG

set log_name = keystoneauth

 

[filter:healthcheck]

use = egg:swift#healthcheck

 

[filter:cache]

use = egg:swift#memcache

memcache_servers = 172.17.10.14:11211

可以看到,涉及到的改动部分为[DEFAULT]和[pipeline:main];新增部分为[filter:authtoken]和[filter:keystoneauth](其中set log_level和set log_name是可选的,用于增强日志),而[filter:tempauth]部分实际上将不再生效。

4.2        重启Swift服务

root@ubuntu:~/keystone$ sudo swift-initproxy restart

4.3        创建Service和Endpoint

为Swift创建Service,会生成Serviceid:

root@ubuntu:~/keystone$ keystoneservice-create --name=Swift --type=object-store --description="SwiftObject Store Service"

为Swift创建Endpoint,会用到Serviceid和之前创建的Tenant id:

root@ubuntu:~/keystone$ keystoneendpoint-create --region RegionOne \

--service_id b645a621b27b476ea897cc51563ee73e--publicurl \

http://172.17.10.14:8080/v1/AUTH_10da1dc312164b98ae96f865ea9d2224 \

--adminurl http://172.17.10.14:8080 --internalurl \

http://172.17.10.14:8080/v1/AUTH_10da1dc312164b98ae96f865ea9d2224

考虑到稍后我们还会运行Horizon,所以我们需要为我们的Keystone也创建一个Service以及相应的Endpoint。否则,Horizon将无法通过Keystone来获得Keystone的服务端口。

为Keystone创建Service,会生成Serviceid:

root@ubuntu:~/keystone$ keystoneservice-create --name=Keystone --type=identity --description="KeystoneIdentity Service"

为Keystone创建Endpoint,会用到Serviceid:

root@ubuntu:~/keystone$ keystone endpoint-create --region RegionOne \

--service-id 8ffef26fe4544cb7803c299bee2aadfc \

--publicurl http://controller:5000/v2.0  \

--internalurl http://controller:5000/v2.0  \

--adminurl http://controller:35357/v2.0

4.4        测试curl命令

这一步会获取到Tokenid:

root@ubuntu:~/keystone$ curl -d'{"auth": {"tenantName": "adminTenant","passwordCredentials":{"username": "admin", "password":"openstack"}}}' -H"Content-type: application/json" http://172.17.10.14:5000/v2.0/tokens | python -mjson.tool

接着就可以用获取到的Tokenid和Endpoint访问Swift服务了。

4.5        测试swift命令

检测swift命令是否正常工作,预期输出应为zero containers、zero objects和zero bytes:

root@ubuntu:~/keystone$ swift -V 2 -A http://172.17.10.14:5000/v2.0 -U adminTenant:admin -K openstack stat

新建一级子目录mycontainer1:

root@ubuntu:~/keystone$ swift -V 2 -A http://172.17.10.14:5000/v2.0 -U adminTenant:admin -K openstack postmycontainer1

把本地指定文件上传到一级子目录mycontainer1中:

root@ubuntu:~/keystone$ swift -V 2 -A http://172.17.10.14:5000/v2.0 -U adminTenant:admin -K openstack uploadmycontainer1 /etc/swift/*.builder

列出根目录的细节:

root@ubuntu:~/keystone$ swift -V 2 -A http://172.17.10.14:5000/v2.0 -U adminTenant:admin -K openstack list

列出一级子目录的细节:

root@ubuntu:~/keystone$ swift -V 2 -A http://172.17.10.14:5000/v2.0 -U adminTenant:admin -K openstack listmycontainer1

删除一级子目录mycontainer1下的某个指定文件:

root@ubuntu:~/keystone$ swift -V 2 -A http://172.17.10.14:5000/v2.0 -U adminTenant:admin -K openstack deletemycontainer1 etc/swift/account.builder

把一级子目录mycontainer1中的资源都下载到本地当前目录:

root@ubuntu:~/keystone$ swift -V 2 -A http://172.17.10.14:5000/v2.0 -U adminTenant:admin -K openstack downloadmycontainer1

5      安装Horizon

5.1        安装相关库

root@ubuntu:~$ sudo apt-get install gcc python-devlibxml2-dev libxslt1-dev apache2

5.2        安装Horizon库

root@ubuntu:~$ git clonehttps://github.com/openstack/horizon.git

root@ubuntu:~$ cd horizon

root@ubuntu:~/horizon$ ./run_tests.sh

5.3        配置Horizon

root@ubuntu:~/horizon$ cpopenstack_dashboard/local/local_settings.py.exampleopenstack_dashboard/local/local_settings.py

root@ubuntu:~/horizon$ sudo perl -pi -e"s/"127.0.0.1"/"172.17.10.14"/" openstack_dashboard/local/local_settings.py# 把OPENSTACK_HOST的默认IP改成自己的IP

5.4        启动Horizon服务

由于Swift服务已经占用了8080端口,所以作为同一个节点上的Horizon服务,就不能再使用8080端口了,这里不妨改成8088端口:

root@ubuntu:~/horizon$ tools/with_venv.sh./manage.py runserver 172.17.10.14:8088

现在可以尝试通过IE浏览器访问:

  • 链接:http://172.17.10.14:8088
  • 用户名:admin
  • 密码:openstack

通过IE浏览器访问,虽然可以通过Keystone认证,但还是会抛出诸如此类的异常:ServiceCatalogException和Invalid servicecatalog service: compute。

接下来,我们需要修改Horizon代码,屏蔽掉其对Nova的调用,才能够解决上面这个问题。

5.5        修改Horizon代码

首先,需要为~/horizon/openstack_dashboard/usage/base.py中的get_limits和summarize两个函数增加一个return语句(相当于空函数),以避免后续调用Nova时抛出异常。

    def get_limits(self):
        return

    def summarize(self, start, end):
        return

其次,需要为~/horizon/openstack_dashboard/usage/views.py中的get_context_data函数屏蔽掉和api.nova.extension_supported相关的两行代码,以避免后续调用Nova时抛出异常。

    def get_context_data(self,**kwargs):
        context = super(UsageView,self).get_context_data(**kwargs)
        context['table'].kwargs['usage'] =self.usage
        context['form'] = self.usage.form
        context['usage'] = self.usage
        # context['simple_tenant_usage_enabled']= \
        #   api.nova.extension_supported('SimpleTenantUsage', self.request)
        return context

接下来,就可以通过通过IE浏览器访问http://172.17.10.14:8088了,效果如下图所示:

[置顶] Ubuntu下Swift、Keystone和Horizon安装集成小结_第1张图片

现在,我们就可以通过“块存储/容器”来对Swift进行管控,例如Container和Object的增删改查等。

6      调试手段

6.1        日志查询

Swift的相关日志会输出到var/log/syslog中。

6.2        增强日志

var/log/syslog可能日志太少影响定位问题,我们可以增强日志。参考http://docs.openstack.org/developer/swift/deployment_guide.html#account-server-configuration,可以在/etc/swift/proxy-server.conf等配置文件中设定log的输出等级为DEBUG。

例如,/etc/swift/proxy-server.conf文件中,[app:proxy-server]这一部分追加了setlog_level = DEBUG,[filter:tempauth]这一部分追加了set log_level = DEBUG。

6.3        查看端口

使用“telnet IPPORT”或者“lsof -i PORT”命令查看端口。Proxy Node上主要关注端口11211/8080/2021等,Storage Node上主要关注Ring的相关端口,如6000/6001/6002等。

7      小结

Swift牺牲一定程度的数据一致性,来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。

由于Swift的弱一致性,所以在刚刚新建或刚刚删除一个文件后,我们立即去查看,可能看到的结果不符合预期,稍等一会儿再查看,就正常了。

8      参考资料

1) 《Setting up aKeystone development environment》,http://docs.openstack.org/developer/keystone/setup.html

2) 《Developing with Keystone》,http://docs.openstack.org/developer/keystone/developing.html

3) 《OpenStack Keystone安装部署流程》,http://www.cnblogs.com/fczjuever/p/3278072.html

4) 《OpenStack Swift集群与Keystone的整合使用说明》,http://www.cnblogs.com/fczjuever/p/3278138.html

5) 《Horizon Quickstart》,http://docs.openstack.org/developer/horizon/quickstart.html

你可能感兴趣的:(ubuntu,openstack,swift,keystone,horizon)