OpenStack云计算实战手册(第3版)

978-7-115-47242-7
作者: 【英】凯文•杰克逊(Kevin Jackson) 【美】科迪•邦奇(Cody Bunch) 【美】埃格尔•西格勒(Egle Sigler)
译者: 宋秉金黄凯杜玉杰
编辑: 杨海玲

图书目录:

详情

本书全面讲解OpenStack的方方面面,每一章均提供每种服务的真实且实用的示例,使读者能使用和实践OpenStack的最新特性,旨在帮助读者快速上手OpenStack,在理解的基础上将OpenStack应用到自己的数据中心。本书涵盖了安装和配置一个私有云的各种内容。这是第一本除了介绍OpenStack核心组件,还对运维和高可用性有更多实际描述的书籍。

图书摘要

版权信息

书名:OpenStack云计算实战手册(第3版)

ISBN:978-7-115-47242-7

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    [英] 凯文•杰克逊(Kevin Jackson)

       [美] 科迪•邦奇(Cody Bunch)

       [美] 埃格尔•西格勒(Egle Sigler)

  译    宋秉金 黄 凯 杜玉杰

  责任编辑 杨海玲

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


Copyright © 2015 Packt Publishing. First published in English under the title OpenStack Cloud Computing Cookbook, Third Edition.

All rights reserved.

本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


OpenStack是一个用于构建公有云和私有云的开源软件。本书全面讲解OpenStack的方方面面,每一章均提供每种服务的真实且实用的示例,使读者能使用和实践OpenStack的最新特性,旨在帮助读者快速上手OpenStack,在理解的基础上将OpenStack应用到自己的数据中心。

本书涵盖了安装和配置一个私有云的各种内容:如何安装和配置OpenStack的所有核心组件,并运行一个可管理和可运维的环境;如何掌握一个完整的私有云软件栈,从计算资源的扩容到管理高冗余、高可用的对象储存服务。这一版除了对原有章节内容进行了更新和优化,还新增了关于OpenStack网络服务的全面介绍,让读者了解如何对整个云基础设施进行精细化控制。

本书适合熟悉云计算平台并正在从虚拟化环境过渡到云计算环境的系统管理员和架构师阅读。


宋秉金 硕士,目前在国内领先的云计算公司腾讯云工作,专注开发者运营及传播云计算最新趋势,致力于帮助中小开发者快速上云。他毕业于北京外国语大学高级翻译学院,有着丰富的技术翻译经验;Python学习型社区“编程派”的发起人,通过同名公众号与数万名Python编程爱好者分享技术经验、传播最新技术资讯。他也是《Python参考手册(第四版•修订版)》的审校者。

黄 凯 有十几年的IT行业工作经验,是一名技术跨度很广的IT专家,大部分时间使用各种语言在编程或者撰写技术资料,有着企业级数据中心、SOA、语义网、编译系统、分布式计算和保险金融业务系统方面的技术背景和专利,并通过 EMC、VMware、IBM、微软等多项认证。目前,他在 IBM x86 软件团队担任云计算解决方案资深架构师,研究私有/混合/公有云计算环境的管理运维和开源云平台的应用创新工作,并主持撰写了OpenStack企业参考架构红皮书。过往的工作经历包括在一家全球领先的数据存储公司担任首席工程师,以及在一家中间件平台公司担任虚拟服务器架构师。

黄凯拥有应用数学的学士学位和软件工程的硕士学位,他经常应邀在一些技术博客上撰文或作为创业项目的评委,并不定期在他的微博www. weibo.com/topkai上发表关于云计算技术的见解和点评。

杜玉杰 硕士,开源顾问,中国OpenStack社区(COSUG)发起人,关注社区运营和商务拓展相关方向,先后为IBM、HP、EMC、VMWare等企业提供开源相关咨询服务,目前担任OpenStack基金会董事,企业级云计算联盟(ECA)副秘书长、华为开源顾问、红帽OpenStack认证培训讲师、HP培训部兼职讲师,曾为北航云计算硕士班、上海交大移动去计算硕士班授课。可以通过微博“@ben_杜玉杰”交流开源相关话题。


凯文·杰克逊(Kevin Jackson)是一名经验老道的信息技术(IT)专业人士,目前在Rackspace作为OpenStack及私有云的专家,为各种规模的企业提供服务。他从2011年初就开始接触OpenStack,拥有各种Linux和Unix操作系统方面的丰富经验。他的Twitter账号是@itarchitectkev。

他是本书第1版的作者,合著了第2版。他还在加利福尼亚一次为期5天的快速写书活动中与人合著了OpenStack基金会的《OpenStack架构设计指南》。

我要感谢科迪担任起更新本书的艰巨任务。还要感谢埃格尔对本书出版的支持。本书的技术审稿人来自全球各地,帮助我们成功地达到了更新本书的目的。

我还要感谢我的家人,尽管我不确定他们意识到我又写了一本书。我想这次应该没人会再抱怨我了。

最后,我要感谢Rackspace给我机会,并支持我写这本书;还要感谢我打扰的许多朋友,感谢他们耐心回答我的问题。

科迪·邦奇(Cody Bunch)是Rackspace主机业务的一名私有云架构师。他从2012年开始接触OpenStack,合著了本书的第2版,以及《OpenStack架构设计指南》。他在IT行业有15年的从业经验,从事过SaaS、VoIP、虚拟化等方面的工作。他的Twitter账号是@cody_bunch。

我要感谢凯文再次和我一起完成这本书。还要感谢埃格尔不遗余力地让本书变得更好。如果没有众多审稿人及Packt出版社同事的支持,就不会有本书的最新版问世。

接下来,更重要的是,我要感谢我的孩子们和太太。没有他们的支持,我无法保证能够及时完稿。同样,还需要感谢我的雇主Rackspace的支持与理解。

最后,我要感谢所有的作者、出版社、审稿人及我的老板。虽然参与本版编写和出版工作的人并不多,我想还是要感谢OpenStack社区,他们是本书的理想读者人群。你们不仅给予了支持和技术指导,还是新版上市的重要理由。感谢大家!

埃格尔·西格勒(Egle Sigler)是OpenStack基金会的董事,还是Rackspace私有云团队的一名架构师。她拥有计算机科学硕士学位。她的第一份工作是软件开发,并且仍对那些编写、测试和部署代码的人感到十分亲切,因为在过去的职业生涯中她也亲身经历过所有这些工作。埃格尔梦想有一天编写、测试、部署代码将会成为一个无缝、轻松的过程,不会出现bug和令人绝望的情况。埃格尔相信知识应该共享,参与本书的编写就是一种尝试。另外她还积极演讲,组织大会上的研讨会,写博客。埃格尔的Twitter账号是@eglute。

她与人合著了《DevOps实战:VMware管理员运维方法、工具及最佳实践》。

我要感谢我的丈夫对我写作本书的坚定支持,他不仅是我的爱人,还是我的技术顾问,对本书提出了许多建议。由于某些原因,网络部分的章节需要重点排错。

我希望朋友和家人能够谅解,在写作本书时无法联系到我。

还要感谢所有的OpenStack开发者、质量工程师、运营商、用户以及文档作者,感谢你们让OpenStack不断完善。

感谢凯文和科迪让我加入本书的写作。我不敢相信本书之前已经拥有如此优秀的内容,以及那些便利的Vagrant环境脚本。感谢技术审稿人自愿投入数百个小时进行细致的审校。感谢Packt出版社的审稿人和编辑及时地沟通和反馈。感谢Rackspace的各位同事提供建议和指导。最后,感谢Rackspace支持我参与本书写作。


克里斯·贝蒂(Chris Beatty)是一位专业IT人员,在系统管理、基础架构方面有着丰富的经验。他目前在Rackspace工作,帮助企业客户设计、运行高性能的企业解决方案。

我想要感谢我的妻子和孩子,让我花时间进行本书的审稿;还要感谢同事请我参与审稿。

沃尔特·本特利(Walter Bentley)是Rackspace公司的私有云解决方案架构师。他是公司的新员工,在生产系统管理和解决方案架构方面有着广泛的涉猎。他有着17年的工作经验,参与过不同行业的IT系统设计,包括在线营销、财务、保险、航空、食品和教育行业。过去他一直为使用OpenStack等技术的公司提供咨询服务。现在,他是OpenStack技术的倡导者,同时从事云教育。

我由衷地感谢作者邀请我参与这本优秀图书的出版工作。

维多利亚·马丁内斯·克鲁兹(Victoria Martinez de la Cruz)是阿根廷苏尔国立大学计算机科学与工程学院的计算机科学硕士。在大学的最后几年,她通过GNOME的推广项目以及谷歌的编程之夏实习接触了OpenStack。她目前是Red Hat公司的一名软件工程师,OpenStack Trove和Zaqar项目的核心成员。她的主要兴趣是操作系统、网络和数据库。她还热衷于自由和开源软件,喜欢帮助新人参与开源项目。你可通过victoria@vmartinezdelacruz.com联系维多利亚。

我要感谢《OpenStack云计算实战手册(第3版)》的作者及出版社给我机会成为本书的技术审稿人。很难得的经历!

斯蒂芬·伦兹(Stefan Lenz)在慕尼黑的宝马公司工作。他是宝马全球IT组织的数据中心及云服务部门的一位经理,负责为全球的宝马业务交付计算、存储和网络服务。

他拥有德国埃朗根大学的核物理学博士学位,并在耶鲁大学从事过博士后研究,利用高性能计算机进行核物理研究。在成为高性能计算机IT架构师、加入宝马之前,他曾是德国汽车行业的高性能计算顾问。从2002年到2014年,他参与了多个整合宝马IT组织的计划和项目。

他目前与家人居住在慕尼黑,喜欢在阿尔卑斯山滑雪、徒步和骑行。他与妻子一起写了六本有关徒步、山地骑行和西班牙圣地亚哥朝圣之路的图书。读者可以通过Twitter关注@stefan_km_lenz,或通过他的网站www.serverfabrik.de联系他。

2014年夏,我在家里地下室中废寝忘食地学习OpenStack知识。当时使用的就是本书的第1版。我要感谢作者给我的巨大帮助。我还要感谢妻子的支持和耐心,感谢她给我的私人实验室捐献了两台她公司的旧计算机。

安迪·麦克雷(Andy McCrae)是Rackspace私有云团队的一名软件工程师。安迪于2007年参加工作,从伦敦大学学院拿到计算机科学工程硕士学位之后,他成为了Rackspace的一名Linux系统管理员。

安迪精通Swift(对象管理)和Ansidble。他还曾是OpenStack Chef项目的核心贡献者,现在正在从事OpenStack中Ansible部署相关的社区项目。

近期,他还在温哥华OpenStack峰会上演讲,分享如何管理OpenStack环境中的日志。

梅利莎·帕尔默(Melissa Palmer)是一名系统工程师和架构师,热衷于虚拟化、基础设施和OpenStack。她拥有工程学士和硕士学位,主攻电力工程和安全网络系统设计。她是VMUG成员,积极倡导社区发展,参与过多个IT架构和社区项目的专家讨论和播客节目。她还是虚拟设计大师挑战(Virtual Design Master Challenge)的创意总监,网址是http://virtualdesignmaster.com。梅利莎业余喜欢烹饪、写作及观看火箭发射。她的Twitter账号是@vMiss33,还可通过博客http://vMiss.net联系她。

希拉姆·拉詹(Sirram Rajan)是Rackspace的高级工程师,负责为客户设计解决方案并协助自动化实施。加入Rackspace之前,他曾是得克萨斯州立大学的系统程序员,在那里拿到了计算机科学的硕士学位。他还具备十余年的专业经验,精通Linux系统、网络、编程和安全。在业余时间,他喜欢旅行,动手自创家庭自动化,观看曲棍球比赛,写写有趣的程序,以及与人讨论技术话题。


在欧洲核子研究会(CERN),物理学家们和工程师们致力于探究宇宙的基本结构。他们使用世界上最大最复杂的科学仪器,研究物质的基本构成——基本粒子。他们让基本粒子以接近光的速度进行碰撞。碰撞的过程能够帮助物理学家理解原子间如何交互,从而探索自然界的基本法则。

大型强子对撞机(LHC)是全球规模最大、性能最强的粒子加速器,由27千米长的超导磁铁以及许多加速结构组成,用于提升粒子的能量。在加速器中,两个高能粒子光束在碰撞之前,以接近光速行进。这里每年会产生27 PB的数据,由CERN数据中心的数千台计算机记录并进行分析。

2015年大型强子对撞机进行了升级,碰撞产生的能量几乎翻倍。很明显科学家们需要更多的计算资源。为了提供额外的资源,更快地响应用户的需求,CERN采取了一种新的策略。2012年,CERN的一个小团队开始研究如何利用OpenStack这个开源软件搭建云计算。这是一个非常有前途的技术,社区也十分热情,但是复杂度很高。由于当时代码还较新,相应的文档和培训比较缺乏。我们想快速培训人员启动项目,因此要寻找提高管理员效率的指南。这时我们发现了《OpenStack实战手册》的第1版。它成为了团队新人加入后必看的标准文档,以便帮助他们快速了解相关概念,搭建第一个云环境,然后再投入CERN云环境进行工作。

随着云环境不断研究,OpenStack慢慢成熟,即使团队成员一直在变化,我们仍继续使用本书作为指导,构建小型云环境来尝试新的概念,调研云计算的灵活性。

多年来,我们经常在OpenStack峰会上与凯文、科迪和埃格尔交流。由于OpenStack发展迅速,有必要使用本书的最新版本,作者们也做到了持续更新。

CERN的云环境现在拥有两个数据中心,分别位于日内瓦和布达佩斯特,由3000台服务器组成,运行了数万个虚拟机。这里经常会有新成员加入,我们将继续使用本书作为团队培训的关键内容,同时期待最新版中更新的内容。

蒂姆•贝尔(Tim Bell)

基础设施经理,CERN


OpenStack是一个用于构建公有云和私有云的开源软件。它是一个全球性的成功软件,由全球数千名人员开发和支持,并得到当今云计算领域巨头的鼎力支持。本书设计的初衷在于帮助读者快速上手OpenStack,在理解的基础上将OpenStack更有信心地应用到自己的数据中心。本书涵盖了安装和配置私有云的各种内容:从使用Virtualbox安装OpenStack测试环境,到快速扩张生产环境的自动安装脚本。本书主要内容包括:

本书为成功安装和运行读者自己的私有云提供了一个清晰的按部就班的指导。它包含丰富而实用的脚本,使读者能使用和实践OpenStack的最新特性。

第1章带领读者安装和配置Keystone,它支撑着其他OpenStack服务。

第2章介绍如何安装、配置和使用OpenStack环境中的镜像服务Glance。

第3章介绍如何安装、配置OpenStack网络服务,包括DVR等新特性。

第4章介绍如何配置和使用OpenStack Nova,并以Virtualbox环境运行OpenStack 计算服务为例进行说明。

第5章介绍如何配置和使用OpenStack对象存储,并以Virtualbox环境运行对象存储服务为例进行说明。

第6章介绍如何使用存储服务来存储、获取文件和对象。

第7章介绍如何在数据中心中使用可用于运行OpenStack存储服务的工具和技巧。

第8章介绍如何使用Cinder卷服务,安装和配置持久化块存储服务。

第9章介绍OpenStack Neutron中的LBaaS、FWaaS服务,以及Ceilometer和Heat等OpenStack特性。

第10章介绍如何使用Openstack Dashboard,安装和使用Web用户界面,执行如创建用户、修改安全组、启动实例等任务。

第11章介绍如何使用Ansible进行自动化安装,并说明提升OpenStack服务弹性和可用性的工具与技巧。

要使用本书,需要能够访问带有虚拟化能力的计算机或服务器。要建立一个小型的实验环境,需要一个控制主机、网络主机和计算主机。为了运行Swift服务,本书提供了创建多节点环境的具体步骤,环境由1个代理服务器和5个存储节点组成。

为了设置好实验环境,你需要安装和使用Oracle的Virtualbox和Vagrant。可访问http://bit.ly/OpenStackCoobookSandbox,了解如何在计算机上使用Virtualbox和Vagrant。

我们还提供了其他快速上手实验环境的说明,访问地址http://www.openstackcookbook.com。安装MariaDB/MySQL等支撑性软件时,请参考该网站的安装说明。更多信息,请访问http://bit.ly/OpenStackCookbookPreReqs

本书面向的是那些熟悉云计算平台,并正在从虚拟化环境过渡到云计算环境的系统管理员和技术架构师。读者需要有虚拟化和Linux管理的知识,如果具有OpenStack方面的知识和经验,对阅读本书是有帮助的,但不是必须的。

读者会发现在本书中使用了一些文本格式用以区分不同类型的信息。这里介绍一下这些格式的一些例子和含义。

文中的代码、数据库表名、文件夹名称、文件名、文件的扩展名、路径和用户输入等都用等宽字体表示。

代码块表示方式如下:

account-server:bind_port=6000
container-server:bind_port=6001
object-server:bind_port=6002

对于代码块中希望重点关注的部分,会将相关内容加粗:

[swift-hash]
# Random unique string used on all nodes
swift_hash_path_prefix=a4rUmUIgJYXpKhbh
swift_hash_path_suffix=NESuuUEqc6OXwy6X

命令行输入和输出都是以如下样式书写的:

sudo swift-init all start
sudo swift-init all stop
sudo swift-init all restart

新术语和重要词语用粗体表示。以页面、菜单和对话框中出现的词语为例,读者会看到这样的样式:“一个重要字段是Common Name字段。”

 

警告或重要注释会使用这样的段落。


 

提示和技巧会使用这样的段落。

我们一直非常欢迎读者的反馈。请告诉我们你觉得这本书怎么样——喜欢哪些内容,不喜欢哪些内容。你的反馈对我们至关重要,能让我们写出使读者获益更多的书。

普通的反馈只需发送邮件到feedback@packtpub.com,并在邮件标题中注明相应的书名即可。

如果你是某个领域的专业人士,并且对写作和撰稿感兴趣,请参考我们的作者指南,相关网址:www.packtpub.com/authors。

现在你已经成为 Packt 图书的尊贵所有者,我们将极尽所能让你能从购买的本书中获得极大的价值。

读者可从https://github.com/OpenStackCookbook/OpenStackCookbook下载本书的示例代码文件。所有相关文件均可从此处下载。


本章将讲述以下内容:

OpenStack身份认证服务(Identity Service),即Keystone,是为OpenStack云环境中用户的账户和角色信息提供认证和管理服务的。这是一个关键的服务,OpenStack云环境中所有服务之间的鉴权和认证都需要经过它,所以它也是OpenStack环境中第一个要安装的服务。OpenStack身份认证服务通过在所有OpenStack服务之间传输有效的鉴权密钥,来对用户和租户鉴权。这个密钥被用来为某个具体服务做鉴权和验证,接下来你就能使用那些服务,如OpenStack的存储和计算服务。因此,第一步就要配置OpenStack身份认证服务,包括为用户创建合适的角色,以及创建服务、租户、用户账户和服务API 端点,这些服务构成了我们的云基础设施。

在Keystone里,我们有如下概念:租户、角色用户。租户就像一个项目,它有一些资源,比如用户、镜像和实例,并且其中有仅仅对该项目可知的网络。用户可隶属于一个或多个租户,并且可以在这些项目中切换,去获取相应资源。租户里的用户可以被指定为多种角色。在最基本的应用场景里,一个用户可以被指定为管理员角色,或者只是成员角色。当用户在租户中拥有管理员特权时,他们可以使用那些影响租户的功能(比如修改外部网络)。反之,一个普通用户被指定为成员角色,它通常被指定执行与用户相关的角色,比如旋转实例、创建卷和创建租户唯一网络。

我们将会使用Ubuntu Cloud Archive安装和配置OpenStack身份认证服务,也就是Keystone项目。配置完成之后,连接到OpenStack云环境都需经过这里所安装的OpenStack身份认证服务。

OpenStack身份认证服务的默认后台数据库是MariaDB数据库。图1-1展示我们将要安装的环境。在本章里,我们会专注于Controller主机。

图1-1

为保证运行的是Ubuntu Cloud Archive,必须先配置Ubuntu 14.04安装以使用该服务。更多信息,访问http://bit.ly/OpenStackCookbookCloudArchive。


所有步骤都能在http://www.openstackcookbook.com/找到。

我们将配置Keystone,使用MariaDB作为数据库后端,因此,安装Keystone之前需要安装MariaDB。


如果MariaDB还没有安装,访问http://bit.ly/OpenStackCook bookPreReqs

请确保你有一台合适的服务器来安装OpenStack身份认证服务组件。如果你正在使用前言里描述过的Vagrant环境,它就是controller节点。

请确保已经登录到controller节点上,并且确保能访问因特网,允许我们在环境里安装运行Keystone必需的软件包。如果是通过Vagrant来创建这个节点,请执行以下命令。

vagrant ssh controller

上述指令假设controller节点有两个IP地址。前端IP地址192.168.100.200和后端IP地址172.16.0.200(它也是MariaDB服务器的地址)。存在两个IP地址的原因是,内部数据通过后端IP地址进行通信(如数据库传输),同时任何Keystone的传输都是通过前端IP地址。

执行如下指令,安装OpenStack身份认证服务。

1.安装OpenStack身份认证服务可通过指定安装Ubuntu资源库里的Keystone软件包来完成。只需执行如下命令。

sudo apt-get update
sudo apt-get install ntp keystone python-keyring

2.安装好之后,需要配置后台数据库存储。首先需要在MariaDB里创建一个keystone数据库,按照如下步骤来执行(在本例中,假定MariaDB的用户名是root,对应的密码是openstack,该用户有创建数据库的权限)。

MYSQL_ROOT_PASS=openstack 
mysql -uroot -p$MYSQL_ROOT_PASS -e "CREATE DATABASE \ 
 keystone;" 

3.一个最佳实践是在数据库中为OpenStack身份认证服务单独创建一个特定的用户。创建命令如下。

MYSQL_KEYSTONE_PASS=openstack

mysql -uroot -p$MYSQL_ROOT_PASS -e "GRANT ALL PRIVILEGES ON \
keystone.* TO 'keystone'@'localhost' IDENTIFIED BY \
'$MYSQL_KEYSTONE_PASS';"

mysql -uroot -p$MYSQL_ROOT_PASS -e "GRANT ALL PRIVILEGES ON \
keystone.* TO 'keystone'@'%' IDENTIFIED BY \
'$MYSQL_KEYSTONE_PASS';"

4.接下来,配置OpenStack身份认证服务来使用该数据库。编辑配置文件/etc/ keystone/keystone.conf,如下所示。

[DEFAULT]
admin_token = ADMIN
log_dir=/var/log/keystone

[database]
connection = mysql://keystone:openstack@172.16.0.200/keystone

[extra_headers]
Distribution = Ubuntu
use_syslog = True
syslog_log_facility = LOG_LOCAL0

5.现在重启keystone服务来验证这些改动。

sudo stop keystone 
sudo start keystone

6.keystone启动之后,用如下命令为keystone数据库填充必需的数据表。

sudo keystone-manage db_sync


恭喜!现在已经为OpenStack环境安装好了OpenStack身份认证服务。

通过使用Ubuntu的包,可以便捷地安装好OpenStack环境中的OpenStack身份认证服务。安装完成之后,在MariaDB数据库服务器中配置了keystone数据库,并且用相应值来设置keystone.conf配置文件。启动Keystone服务之后,运行keystone-manage db_sync命令来为keystone数据库填充合适的数据表,以方便向其中添加OpenStack环境中所必需的用户(user)、角色(role)和租户(tenant)。

本书的诸多更新之一是一个更加全面的强化方法。为此,我们开始就默认为Keystone服务启用SSL通信。请务必注意,我们这里通过自签名的证书来演示如何配置这些服务。在生产中的部署,强烈建议去认证中心(Certificate Authority)获取合适的证书。

请确保已经登录controller节点,并且能访问因特网,允许我们在环境里安装运行Keystone必需的软件包。如果你是通过Vagrant来创建节点,请执行以下命令。

vagrant ssh controller

执行如下指令,配置Keystone服务。

1.在配置Keystone使用SSL通信之前,我们需要生成所需的OpenSSL证书。为此,登录正在运行Keystone的服务器,执行如下命令。

sudo apt-get install python-keystoneclient
keystone-manage ssl_setup --keystone-user keystone \
 --keystone-group keystone


生产中,不需要使用keystone-manage ssl_setup命令。这是一个Keystone创建自签名证书的便利工具。

2.证书生成之后,我们就能用来与Keystone服务通信。我们把证书放置在一个可访问的地方,方便在其他服务里引用已生成的CA文件。执行以下命令。

sudo cp /etc/keystone/ssl/certs/ca.pem /etc/ssl/certs/ca.pem
sudo c_rehash /etc/ssl/certs/ca.pem

3.我们在客户端也使用同样的CA和CA Key文件,所以把它们复制到将会运行相关python-*client工具的地方。在Vagrant环境里,我们把它们复制到主机里,如下所示。

sudo cp /etc/keystone/ssl/certs/ca.pem /vagrant/ca.pem
sudo cp /etc/keystone/ssl/certs/cakey.pem /vagrant/cakey.pem

4.然后,编辑Keystone配置文件/etc/keystone/keystone.conf,增加如下内容。

[ssl]
enable = True
certfile = /etc/keystone/ssl/certs/keystone.pem
keyfile = /etc/keystone/ssl/private/keystonekey.pem
ca_certs = /etc/keystone/ssl/certs/ca.pem
cert_subject=/C=US/ST=Unset/L=Unset/O=Unset/CN=192.168.100.200
ca_key = /etc/keystone/ssl/certs/cakey.pem

5.最后,重启Keystone服务。

sudo stop keystone
sudo start keystone

Openstack服务一般通过标准HTTP请求来完成互通。这提供了很大程度的灵活性,但这是以所有的通信都是基于明文为代价的。通过增加SSL认证,并且修改Keystone的配置,所有Keystone的通信都将通过HTTPS加密。

一个租户(tenant)在OpenStack里就是一个项目,这两个术语通常互换使用。在创建一个用户时必须首先为该用户分配一个租户,否则将无法创建此用户,所以首先要创建租户。在这一节中,将为用户创建一个名为cookbook的租户。


如果网络中没有其他可用的机器,可以使用controller节点,因为它有python-keystoneclient,并且可以访问OpenStack环境。如果使用Vagrant环境,请执行以下命令来访问Controller:

我们将会使用keystone客户端来操作Keystone。如果工具python-keystoneclient不可用,请按照如下所描述的步骤操作:http://bit.ly/OpenStackCookbookClientInstall

为了能以管理者权限访问OpenStack环境,请确保已经正确设置环境。

vagrant ssh controller
export OS_TENANT_NAME=cookbook
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem
export OS_CACERT=/vagrant/ca.pem

执行如下步骤,在OpenStack环境中创建一个租户。

1.我们从创建一个名为cookbook的租户开始。

keystone tenant-create\
 --name cookbook\ 
 --description "Default Cookbook Tenant"\ 
 --enabled true

输出如图1-2所示。

图1-2

2.同样需要一个admin租户,该租户下的用户能够访问整个环境。因此,使用同样的方式。

keystone tenant-create\ 
 --name admin \ 
 --description "Admin Tenant" \ 
 --enabled true

通过keystone客户端很容易创建租户,只需要指定tenant-create相关选项,语法如下所示。

keystone tenant-create \ 
 --name tenant_name \ 
 --description "A description" \ 
 --enabled true

tenant_name是一个不包含空格的任意字符串。创建租户时,keystone会返回一个与租户相对应的ID,可以通过这个ID来将用户添加到这个租户里。如果想查看环境中所有租户和它们所对应ID的列表,可以执行如下命令。

keystone tenant-list

角色是分配给一个租户中用户的权限。在这里配置两个角色,一个用于管理云环境的admin角色和另一个用于分配给使用云环境的普通用户的member角色。


如果网络中没有其他可用的机器,可以使用controller节点,因为它有python-keystoneclient,并且可以访问OpenStack环境。如果使用Vagrant环境,执行以下命令来访问Controller:

我们将会使用keystone客户端来操作Keystone。如果工具python-keystoneclient不可用,请按照如下所描述的步骤操作:http://bit.ly/OpenStackCookbookClientInstall

为了能以管理者权限访问OpenStack环境,请确保已经正确设置环境。

vagrant ssh controller
export OS_TENANT_NAME=cookbook
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem
export OS_CACERT=/vagrant/ca.pem

执行如下步骤,在我们的OpenStack环境中创建必需的角色。

1.创建admin角色。

# admin role 
keystone role-create --name admin

输出如图1-3所示。

图1-3

2.用同样的命令来创建Member role,只是把name选项指定为Member。

# Member role
keystone role-create --name Member

通过keystone客户端创建一个角色很容易实现,只需要在运行keystone时指定role-create选项,语法如下所示。

keystone role-create --name role_name

adminMember role来说,role_name的属性值不是任意的。admin角色已经在/etc/keystone/policy.json配置文件中被设置为具有管理员权限。

{   
  "admin_required": [["role:admin"], ["is_admin:1"]]
}

通过Web接口创建的非管理员用户,会在OpenStack Dashboard(即Horizon)中默认配置成Memberrole

创建角色时,keystone会返回一个与角色相对应的ID,可以通过这个ID来把角色关联到某个用户。如果想查看环境中所有角色和它们所对应ID的列表,可以执行如下命令。

keystone role-list

在OpenStack身份认证服务中添加用户时,必须要有一个能容纳该用户的租户,还需要定义一个能分配给该用户的角色。在本节中,将创建两个用户。第一个用户名为admin,它在cookbook租户中被分配为admin角色。第二个用户名为demo,同样在cookbook租户中,它被分配为Member角色。


如果网络中没有其他可用的机器,可以使用controller节点,因为它有python-keystoneclient,并且可以访问OpenStack环境。如果使用Vagrant环境,执行以下命令来访问Controller:

我们将会使用keystone客户端来操作Keystone。如果工具python-keystoneclient不可用,请按照如下所描述的步骤操作:http://bit.ly/OpenStackCookbookClientInstall

为了能以管理者权限访问OpenStack环境,请确保已经正确设置环境。

vagrant ssh controller
export OS_TENANT_NAME=cookbook
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem
export OS_CACERT=/vagrant/ca.pem

执行如下步骤,在OpenStack环境中创建用户。

1.如果要在cookbook租户中创建一个用户,首先要获得cookbook租户的ID。通过keystone命令,指定tenant-list选项,就可以得到该ID,然后将其存储在TENANT_ID变量中,命令如下所示。

TENANT_ID=$(keystone tenant-list \ 
 | awk '/\ cookbook\ / {print $2}')

2.现在已经得到了租户的ID,在cookbook租户中创建admin用户,注意要使用user-create选项,还需要为该用户设置密码。

PASSWORD=openstack 
keystone user-create \ 
 --name admin \ 
 --tenant_id $TENANT_ID \ 
 --pass $PASSWORD \ 
 --email root@localhost \ 
 --enabled true

输出如图1-4所示。

图1-4

3.在创建admin用户时,为了赋予它admin角色,需要先获得admin角色的ID。用role-list选项取出admin角色的ID,然后将其存储在一个变量里。

ROLE_ID=$(keystone role-list \ 
 | awk '/\ admin\ / {print $2}')

4.为了向角色赋予admin用户,需要用到创建admin用户时返回的用户ID。执行如下的keystone命令,通过user-list选项列出所有的用户,从而得到admin用户的ID。

USER_ID=$(keystone user-list \ 
 | awk '/\ admin\ / {print $2}')

5.根据租户ID、用户ID以及对应的角色ID,通过user-role-add选项把角色赋予对应的用户。

keystone user-role-add \ 
 --user $USER_ID \ 
 --role $ROLE_ID \ 
 --tenant_id $TENANT_ID


注意,成功执行该命令之后是没有输出的。

6.为了管理整个环境,admin用户也需要在admin租户中。为此,需要获得admin租户的ID并使用新租户的ID重复前面的步骤。

ADMIN_TENANT_ID=$(keystone tenant-list \ 
 | awk '/\ admin\ / {print $2}') 
keystone user-role-add \ 
 --user $USER_ID \ 
 --role $ROLE_ID \ 
 --tenant_id $ADMIN_TENANT_ID

7.接下来要在cookbook租户里创建一个demo用户,并赋予其Member角色,操作类似前5步,命令如下所示。

# Get the cookbook tenant ID
TENANT_ID=$(keystone tenant-list \ 
 | awk '/\ cookbook\ / {print $2}') 

# Creat the user
PASSWORD=openstack 
keystone user-create \ 
 --name demo \ 
 --tenant_id $TENANT_ID \ 
 --pass $PASSWORD \ 
 --email demo@localhost \ 
 --enabled true 
# Get the Member role ID
ROLE_ID=$(keystone role-list \ 
 | awk '/\ Member\ / {print $2}') 

# Get the demo user ID
USER_ID=$(keystone user-list \ 
 | awk '/\ demo\ / {print $2}') 

# Assign the Member role to the demo user in cookbook
keystone user-role-add \ 
 --user $USER_ID \ 
 --role $ROLE_ID \ 
 --tenant_id $TENANT_ID

向OpenStack身份认证服务里添加用户涉及多个步骤和依赖关系。首先,需要有租户,才能容纳用户。只要租户存在,就可以增加用户。这时,用户还没有关联的角色,所以最后一步就是给用户指定角色,比如Memberadmin

通过user-create选项,使用如下语法创建用户。

keystone user-create \ 
 --name user_name \ 
 --tenant_id TENANT_ID \ 
 --pass PASSWORD \ 
 --email email_address \ 
 --enabled true

user_name属性可以是任意名称,但不能包含空格。password属性是必需的,在之前的例子里,它们都被设为openstackemail_address属性也是必需的。

赋予一个用户某个角色的命令选项是user-role-add,语法如下所示。

keystone user-role-add \ 
 --user USER_ID \ 
 --role ROLE_ID \ 
 --tenant_id TENANT_ID

这表示在赋予角色之前,必须先取得用户的ID、角色的ID及租户的ID。这些ID可以通过如下命令得到。

keystone tenant-list 
keystone user-list
keystone role-list 

云环境中的每一个服务都运行在一个特定的URL和端口上,也就是这些服务的端点地址。当一个客户端程序连到OpenStack环境时,Keystone身份认证服务负责向其返回云环境中的各个服务的端点地址,以便客户端程序使用这些服务。为启用该功能,必须先定义这些端点。在云环境中,可以定义多个区域,可以把不同的区域理解为不同的数据中心,它们各自有不同的URL或IP地址。在OpenStack身份认证服务里,还可以在每一个区域里分别定义URL端点。在这里,由于只有一个区域,将其标识为RegionOne


如果网络中没有其他可用的机器,可以使用controller节点,因为它有python-keystoneclient,并且可以访问OpenStack环境。如果使用Vagrant环境,请执行以下命令来访问Controller:

我们将会使用keystone客户端来操作Keystone。如果工具python-keystoneclient不可用,请按照如下所描述的步骤操作:http://bit.ly/OpenStackCookbookClientInstall

为了能以管理者权限访问OpenStack环境,请确保已经正确设置环境。

vagrant ssh controller
export OS_TENANT_NAME=cookbook
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem
export OS_CACERT=/vagrant/ca.pem

通过运行keystone客户端命令,可在OpenStack身份认证服务中定义各个服务和服务端点。即使某些服务现在还没有在云环境中运行起来,也可以先在OpenStack身份认证服务中配置好,以便将来使用。通过如下步骤,在OpenStack环境中为各个服务定义端点。

1.现在来定义一些云环境中OpenStack身份认证服务需要知道的服务。

# OpenStack Compute Nova API Endpoint 
keystone service-create \ 
 --name nova \ 
 --type compute \ 
 --description 'OpenStack Compute Service' 
# OpenStack Compute EC2 API Endpoint 
keystone service-create \ 
 --name ec2 \ 
 --type ec2 \ 
 --description 'EC2 Service' 

# Glance Image Service Endpoint 
keystone service-create \ 
 --name glance \ 
 --type image \ 
 --description 'OpenStack Image Service' 

# Keystone Identity Service Endpoint 
keystone service-create \ 
 --name keystone \ 
 --type identity \ 
 --description 'OpenStack Identity Service' 

# Neutron Networking Service Endpoint
keystone service-create \
 --name network \
 --type network \
 --description 'OpenStack Network Service'

# Cinder Block Storage Endpoint 
keystone service-create \ 
 --name volume \ 
 --type volume \ 
 --description 'Volume Service'

2.上述操作完成之后,可以在服务里增加这些服务运行的端点URL。添加服务端点URL时需要用到各个服务的ID,这些ID在上一步命令操作之后会分别被返回输出。它们是配置服务端口URL的命令中的参数。


OpenStack身份认证服务可以被配置成在三个URL上接受服务请求:一个面向公众的URL(被终端用户使用),一个面向管理员的URL(被以管理员权限登录的用户使用,可以是一个不同的URL),以及一个面向内部的URL(当这些服务是在公有的URL的防火墙内提供服务时)。

3.对于如下服务,我们将会配置独立的公有、管理员和内部服务URL,为我们的环境提供适当的隔离。实验室环境里的公有端点,将会被指定公共IP,192.168.100.200。内部端点是172.16.0.200。管理员端点也是一个公共IP,192.168.100.200。通过如下命令来完成。

# OpenStack Compute Nova API
NOVA_SERVICE_ID=$(keystone service-list \
 | awk '/\ nova\ / {print $2}')

PUBLIC_ENDPOINT=192.168.100.200
ADMIN_ENDPOINT=192.168.100.200
INT_ENDPOINT=172.16.0.200

PUBLIC="http://$PUBLIC_ENDPOINT:8774/v2/\$(tenant_id)s"
ADMIN="http://$ADMIN_ENDPOINT:8774/v2/\$(tenant_id)s"
INTERNAL="http://$INT_ENDPOINT:8774/v2/\$(tenant_id)s"

keystone endpoint-create \
 --region RegionOne \
 --service_id $NOVA_SERVICE_ID \
 --publicurl $PUBLIC \
 --adminurl $ADMIN \
 --internalurl $INTERNAL

输出如图1-5所示。

图1-5

4.继续定义其他服务端点,具体步骤如下。

# OpenStack Compute EC2 API 
EC2_SERVICE_ID=$(keystone service-list \ 
 | awk '/\ ec2\ / {print $2}') 

PUBLIC="http://$PUBLIC_ENDPOINT:8773/services/Cloud" 
ADMIN="http://$ADMIN_ENDPOINT:8773/services/Admin" 
INTERNAL="http://$INT_ENDPOINT:8773/services/Cloud"

keystone endpoint-create \ 
 --region RegionOne \ 
 --service_id $EC2_SERVICE_ID \ 
 --publicurl $PUBLIC \ 
 --adminurl $ADMIN \ 
 --internalurl $INTERNAL 

# Glance Image Service 
GLANCE_SERVICE_ID=$(keystone service-list \ 
 | awk '/\ glance\ / {print $2}') 

PUBLIC="http://$PUBLIC_ENDPOINT:9292/v1" 
ADMIN="http://$ADMIN_ENDPOINT:9292/v1" 
INTERNAL="http://$INT_ENDPOINT:9292/v1" 

keystone endpoint-create \ 
 --region RegionOne \ 
 --service_id $GLANCE_SERVICE_ID \ 
 --publicurl $PUBLIC \ 
 --adminurl $ADMIN \ 
 --internalurl $INTERNAL 

# Keystone OpenStack Identity Service 
# Note we're using SSL HTTPS here
KEYSTONE_SERVICE_ID=$(keystone service-list \ 
 | awk '/\ keystone\ / {print $2}') 

PUBLIC="https://$PUBLIC_ENDPOINT:5000/v2.0" 
ADMIN="https://$ADMIN_ENDPOINT:35357/v2.0" 
INTERNAL="https://$INT_ENDPOINT:5000/v2.0" 

keystone endpoint-create \ 
 --region RegionOne \ 
 --service_id $KEYSTONE_SERVICE_ID \ 
 --publicurl $PUBLIC \ 
 --adminurl $ADMIN \ 
 --internalurl $INTERNAL 


# Neutron Networking Service 
NEUTRON_SERVICE_ID=$(keystone service-list \ 
 | awk '/\ network\ / {print $2}') 

PUBLIC="http://$PUBLIC_ENDPOINT:9696" 
ADMIN="http://$ADMIN_ENDPOINT:9696" 
INTERNAL="http://$INT_ENDPOINT:9696" 

keystone endpoint-create \ 
 --region RegionOne \ 
 --service_id $NEUTRON_SERVICE_ID \ 
 --publicurl $PUBLIC \ 
 --adminurl $ADMIN \ 
 --internalurl $INTERNAL

# Cinder Block Storage Service 
CINDER_SERVICE_ID=$(keystone service-list \ 
 | awk '/\ volume\ / {print $2}') 

PUBLIC="http://$PUBLIC_ENDPOINT:8776/v1/%(tenant_id)s" 
ADMIN=$PUBLIC 
INTERNAL=$PUBLIC 

keystone endpoint-create \ 
 --region RegionOne \ 
 --service_id $CINDER_SERVICE_ID \ 
 --publicurl $PUBLIC \ 
 --adminurl $ADMIN \ 
 --internalurl $INTERNAL

在OpenStack身份认证服务中配置服务和端点是通过keystone客户端命令来完成的。首先通过keystone客户端的service-create选项来添加服务,语法如下所示。

keystone service-create \ 
 --name service_name \ 
 --type service_type \ 
 --description 'description'

service_name可以是任意的名字或标签,用于标识服务的类型。在定义端点的时候,可以通过这个名字来取得它对应的ID。

type选项可以是下列几个选项中的一个:computeobject-storeimage-servicenetworkidentity-service。注意,在这一步没有配置OpenStacke的对象存储服务(typeobject-store),这会在本书后续章节涉及。

description字段同样是一个任意字段,用于描述该服务。

添加好各个服务之后,通过keystone客户端的endpoint-create选项来定义各个服务对应的端点。只有这样,OpenStack身份认证服务才能知道如何访问它们。语法如下所示。

keystone endpoint-create \ 
 --region region_name \ 
 --service_id service_id \ 
 --publicurl public_url \ 
 --adminurl admin_url \ 
 --internalurl internal_url

service_id是在第一步里创建的服务的ID。可以通过如下命令来列出所有服务和它们对应的ID。

keystone service-list

OpenStack被设计为一个适合全球部署的系统,一个区域(region)表示一个实际的数据中心或者一个包含多个互相连通的数据中心的地域范围。为此,我们只定义了一个区域——RegionOne。region字段可以是任意的名字,用于标识数据中心/地域。在指定哪个数据中心/地域运行哪些服务时,可引用该名称,也可用来告知客户端使用哪些区域。

所有的服务都可以被配置成运行在3个不同URL之上,如下所述,这取决于人们希望如何来配置OpenStack云环境。


首先创建好初始化的keystone数据库,然后在OpenStack身份认证服务器上运行keystone-manage db_sync命令,最后就可以使用keystone客户端来实现远程管理了。

服务端点创建完成以后,接下来配置它们以便其他OpenStack服务能够调用。为此,要为每个服务都配置一个特定的service租户,并指定对应的用户名和密码。这样的目的是保证更高的安全性,以及用来为云环境做故障排除和审计等工作。当设置一个服务使用OpenStack身份认证服务来验证和授权时,我们都会在它们相关的配置文件里指明这些细节。为了在OpenStack里可用,每一个服务都需要经过keystone认证。通过这些证书可以完成服务的配置。例如,当通过OpenStack身份认证服务使用glance服务时,要在/etc/glance/glance-registry.conf文件中指定如下这些配置,且必须与之前创建的相匹配。

[keystone_authtoken]
identity_uri = https://192.168.100.200:35357
admin_tenant_name = service
admin_user = glance
admin_password = glance
insecure = True


在本书里,insecure = True只是自签名的证书才需要。在生产中,我们应该使用颁发的证书,并且在配置里忽略这个选项。


如果网络中没有其他可用的机器,可以使用controller节点,因为它有python-keystoneclient,并且可以访问OpenStack环境。如果使用Vagrant环境,执行以下命令来访问Controller:

我们将会使用keystone客户端来操作Keystone。如果工具python-keystoneclient不可用,请按照如下所描述的步骤操作:http://bit.ly/OpenStackCookbookClientInstall

为了能以管理者权限访问OpenStack环境,请确保已经正确设置环境。

vagrant ssh controller
export OS_TENANT_NAME=cookbook
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem
export OS_CACERT=/vagrant/ca.pem

执行如下步骤,配置一个合适的服务租户。

1.创建服务租户,命令如下所示。

keystone tenant-create \ 
 --name service \ 
 --description "Service Tenant" \ 
 --enabled true

输出如图1-6所示。

图1-6

2.记录下服务租户的ID,以方便后面指定服务用户时使用。

SERVICE_TENANT_ID=$(keystone tenant-list \ 
 | awk '/\ service\ / {print $2}')

3.对于本节中的所有服务,都会为其创建一个用户账户,用户名和密码都和服务名称一致。例如,会在service租户里用user-create选项创建一个用户名和密码均为nova的用户,命令如下所示。

keystone user-create \ 
 --name nova \ 
 --pass nova \ 
 --tenant_id $SERVICE_TENANT_ID \ 
 --email nova@localhost \ 
 --enabled true

上述代码输出如图1-7所示。

图1-7

4.重复上一步,继续为其他用到OpenStack身份认证功能的服务创建用户。

keystone user-create \ 
 --name glance 
 --pass glance \ 
 --tenant_id $SERVICE_TENANT_ID \ 
 --email glance@localhost \ 
 --enabled true

keystone user-create \ 
 --name keystone \ 
 --pass keystone \ 
 --tenant_id $SERVICE_TENANT_ID \ 
 --email keystone@localhost \ 
 --enabled true

keystone user-create \
 --name neutron \
 --pass neutron \
 --tenant_id $SERVICE_TENANT_ID \
 --email neutron@localhost \
 --enabled true

keystone user-create \
 --name cinder \
 --pass cinder \
 --tenant_id $SERVICE_TENANT_ID \
 --email cinder@localhost \
 --enabled true

5.现在为这些服务租户里的用户分配admin角色。为此,需要先取得nova用户的用户ID,然后再用user-role-add选项来分配角色。例如,为了将admin角色分配给服务租户里的nova用户,使用如下命令。

# Get the nova user id
NOVA_USER_ID=$(keystone user-list \
     | awk '/\ nova\ / {print $2}')  

# Get the admin role id
ADMIN_ROLE_ID=$(keystone role-list\
     | awk '/\ admin\ / {print $2}')  

# Assign the nova user the admin role in service tenant
keystone user-role-add\ 
     --user $NOVA_USER_ID\ 
     --role $ADMIN_ROLE_ID\
     --tenant_id $SERVICE_TENANT_ID

6.接下来,重复上一步,继续为其他服务租户(glancekeystoneneutroncinder用户)分配角色。

# Get the glance user id
GLANCE_USER_ID=$(keystone user-list\
     | awk '/\ glance\ / {print $2}')

# Assign the glance user the admin role in service tenant
keystone user-role-add\ 
     --user $GLANCE_USER_ID\ 
     --role $ADMIN_ROLE_ID\ 
     --tenant_id $SERVICE_TENANT_ID
# Get the keystone user id
KEYSTONE_USER_ID=$(keystone user-list\
     | awk '/\ keystone\ / {print $2}')

# Assign the keystone user the admin role in service tenant
keystone user-role-add\ 
     --user $KEYSTONE_USER_ID\ 
     --role $ADMIN_ROLE_ID\ 
     --tenant_id $SERVICE_TENANT_ID

# Get the cinder user id
NEUTRON_USER_ID=$(keystone user-list \ 
     | awk '/\ neutron \ / {print $2}') 

# Assign the neutron user the admin role in service tenant
keystone user-role-add \ 
     --user $NEUTRON_USER_ID \ 
     --role $ADMIN_ROLE_ID \ 
     --tenant_id $SERVICE_TENANT_ID 

# Get the cinder user id
CINDER_USER_ID=$(keystone user-list\
     | awk '/\ cinder \ / {print $2}')

# Assign the cinder user the admin role in service tenant
keystone user-role-add\ 
     --user $CINDER_USER_ID\ 
     --role $ADMIN_ROLE_ID\ 
     --tenant_id $SERVICE_TENANT_ID

创建服务租户,然后在其中添加OpenStack运行必需的各个服务,这两步操作和在系统中添加需要admin角色的其他用户没什么不同。为每个拥有admin角色的用户分配用户名和密码,并确保它们存在于服务租户内。然后,使用这些凭证来配置服务与OpenStack身份认证服务进行验证。


本书示例代码可以从以下网址下载:https://github.com/OpenStackCookbook/OpenStackCookbook。所有的支持文件都在这里。

迄今为止我们构建的OpenStack身份认证服务,为OpenStack环境提供了一个功能性但孤立的设置。这是一个有用的概念验证和实验室环境。但是,我们很可能需要把OpenStack集成到已经存在的认证系统里。OpenStack为这种场景提供了一种可插拔的认证后端,其中使用最广泛的是LDAP。


如果网络中没有其他可用的机器,可以使用controller节点,因为它有python-keystoneclient,并且可以访问OpenStack环境。如果使用Vagrant环境,执行以下命令来访问Controller:

我们将会使用keystone客户端来操作Keystone。如果工具python-keystoneclient不可用,请按照如下所描述的步骤操作:http://bit.ly/OpenStackCookbookClientInstall

为了能以管理者权限访问OpenStack环境,请确保已经正确设置环境。

vagrant ssh controller
export OS_TENANT_NAME=cookbook
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem
export OS_CACERT=/vagrant/ca.pem

另外,如果要连接到一个外部LDAP服务,你需要持有LDAP的主机名或IP地址,并且有合适的访问权限。你需要拥有管理者用户的LDAP路径信息,和包含用户、角色和租户的组织单位。


作为本书的补充材料,我们提供了一个示例OpenLDAP服务器,预置了所需的值。关于如何使用的步骤,参考本书的博客:http://bit.ly/OpenStackCookbookLDAP

为了与LDAP通信,我们通过如下步骤配置OpenStack身份认证服务。

1.使用你最喜欢的编辑器,在keystone.conf文件中启用LDAP验证。

[identity]
driver=keystone.identity.backends.ldap.Identity

2.接下来,创建ldap字段,添加LDAP服务器URL。

[ldap]
url = ladp://openldap

3.在如下行里,为你使用的管理员用户指定LDAP路径,同时指定密码和后缀,或者Keystone开始搜索LDAP的地址。

user = cn=admin,dc=cook,dc=book
password = openstack
suffix = cn=cook,cn=book

4.仍然在[ldap]字段,我们告知Keystone关于如何查找用户的4个信息。user_tree_dn指定在LDAP树里为用户搜索哪个OU。user_objectclass指定LDAP中如何表示用户。user_id_attribute告知Keystone哪个属性会被用作用户的用户名。类似地,user_mail_attribute告知Keystone去哪儿查找用户的电子邮件地址,代码如下。

user_tree_dn = ou=Users,dc=cook,dc=book
user_objectclass = inetOrgPerson
user_id_attribute = cn
user_mail_attribute = mail

5.接下来,为租户和角色增加相同细节。

tenant_tree_dn = ou=Projects,dc=cook,dc=book
tenant_objectclass = groupOfNames
tenant_id_attribute = cn
tenant_desc_attribute = description

role_tree_dn = ou=Roles,dc=cook,dc=book
role_objectclass = organizationalRole
role_id_attribute = cn
role_member_attribute = roleOccupant

6.保存文件,重启keystone

sudo stop keystone
sudo start keystone

OpenStack身份认证服务,就像其他OpenStack服务一样,是基于插件的。在默认状态下,Keystone从SQL数据库里存储和访问所有的用户身份和认证数据。但是,当把OpenStack集成到一个已经存在的环境时,这就并非总是最可取或安全的方法了。为了适应这点,我们把认证后端改为LDAP。这样,我们可以集成OpenLDAP、Active Directory和其他很多服务。但是,在配置后端时,需要特别关注LDAP的路径。


服务目录的入口在哪里?它们仍然被存储在Keystone的SQL数据库里,因为与用户的身份或认证无关。


本章将讲述以下内容:

OpenStack镜像服务(Image Service),也称为Glance,可以让用户注册、查找和检索在OpenStack环境中使用的虚拟机镜像。OpenStack镜像服务支持将镜像文件存储在各种类型的存储环境,例如本地文件系统或分布式文件系统,如OpenStack对象存储服务。

在本章中,我们重点关注如图2-1所示的Controller主机。

图2-1

最新OpenStack镜像服务的安装很简单,只需要使用Ubuntu Cloud Archive资源库中专为Ubuntu 14.04版本打包好的安装包即可。

在开始之前,必须确认已经登录到安装好OpenStack身份认证服务的OpenStack控制节点上。

执行以下命令,登录到使用Vagrant创建的OpenStack控制节点。

vagrant ssh controller

确保Ubuntu 14.04 LTS版本正在使用Ubuntu Cloud Archive,其中包含有Juno版本所需的安装包。更多信息请访问:http://bit.ly/OpenStackCookbookCloudArchive


所有步骤都能在如下网站找到:http://www.openstackcookbook. com/

我们使用MariaDB作为数据库后端来配置Glance,所以它需要在Glance之前安装。


如果MariaDB没有安装,访问http://bit.ly/OpenStackCook bookInstallMariaDB

我们也需要安装RabbitMQ作为消息队列服务,所以它也需要在Glance之前安装。


如果RabbitMQ没有安装,访问http://bit.ly/OpenStackCook bookInstallRabbitMQ

本小节的指令假设controller节点有两个IP地址。前端IP地址192.168.100.200和后端IP地址172.16.0.200(它也是MariaDB服务器的地址)。存在两个IP地址的原因是,内部数据通过后端IP地址进行通信(如数据库传输),任何Glance的传输都是通过前端IP地址。

通过如下步骤安装OpenStack镜像服务。

1.通过在Ubuntu里指定glance软件包来完成OpenStack镜像服务的安装。

sudo apt-get update
sudo apt-get install ntp glance python-keyring

2.安装完成之后,需要配置后端数据库。我们首先在MariaDB里创建glance数据库。

MYSQL_ROOT_PASS=openstack
mysql -uroot -p$MYSQL_ROOT_PASS -e "CREATE DATABASE \
 glance;"

在MariaDB里有一个名为root的用户,密码是openstack,拥有创建数据库的权限。

3.一个好的实践是创建一个OpenStack镜像服务特有的用户,所以我们在数据库里创建一个glance用户。

MYSQL_GLANCE_PASS=openstack

mysql -uroot -p$MYSQL_ROOT_PASS -e "GRANT ALL PRIVILEGES ON \
glance.* TO 'glance'@'localhost' IDENTIFIED BY \
'$MYSQL_KEYSTONE_PASS';"

mysql -uroot -p$MYSQL_ROOT_PASS -e "GRANT ALL PRIVILEGES ON \
glance.* TO 'glance'@'%' IDENTIFIED BY '$MYSQL_GLANCE_PASS';"

4.现在用这个数据库来配置OpenStack镜像服务,编辑/etc/glance/glance-registry. conf/etc/glance/glance-api.conf文件,修改sql_connection这一行,使它与数据库的证书相匹配。在文件里修改如下行。

[database]
backend = sqlalchemy
connection = mysql://glance:openstack@172.16.0.200/glance

5.配置OpenStack镜像服务来使用RabbitMQ,确保/etc/glance/glance-registry. conf中有如下行。

rabbit_host = localhost
rabbit_port = 5672
rabbit_use_ssl = false
rabbit_userid = guest
rabbit_password = guest
rabbit_virtual_host = /
rabbit_notification_exchange = glance
rabbit_notification_topic = notifications
rabbit_durable_queues = False

6.现在重启glance-registry服务。

sudo stop glance-registry
sudo start glance-registry

7.重启glance-api服务。

sudo stop glance-api
sudo start glance-api

8.glance数据库在Ubuntu 14.04下是有版本控制的,允许服务的升级和降级。我们通过如下命令把版本控制设置为0。

sudo glance-manage db_version_control 0

9.我们现在同步一下数据库,确保存在正确的表结构,命令如下。

sudo glance-manage db_sync

恭喜你!现在OpenStack镜像服务已经安装成功,并且可以在我们的OpenStack环境中使用了。

OpenStack镜像服务被分为两个运行的服务:glance-apiglance-registryglance-registry服务连接数据库后端。第一步是创建glance数据库和glance用户,接下来就可以操作我们创建的glance数据库了。

数据库创建后,我们修改/etc/glance/glance-registry.conf/etc/glance/ glance-api.conf文件,这样glance知道去哪儿查找和连接我们的MySQL数据库。标准的SQLAlchemy连接字符串语法如下。

sql_connection = mysql://USER:PASSWORD@HOST/DBNAME

为了保证OpenStack计算服务正确运行,必须对OpenStack镜像服务作适当配置,以保证其能正常使用OpenStack身份认证服务。

在开始之前,确保已经登录到安装了OpenStack身份认证服务的OpenStack控制主机上。如果OpenStack身份认证服务没有安装,执行第1章1.2节中的步骤。我们也需要设置好Glance服务用户和端点。参阅第1章1.7节和1.8节。

执行以下命令,登录到使用Vagrant创建的OpenStack控制节点。

vagrant ssh controller

执行如下步骤,使用OpenStack身份认证服务配置OpenStack镜像服务。

1.首先编辑/etc/glance/glance-api.conf文件,增加[keystone_authtoken]字段,告知OpenStack镜像服务使用OpenStack身份认证服务。注意,我们在配置里使用insecure = Ture,因为我们在使用自签名的证书。在生产环境中,我们会使用发行的证书,所以不需要这个参数,代码如下。

[keystone_authtoken]
auth_uri = https://192.168.100.200:35357/v2.0/
identity_uri = https://192.168.100.200:5000
admin_tenant_name = service
admin_user = glance
admin_password = glance
insecure = True

2.重复这个过程,编辑/etc/glance/glance-registry.conf文件,在[keystone_ authtoken]字段配置glance服务的用户。我们使用insecure = True,因为我们的示例使用自签名的证书,代码如下。

[keystone_authtoken]
auth_uri = https://192.168.100.200:35357/v2.0/
identity_uri = https://192.168.100.200:5000
admin_tenant_name = service
admin_user = glance
admin_password = glance
insecure = True

3.最后,重启这两个服务来使更改生效。

sudo restart glance-api 
sudo restart glance-registry

OpenStack镜像服务运行两个服务。其中,glance-api是客户端及其他服务与glance通信的接口,而glance-registry用于管理存储在硬盘和registry数据库中的对象。这两个服务都需要在它们的配置文件中设置好验证凭证,以方便OpenStack身份认证服务对其用户进行鉴权。

镜像默认作为文件存储在/var/lib/glance/images/这个目录。但是,OpenStack镜像服务能配置为使用OpenStack对象存储来存储镜像,也支持使用其他后端镜像,诸如Ceph和GlusterFS。在本节里,我们将会浏览配置OpenStack镜像服务(Glance)来使用对象存储服务(Swift)所需的步骤。

首先,确保已经登录到OpenStack控制主机,或者登录到运行OpenStack镜像服务的主机上。

要登录通过Vagrant创建的OpenStack控制主机,执行以下命令。

vagrant ssh controller

执行以下步骤,配置OpenStack镜像服务来使用OpenStack对象存储。

1.编辑/etc/glance/glance-api.conf,告知Glance我们将使用Swift而不是默认的文件系统,在[DEFAULT]字段下编辑下面这一行。

[DEFAULT]
default_store = swift

2.接下来在相同文件中编辑[glance_store]字段,配置Swift。

[glance_store]
stores = glance.store.filesystem.Store,
           glance.store.http.Store,
           glance.store.swift.Store
swift_store_auth_version = 2
swift_store_auth_address = https://192.168.100.200:5000/v2.0/
swift_store_user = service:glance
swift_store_key = glance
swift_store_container = glance
swift_store_create_container_on_put = True
swift_store_large_object_size = 5120
swift_store_large_object_chunk_size = 200
swift_enable_snet = False
swift_store_auth_insecure = True


我们使用swift_store_auth_insecure = True,因为我们为SSL Keystone的实现使用自签名的证书。根据你的环境调整这个设置。

3.最后,重启两个OpenStack镜像服务进程,使改动生效。

sudo restart glance-api
sudo restart glance-registry

OpenStack镜像服务可以配置为使用诸多不同的后端来存储镜像,如Ceph、OpenStack对象存储和磁盘。一旦对象存储被配置为后端,镜像就会被上传到Swift,而不是存储在本地。参阅第5章中关于配置和使用对象存储部分。

通过glance命令行工具,可以在OpenStack存储中上传和管理镜像。它可以让我们上传、删除、修改OpenStack环境中使用的存储镜像的相关信息。

首先,请确认登录到了可以运行glance工具的Ubuntu客户机或者直接运行OpenStack镜像服务的OpenStack 控制节点上。如果没有安装Glance客户端,可以通过下面的方法安装。

sudo apt-get update 
sudo apt-get install python-glanceclient

为了保证环境变量设置正确,admin用户和密码应和之前创建的保持一致,执行以下操作。

export OS_TENANT_NAME=cookbook
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem
export OS_CACERT=/vagrant/ca.pem

可以有多种方式上传和查看OpenStack镜像服务中的镜像文件。按照下面的步骤上传镜像文件和查看上传镜像的详细信息。

上传Ubuntu镜像文件

Ubuntu提供的镜像可以方便地添加到OpenStack环境之中。

1.首先,从http://uec-images.ubuntu.com上下载Ubuntu云系统镜像。

wget https://cloud-images.ubuntu.com/trusty/current/trusty-server- 
cloudimg-amd64-disk1.img

2.然后上传这个文件。

glance image-create \ 
 --name='Ubuntu 14.04 x86_64 Server' \ 
 --disk-format=qcow2 \ 
 --container-format=bare \ 
     --is-public True < \
     trusty-server-cloudimg-amd64-disk1.img

输出如图2-2所示。

图2-2

列出镜像文件

要列出OpenStack镜像服务资源库中的镜像文件,可以直接使用Glance客户端来询问镜像服务,或使用管理OpenStack环境的Nova客户端,这将在第4章中详细介绍。

要列出用户可用的镜像,可使用下面的命令。

glance image-list

输出结果如图2-3所示。

图2-3

查看镜像文件详细信息

可以查看资源库中有关镜像的更详细信息。该信息可以通过下面的命令获得。

glance image-show IMAGE_ID

例如:

glance image-show 18584bff-2c12-4c2d-85f6-59771073c936 

它返回的详细信息,与上传镜像时输出的内容相同。

删除镜像文件

在一个OpenStack云计算环境中,将会有很多情况下需要删除已有的镜像文件。只要具备相应权限,即可以通过下面的方式删除私有或公共的镜像文件。

1.使用如下命令删除镜像文件。

glance image-delete IMAGE_ID

例如:

glance image-delete 794dca52-5fcd-4216-ac8e-7655cdc88852 

2.当成功执行删除镜像后,OpenStack Image 不会产生输出。可以通过执行glance image-list验证结果。

将私有镜像文件设为公开镜像文件

当上传镜像文件时,这些镜像文件将默认只有上传者才拥有权限,即私有镜像文件。如果使用上述方式上传了镜像文件,但又希望它可以给其他用户使用时,在OpenStack镜像服务下,使用下面的方法将其设为公开。

1.首先,列出并查看镜像文件确认哪一个需要公开。在本书的例子中,选择了最初上传的镜像。

glance image-show IMAGE_ID

例如:

glance image-show 18584bff-2c12-4c2d-85f6-59771073c936 

输出结果如图2-4所示。

图2-4

2.这时,可以将其设为公开镜像,使云环境内所有用户均可以使用这个镜像文件。

glance image-update 18584bff-2c12-4c2d-85f6-59771073c936 \
 --is-public True

3.列出可用的公开镜像。

glance image-show 18584bff-2c12-4c2d-85f6-59771073c936 

输出如图2-5所示。

图2-5

在我们的私有云环境中,OpenStack镜像服务是一个非常灵活的镜像管理系统,它允许用户使用多种镜像管理方式,从添加新镜像、删除镜像到更新信息,比如文件的命名方式,它让用户能很方便地识别这些镜像文件,还能将私有镜像转换为共有镜像。当然,还可以将共有镜像转换为私有镜像。

要做到这一切,只需要在任何已连接的客户端上使用glance工具就可以了。

OpenStack镜像服务提供了一种机制,它可以远程添加一个存储在外部位置的镜像文件。利用这种机制,可以很方便地实现在私有云中使用第三方服务器中上传的镜像文件。

首先,确认已经登录到一台Ubuntu 客户机,且可以运行glance工具。如果没有该工具,可通过以下方法安装。

sudo apt-get update 
sudo apt-get install python-glanceclient

为了保证环境变量设置正确,admin用户和密码应和之前创建的保持一致。执行以下操作。

export OS_TENANT_NAME=cookbook  
export OS_USERNAME=admin  
export OS_PASSWORD=openstack  
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/  
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem 
export OS_CACERT=/vagrant/ca.pem

参照下列步骤,将远程存储镜像文件添加到OpenStack镜像服务中。

1.为了注册一个远程虚拟镜像,这里使用了location参数指定镜像文件的位置,而不是之前通过管道的方式指定镜像文件。

glance image-create \ 
 --name='Ubuntu 12.04 x86_64 Server' \ 
 --disk-format=qcow2 \ 
 --container-format=bare \ 
 --public \ 
 --location http://webserver/precise-server-cloudimg-amd64-disk1.img

2.该命令返回类似于图2-6所示的信息,它紧接着被存储到OpenStack镜像服务里。

图2-6

使用glance工具,可以方便快捷地将远程镜像文件添加到这个OpenStack镜像服务资源库中。这个方法得以实现,主要在于location参数的灵活性。同时还可以像指定本地镜像文件那样,设定其他元数据。

当一个镜像是私有的时候,租户中只有上传者才能访问该镜像。OpenStack镜像服务提供了一种机制,可以让私有镜像在不同的租户之间共享。这实现了对镜像更好的控制,不必向所有租户公开即可在多个租户之间共享镜像。

首先,确认已经登录到一台Ubuntu 客户机,且可以运行glance工具。如果没有该工具,可通过以下方法安装。

sudo apt-get update 
sudo apt-get install glance-client

为了保证环境变量设置正确,admin用户和密码应和之前创建的保持一致。执行以下操作。

export OS_TENANT_NAME=cookbook   
export OS_USERNAME=admin   
export OS_PASSWORD=openstack   
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/   
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem 
export OS_CACERT=/vagrant/ca.pem

执行下列步骤,将cookbook租户中的私有镜像文件共享给其他租户。

1.首先需要获取能够使用镜像租户的ID,命令如下。

keystone tenant-list

2.然后列出镜像。

glance image-list

3.对于我们的cookbook租户来说,其ID为45c787efeaec42aa9cab522711bf5f4d,有一个镜像,其ID为18584bff-2c12-4c2d-85f6-59771073c936,可以通过以下命令共享该镜像。

glance member-create \ 
 18584bff-2c12-4c2d-85f6-59771073c93 \ 
 45c787efeaec42aa9cab522711bf5f4d 

glance命令中的member-create选项可以用来与其他租户共享镜像,语法如下。

glance [--can-share] member-create image-id tenant-id

该命令有一个可选参数--can-share,可以指定哪个租户可以共享该镜像。

当使用member-create选项时,可以查看为某个租户共享了哪些镜像。这可以让我们在OpenStack环境中管理和控制哪些用户可以访问什么类型的镜像。

首先,确认已经登录到一台Ubuntu客户机,且可以运行glance工具。如果没有该工具,可通过以下方法安装。

sudo apt-get update 
sudo apt-get install python-glanceclient

为了保证环境变量设置正确,admin用户和密码应和之前创建的保持一致。执行以下操作。

export OS_TENANT_NAME=cookbook   
export OS_USERNAME=admin   
export OS_PASSWORD=openstack   
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/   
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem 
export OS_CACERT=/vagrant/ca.pem

执行以下步骤,查看共享给某个租户的镜像。

1.首先需要获取租户ID,命令如下。

keystone tenant-list

2.然后使用租户ID,列出已经共享给租户的镜像。

glance member-list –-tenant-id \ 
 45c787efeaec42aa9cab522711bf5f4d

3.输出如图2-7所示。

图2-7

glance命令中的member-list选项可以用来查看哪些镜像被共享给其他租户,语法如下。

glance member-list --image-id IMAGE_ID 
glance member-list –-tenant-id TENANT_ID

我们可以设置任意的元数据,用来描述镜像和它们如何与其他OpenStack组件关联。这个特殊的数据,可以在镜像创建或更新时设置,用来启用其他OpenStack服务中的特定功能,或者仅仅只是对镜像进行自定义描述。

首先,确认已经登录到一台Ubuntu客户机,且可以运行glance工具。如果没有该工具,可通过以下方法安装。

sudo apt-get update 
sudo apt-get install python-glanceclient

为了保证环境变量设置正确,admin用户和密码应和之前创建的保持一致,执行以下操作。

export OS_TENANT_NAME=cookbook   
export OS_USERNAME=admin   
export OS_PASSWORD=openstack   
export OS_AUTH_URL=https://192.168.100.200:5000/v2.0/   
export OS_NO_CACHE=1
export OS_KEY=/vagrant/cakey.pem 
export OS_CACERT=/vagrant/ca.pem

镜像元数据可以增加、更新和删除,也可以用作主机的调度。

更新镜像的属性

执行以下步骤,更新镜像的元数据。

1.首先获取我们想要更新元数据的镜像ID,命令如下。

glance image-list

2.给镜像增加元数据,设置image_stateos_distro属性。

glance image-update db02ab51-f9a1-4e38-8c3d-22b367962154
   --property image_state=available \
   --property os_distro=ubuntu

3.得到图2-8所示的输出。

图2-8

删除镜像的所有属性

执行以下步骤,删除镜像属性。

1.首先获取我们想要删除元数据的镜像ID,命令如下。

glance image-list

2.删除所有的元数据信息,命令如下。

glance image-update db02ab51-f9a1-4e38-8c3d-22b367962154 \
--purge-props

删除镜像的特定属性

执行以下步骤,删除镜像属性。

1.首先获取我们想要删除元数据的镜像ID,命令如下。

glance image-list

2.删除特定元数据时,我们需要指定哪些属性需要保留。在这个例子里,我们将会删除image_state和其他设置的属性,但是保留os_distro这个属性。请注意,用户增加属性如果没有被指定的话将会被删除,代码如下。

glance image-update db02ab51-f9a1-4e38-8c3d-22b367962154 \
--purge-props --property os_distro=Ubuntu

使用元数据做主机调度

元数据可用于决定主机的调度。举个例子,针对不同管理程序类别的主机,可以指定属性,确定镜像部署在哪一个管理程序上。执行以下步骤,使我们能基于镜像元数据调度主机。

1.编辑/etc/nova/nova.conf文件,更新调度器属性。

# Scheduler
scheduler_default_filters=ImagePropertiesFilter


虽然调度是一个固有的OpenStack计算功能,但是为了完备性,我们对Glance使用这个字段的配置。

2.重启nova调度器。

sudo stop nova-scheduler
sudo start nova-scheduler

3.获取我们想要更新元数据的镜像ID。

glance image-list

4.设置architecturehypervisor类型属性,kvmqemu的管理程序类型都是qemu

glance image-update db02ab51-f9a1-4e38-8c3d-22b367962154 \
 --property architecture=arm \
 --property hypervisor_type=qemu

glance命令里的glance image-update选项允许我们增加、修改和删除自定义镜像属性。语法如下。

glance image-create [other options] --property 
glance image-update IMAGE_ID --property 

我们可以把基于VMware的镜像vmdk,迁移成其他磁盘镜像格式。通过一个镜像转换工具即可完成。这个工具也可以用于验证转换工作是否正常。一旦镜像转换完成,就可以把它上传到OpenStack镜像服务里了。

首先,请确认已经登录到Ubuntu客户机,在那里我们能完成镜像的转换。确保你已安装qemu-util,如果尚未安装,请执行如下命令。

sudo apt-get install qemu-utils

执行以下步骤,把VMDK镜像转换为QCOW2格式。

1.通过如下命令确认镜像。

qemu-img info custom-iso-1415990568-disk1.vmdk

2.输出如下。

image: custom-iso-1415990568-disk1.vmdk
file format: vmdk
virtual size: 39G (41943040000 bytes)
disk size: 2.7G
cluster_size: 65536

Format specific information:
 cid: 2481477841
 parent cid: 4294967295
 create type: monolithicSparse
 extents:
 [0]:
 virtual size: 41943040000
 filename: custom-iso-1415990568-disk1.vmdk
 cluster size: 65536
 format:

3.使用如下命令转换镜像。

qemu-img convert -f vmdk -O qcow2 -c \
-p custom-iso-1415990568-disk1.vmdk \
custom-iso-1415990568-disk1.qcow2

在这里,-f指定输入磁盘镜像格式,-O指定输出格式,-c目标应该只被压缩成QCOW格式,-p显示进度。

4.通过如下命令验证转换的镜像,如果所有都跟预料一样的话,应该显示镜像是完全相同的。

qemu-img compare -s -f vmdk \
-F qcow2 custom-iso-1415990568-disk1.vmdk \
custom-iso-1415990568-disk1.qcow2
Images are identical.

qemu-img convert命令行工具能转换多种格式,包括VMDK。应该也支持转换成VMDK或其他格式。QCOW格式支持镜像的压缩,所以能得到更小的镜像,后续才有增长空间。

现在我们可以创建自定义的OpenStack镜像,但是明智的做法是在OpenStack安装之外进行。另外,需要确保在创建镜像的系统上,没有运行VirtualBox、Fusion或其他类似虚拟化技术。我们将会创建一个基于KVM的CentOS镜像。

开始之前,确保已登录一个Linux系统,它不是你的OpenStack环境。

在Ubuntu上,安装kvm/qemulibvirt库。

sudo apt-get install qemu-kvm libvirt-bin virt-manager

通过如下命令启动libvirt-bin服务。

sudo start libvirt-bin

在CentOS或RHEL上命令如下。

sudo yum groupinstall "Virtualization" "Virtualization Platform"
sudo chkconfig libvirtd on
sudo service libvirtd start

在Fedora上命令如下。

sudo yum groupinstall "Virtualization" "Virtualization Platform"
sudo systemctl enable libvirtd
sudo systemctl start libvirtd

理想状况下,你还需要一个VNC客户端,不过我们的例子不需要也可以完成。

通过如下步骤创建一个自定义镜像。

1.创建一个名为openstack.txtkickstart文件。

install
text
url --url http://mirror.rackspace.com/CentOS/6.6/os/x86_64/
lang en_US.UTF-8
keyboard us
network --onboot yes --bootproto dhcp --noipv6
timezone --utc America/Chicago
zerombr
clearpart --all --initlabel
bootloader --location=mbr --append="crashkernel=auto rhgb quiet"
part / --fstype=ext4 --size=1024 --grow
authconfig --enableshadow --passalgo=sha512
rootpw openstack
firewall --disable
selinux --disabled
skipx
shutdown
%packages
@core
openssh-server
openssh-clients
wget
curl
git
man
vim
ntp
%end
%post
%end

2.执行以下命令。

sudo virt-install --virt-type kvm --name centos-6.6 --ram 1024 \
--location=http://mirror.rackspace.com/CentOS/6.6/os/x86_64/ \
--disk path=/tmp/centos-6.6-vm.img,size=5 \
--network network=default --graphics vnc,listen=0.0.0.0 \
--noautoconsole --os-type=linux --os-variant=rhel6 \
--initrd-inject=centos-6.6-x86_64-openstack.txt \
--extra-args="noverifyssl console=tty0 console=ttyS0,115200 \
ks=file:/centos-6.6-x86_64-openstack.txt "

3.你将会得到类似于如下的输出。

Starting install...

Retrieving file .treeinfo...
| 728 B 00:00 ...
Retrieving file vmlinuz...
| 7.9 MB 00:00 ...
Retrieving file initrd.img...
| 66 MB 00:00 ...
Creating domain...
| 0 B 00:01
Domain installation still in progress. You can reconnect to the
console to complete the installation process.

4.通过VNC验证镜像的创建是否完成。VNC server将会默认运行在host:5900,如图2-9所示。

图2-9

如果你无法访问VNC客户端,或者因为某些原因无法使用它,等待10分钟(估计)并且跳到下一步骤。我们将会假设它能工作。

5.通过以下命令列出virsh里正在运行的虚拟机。

sudo virsh list --all
Id Name State
----------------------------------------------------
62 centos-6.6 running

6.通过以下命令停止(销毁)虚拟机。

sudo virsh destroy centos-6.6
Domain centos-6.6 destroyed

7.通过以下命令启动虚拟机。

sudo virsh start centos-6.6
Domain centos-6.6 started

8.通过用户名root密码openstack登录VM控制台。要退出控制台会话,按Ctrl+]组合键。

sudo virsh console centos-6.6
Connected to domain centos-6.6
Escape character is ^]

按Enter键退出。

CentOS release 6.6 (Final)
Kernel 2.6.32-504.el6.x86_64 on an x86_64
localhost.localdomain login: root
Password:

9.在虚拟机guest上,通过以下命令安装cloud-init包。

sudo yum install http://dl.fedoraproject.org/pub/epel/6Server/
x86_64/epel-release-6-8.noarch.rpm

sudo yum install cloud-init cloud-utils cloud-utils-growpart

10.通过如下命令修改guest的云配置文件/etc/cloud/cloud.cfg

rm /etc/cloud/cloud.cfg
vi /etc/cloud/cloud.cfg

11.粘贴如下内容。

users:
 - default

disable_root: 1
ssh_pwauth:    0

locale_configfile: /etc/sysconfig/i18n
mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
resize_rootfs_tmp: /dev
ssh_deletekeys:    0
ssh_genkeytypes:  ~
syslog_fix_perms: ~

cloud_init_modules:
 - bootcmd
 - write-files
 - resizefs
 - set_hostname
 - update_hostname
 - update_etc_hosts
 - rsyslog
 - users-groups
 - ssh

cloud_config_modules:
 - mounts
 - locale
 - set-passwords
 - timezone
 - puppet
 - chef
 - salt-minion
 - mcollective
 - disable-ec2-metadata
 - runcmd

cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message

system_info:
  distro: rhel
  default_user:
     name: centos
     lock_passwd: True
     shell: /bin/bash
     sudo: ["ALL=(ALL) NOPASSWD: ALL"]
  paths:
    cloud_dir: /var/lib/cloud
    templates_dir: /etc/cloud/templates
  ssh_svcname: sshd

12.通过以下命令确保guest能与元数据服务通信。

sudo echo "NOZEROCONF=yes" >> /etc/sysconfig/network

13.通过以下命令删除持久规则。

sudo rm -f /etc/udev/rules.d/70-persistent-net.rules

14.删除机器特定的MAC地址和UUID。编辑/etc/sysconfig/network-scripts/ ifcfg-eth0文件,删除以HWADDRUUID开头的行。

sudo sed -i '/HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth0
sudo sed -i '/UUID/d' /etc/sysconfig/network-scripts/ifcfg-eth0

15.做了上述修改之后,/etc/sysconfig/network-scripts/ifcfg-eth0文件看起来应该像下面这样子。

DEVICE="eth0"
BOOTPROTO="dhcp"
IPV6INIT="no"
MTU="1500"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"

16.通过以下命令清理yum、日志文件、临时文件和历史。

sudo yum clean all
sudo rm -rf /var/log/­*
sudo rm -rf /tmp/­*
sudo history -c

17.通过以下命令关掉guest

sudo shutdown -h now

18.通过以下命令压缩新创建的镜像。

sudo qemu-img convert -c /tmp/centos-6.6-vm.img \
-O qcow2 /tmp/centos-6.6.img

19.通过以下命令把镜像上传给Glance

glance image-create --name centos-6.6 \
--disk-format=qcow2 --container-format=bare --file /tmp/centos-6.6.img

qemu-img convert命令行工具能转换多种格式,包括VMDK。应该也支持转换成VMDK或其他格式。QCOW格式支持镜像的压缩,所以能得到更小的镜像,后续才有增长空间。


相关图书

云原生Spring实战Spring Boot与?Kubernetes实践
云原生Spring实战Spring Boot与?Kubernetes实践
华为云计算实战指南
华为云计算实战指南
Amazon Web Services云计算实战(第2版)
Amazon Web Services云计算实战(第2版)
云原生技术中台:从分布式到云平台设计
云原生技术中台:从分布式到云平台设计
AWS云计算实战
AWS云计算实战
软件定义数据中心:Windows Server SDDC技术与实践
软件定义数据中心:Windows Server SDDC技术与实践

相关文章

相关课程