版权声明:本博客欢迎转载,转载时请以超链接形式标明文章原始出处!谢谢!
博客地址:http://blog.csdn.net/i_chips
Ubuntu下Swift、Keystone和Horizon安装集成小结
崔炳华
2013年12月4日
注意,python-keystoneclient与Keystone的版本需要统一,否则可能会出现版本兼容性问题,采用依赖项的方式安装python-keystoneclient,可确保不会出现版本兼容性问题。
“网速较慢”或者“安装软件失败”的情况下,可以考虑替换成国内的镜像:
vsroot@ubuntu:~$ sudo sed -i's#us.archive.ubuntu.com#mirrors.163.com#g' /etc/apt/sources.list
vsroot@ubuntu:~$ sudo apt-get update
vsroot@ubuntu:~$ date #查看系统时间是否正确,正确的话则忽略下面两步
vsroot@ubuntu:~$ sudo date -s"2013-11-04 15:05:57" #设置系统时间
vsroot@ubuntu:~$ sudo hwclock –w #写入硬件时间
请确保已关闭SELinux。
vsroot@ubuntu:~$ sudo ufw disable #关闭防火墙
Swift多节点或者单节点的安装流程,具体请参考本人写的《Ubuntu下Swift多节点安装测试小结》或者《Ubuntu下Swift单节点安装测试小结》,本文不再介绍。
root@ubuntu:~$ sudo apt-get installpython-dev libxml2-dev libxslt1-dev libsasl2-dev libsqlite3-dev libssl-devlibldap2-dev
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
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
初始化并同步数据库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)。
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 #使之立即生效
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
新建租户,会生成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
访问认证授权地址,预期都会成功获取授权:
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
Swift需要通过Keystone来完成用户的身份认证与权限控制,而不是采用自带的TempAuth。
修改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]部分实际上将不再生效。
root@ubuntu:~/keystone$ sudo swift-initproxy restart
为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
这一步会获取到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服务了。
检测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
root@ubuntu:~$ sudo apt-get install gcc python-devlibxml2-dev libxslt1-dev apache2
root@ubuntu:~$ git clonehttps://github.com/openstack/horizon.git
root@ubuntu:~$ cd horizon
root@ubuntu:~/horizon$ ./run_tests.sh
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
由于Swift服务已经占用了8080端口,所以作为同一个节点上的Horizon服务,就不能再使用8080端口了,这里不妨改成8088端口:
root@ubuntu:~/horizon$ tools/with_venv.sh./manage.py runserver 172.17.10.14:8088
现在可以尝试通过IE浏览器访问:
通过IE浏览器访问,虽然可以通过Keystone认证,但还是会抛出诸如此类的异常:ServiceCatalogException和Invalid servicecatalog service: compute。
接下来,我们需要修改Horizon代码,屏蔽掉其对Nova的调用,才能够解决上面这个问题。
首先,需要为~/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了,效果如下图所示:
现在,我们就可以通过“块存储/容器”来对Swift进行管控,例如Container和Object的增删改查等。
Swift的相关日志会输出到var/log/syslog中。
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。
使用“telnet IPPORT”或者“lsof -i PORT”命令查看端口。Proxy Node上主要关注端口11211/8080/2021等,Storage Node上主要关注Ring的相关端口,如6000/6001/6002等。
Swift牺牲一定程度的数据一致性,来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。
由于Swift的弱一致性,所以在刚刚新建或刚刚删除一个文件后,我们立即去查看,可能看到的结果不符合预期,稍等一会儿再查看,就正常了。
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