Openstack 云计算秘籍(一)_代码移植 从 基于硬件的linux 移植 c++ 代码到 基于 openstack 的云上,需要做哪
原文:
annas-archive.org/md5/2ca02d976e2dad8eba9e4b7090f2058d
译者:飞龙
协议:CC BY-NC-SA 4.0
序言
OpenStack 是用于构建公共和私有云以及私有托管软件定义基础设施服务的开源软件。它是一个全球性的开源成功案例,由全球成千上万的人开发和支持,并得到了云计算领域领先企业的支持。本书专门设计旨在快速帮助你掌握 OpenStack,并提供信心与理解,以便将其部署到自己的数据中心。本书涵盖了使用 Ansible 安装 OpenStack 到数据中心的过程,并提供了运行的步骤,帮助你快速获取所需的知识,以便当下能够安装并操作 OpenStack。本书由 Rackspace 的四位高级 OpenStack 工程师和架构师编写,涵盖了广泛的主题,帮助你安装和配置 OpenStack 环境。本书将指导你完成以下内容:
-
如何使用 OpenStack-Ansible 安装和配置 OpenStack 的所有核心组件
-
如何掌握完整的私有云技术栈,从扩展计算资源到管理面向高冗余、高可用存储的对象存储服务
-
使用 Heat 和 Ansible 编排在 OpenStack 上运行的工作负载的示例
-
每一章都有实际的、基于真实场景的服务示例,确保你在自己的环境中也能顺利实现。
本书为你提供清晰、逐步的指导,帮助你成功安装和运行自己的私有云。内容中包含了大量实用且可操作的方案,使你能够使用 OpenStack 的最新功能并加以实现。
本书适用对象
本书面向从虚拟化环境转向云环境的系统管理员和技术架构师,要求读者熟悉云计算平台。预期读者具备虚拟化和管理 Linux 环境的知识。尽管有助于理解,但不要求具备 OpenStack 的前置知识或经验。
本书涵盖内容
第一章,使用 Ansible 安装 OpenStack,带领你通过实际操作安装 OpenStack,使用 OpenStack-Ansible。
第二章,OpenStack 客户端,介绍了如何安装操作 OpenStack 所需的工具,并提供了常用命令的快速参考。
第三章,Keystone – OpenStack 身份认证服务,介绍了如何使用 Keystone 配置和维护 OpenStack 中的服务和项目。
第四章,Neutron – OpenStack 网络,涵盖了软件定义网络服务及其插件的介绍与使用。
第五章,Nova – OpenStack 计算,通过一系列示例讲解如何运行和操作虚拟机实例以运行您的应用程序。
第六章,Glance – OpenStack 镜像服务,探讨了用于启动实例的机器镜像的使用方法。
第七章,Cinder – OpenStack 块存储,介绍了如何使用块存储卷并将其附加到您的实例。
第八章,Swift – OpenStack 对象存储,展示了如何使用高可用且冗余的对象存储服务。
第九章,使用 Heat 和 Ansible 进行 OpenStack 编排,讨论了如何开始使用 Heat 和 Ansible 在 OpenStack 内编排工作负载。
第十章,使用 OpenStack 仪表盘,展示了如何浏览 Horizon 用户界面仪表盘。
为了充分利用本书
使用本书时,您需要访问具有硬件虚拟化功能的计算机或服务器。预计您具有 Linux 操作系统的基础知识,并能通过 SSH 访问 Linux 服务器。
要设置第一章,使用 Ansible 安装 OpenStack,末尾描述的实验环境,您需要安装并使用 Oracle 的 VirtualBox 和 Vagrant。您可以访问github.com/OpenStackCookbook/vagrant-openstack
查看如何使用 VirtualBox 和 Vagrant 设置计算机的详细信息。
获取更多启动实验环境的附加资源,请访问www.openstackcookbook.com
。参考该网站以获取有关安装支持软件(如 MariaDB/MySQL)的信息。更多信息请见bit.ly/OpenStackCookbookPreReqs
。
下载示例代码文件
你可以从www.packtpub.com
的账户下载本书的示例代码文件。如果你在其他地方购买了本书,可以访问www.packtpub.com/support
,注册后直接将文件发送到你的邮箱。
你可以通过以下步骤下载代码文件:
-
登录或注册
www.packtpub.com
。 -
选择支持标签。
-
点击代码下载与勘误表。
-
在搜索框中输入书名,并按照屏幕上的指示操作。
一旦文件下载完成,确保使用以下最新版本的其中一个解压或解压文件夹:
-
适用于 Windows 的 WinRAR / 7-Zip
-
适用于 Mac 的 Zipeg / iZip / UnRarX
-
适用于 Linux 的 7-Zip / PeaZip
本书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/OpenStack-Cloud-Computing-Cookbook-Fourth-Edition
。我们还拥有其他来自我们丰富书籍和视频目录的代码包,网址为github.com/PacktPublishing/
。快来看看吧!
下载彩色图片
我们还提供了一个 PDF 文件,里面包含了本书中使用的截图/图表的彩色图片。你可以在这里下载:www.packtpub.com/sites/default/files/downloads/OpenStackCloudComputingCookbookFourthEdition_ColorImages.pdf
。
使用的约定
本书中使用了一些文本约定。
CodeInText
:表示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 账户名。这里有一个例子:在 Ubuntu 系统上,主机网络配置通过编辑/etc/network/interfaces
文件来完成。代码块如下所示:
# Shared infrastructure partsshared-infra_hosts: controller-01: ip: 172.29.236.110 controller-02: ip: 172.29.236.111 controller-03: ip: 172.29.236.112# Compute Hostscompute_hosts: compute-01: ip: 172.29.236.113 compute-02: ip: 172.29.236.114
当我们希望特别提醒你注意代码块的某一部分时,相关行或项目会用粗体显示:
# Shared infrastructure partsshared-infra_hosts: controller-01: ip: 172.29.236.110 controller-02: ip: 172.29.236.111 controller-03: ip: 172.29.236.112# Compute Hostscompute_hosts: compute-01: ip: 172.29.236.113 compute-02: ip: 172.29.236.114
任何命令行输入或输出都如下所示:
cd /opt/openstack-ansible/scripts
粗体:表示一个新术语、一个重要的词或你在屏幕上看到的词,例如在菜单或对话框中,也会像这样出现在文本中。这里有一个例子:“接下来从左侧菜单中选择高级系统设置。”
注意
警告或重要说明将以框的形式显示,如下所示。
提示
小贴士和技巧将以这种形式出现。
各部分
在本书中,你会经常看到一些标题(准备工作、如何做…、它是如何工作的…、还有更多… 和 另见)。
为了清楚地说明如何完成一个食谱,请使用以下部分:
准备工作
本节告诉你在食谱中可以期待什么,并描述如何设置所需的软件或任何预备设置。
如何操作……
本节包含遵循食谱所需的步骤。
工作原理…
本节通常包含对上一节内容的详细解释。
还有更多…
本节包含有关该食谱的额外信息,帮助你更好地了解该食谱。
另见
本节提供有关食谱的有用链接,帮助你获得更多相关信息。
联系我们
我们欢迎读者的反馈。
一般反馈:发送电子邮件至 ,并在邮件的主题中提及书名。如果你对本书的任何方面有疑问,请通过
与我们联系。
勘误:虽然我们已经尽力确保内容的准确性,但错误仍然可能发生。如果你在本书中发现了错误,我们将非常感激你向我们报告。请访问 www.packtpub.com/submit-errata
,选择你的书籍,点击勘误提交表单链接,并输入相关细节。
盗版:如果你在互联网上发现任何形式的非法复制品,我们将感激你提供相关的地址或网站名称。请通过 copyright@packtpub.com
联系我们,并附上相关资料的链接。
如果你有兴趣成为一名作者:如果你在某个领域有专业知识,并且有兴趣写书或为书籍做贡献,请访问 authors.packtpub.com
。
评论
请留下评论。阅读并使用本书后,为什么不在你购买书籍的网站上留下评论呢?潜在读者可以通过你的公正意见做出购买决策,我们 Packt 也可以了解你对我们产品的看法,而我们的作者则能看到你对他们书籍的反馈。谢谢!
想了解更多关于 Packt 的信息,请访问 packtpub.com。
第一章. 使用 Ansible 安装 OpenStack
本章将涵盖以下主题:
-
介绍 – OpenStack 架构
-
主机网络配置
-
根 SSH 密钥配置
-
安装 Ansible、剧本和依赖项
-
配置安装
-
运行 OpenStack-Ansible 剧本
-
故障排除安装
-
手动测试安装
-
修改 OpenStack 配置
-
虚拟实验室 - vagrant up!
介绍 – OpenStack 架构
OpenStack 是一套项目集合,通过软件定义环境结合起来,用户可以通过云计算友好的工具和技术进行消费。这款流行的开源软件使得用户能够轻松地消费计算、网络和存储资源,这些资源传统上由不同的 IT 团队使用各种方法和工具来管理,不论是大型还是小型团队。尽管可以通过 OpenStack 版本之间 API 的一致性来实现兼容,管理员仍然可以自由选择安装 OpenStack 的哪些功能,因此没有单一的安装方法或架构来安装该软件。这种灵活性可能会导致在选择如何部署 OpenStack 时产生困惑。尽管如此,全球一致认为,最终用户交互的服务—即 OpenStack 服务、支持软件(如数据库)和 API—必须具备高可用性。
安装 OpenStack 的一种非常流行的方法是 OpenStack-Ansible 项目(github.com/openstack/openstack-ansible
)。这种安装方法允许管理员定义高度可用的控制节点以及计算和存储阵列,并通过使用 Ansible,以非常一致的方式部署 OpenStack,且所需的依赖项较少。Ansible 是一种通过标准 SSH 连接进行系统配置和管理的工具。Ansible 本身依赖项很少,而且由于它使用 SSH 进行通信,大多数 Linux 发行版和网络都能够很好地支持这个工具。它在全球许多系统管理员中非常受欢迎,因此在他们已有的知识基础上安装 OpenStack,降低了为企业用户设置云环境的门槛。
OpenStack 可以以多种方式进行架构设计;OpenStack-Ansible 并不直接解决架构问题:用户可以自由定义任意数量的控制服务(如 Horizon、Neutron Server、Nova Server 和 MySQL)。通过 Rackspace 的经验和用户反馈,定义了一种流行的架构,示例如下:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00002.jpeg
图 1:本书推荐的 OpenStack 架构
如前图所示(图 1),首先需要了解一些概念。这些概念如下所述。
控制节点
控制器(也称为基础设施节点或infra 节点)运行 OpenStack 服务的核心部分,是唯一通过负载均衡池对外暴露的服务器(通过负载均衡池)供最终用户使用。控制器运行 API 服务,例如 Nova API、Keystone API 和 Neutron API,以及核心支持服务,如用于运行 OpenStack 所需数据库的MariaDB和用于消息传递的 RabbitMQ。正因为如此,在生产环境中,这些服务器必须按照需求配置为高可用性。这意味着这些服务器作为集群部署在(高可用)负载均衡器后面,集群中至少有 3 台服务器。使用从 3 开始的奇数集群,可以使集群在丧失一台服务器的情况下仍然保持服务不受影响,并且仍能保持法定人数(即需要的最小投票数)。这意味着,当不健康的服务器重新上线时,数据可以从剩余的 2 台服务器中复制(它们之间是一致的),从而确保数据的一致性。
网络建议具有高度的弹性,因此需要确保 Linux 已配置为绑定或聚合网络接口,以便在发生交换机端口故障或电缆损坏时,您的服务仍然可用。Ubuntu 的示例网络配置可以在附录 A中找到。
计算节点
这些是运行虚拟化管理程序或容器服务的服务器,当用户请求 Nova 资源(例如虚拟机)时,OpenStack 将工作负载调度到这些服务器上。它们与运行虚拟化管理程序的主机(如 ESXi 或 Hyper-V)没有太大区别,OpenStack 计算服务器的配置方式也非常相似,可以选择使用共享存储。然而,大多数 OpenStack 安装都会避免在架构中使用共享存储。这个不使用共享存储的小细节意味着虚拟机直接从计算主机的硬盘上运行,这对于讨论环境中应用的弹性时,会对 OpenStack 环境的用户产生较大影响。像这样设置的环境将大部分应用正常运行的责任交给开发者,这为长期云策略提供了最大的灵活性。当一个应用依赖于底层基础设施 100%可用时,基础设施所施加的重力会将应用绑定到特定的数据中心技术上以确保其运行。然而,OpenStack 可以配置为引入共享存储,例如 Ceph(ceph.com/
),以支持像实时迁移(在不中断的情况下将正在运行的实例从一个虚拟化管理程序迁移到另一个虚拟化管理程序)的操作特性,这样可以非常安全地将企业用户的应用迁移到云环境中。这些概念将在后续的计算和存储章节中详细讨论。因此,计算节点的参考架构是预期虚拟机将直接运行在服务器本身的硬盘上。
关于网络配置,像控制器一样,网络也必须配置为高可用性。一个没有可用网络的计算节点可能非常安全,但对于云环境来说同样毫无用处!请像配置控制器一样配置绑定接口。有关在 Ubuntu 下配置绑定接口的更多信息,请参见附录 A。
存储
OpenStack 中的存储指的是块存储和对象存储。块存储(为虚拟机提供 LUN 或 硬盘)由 Cinder 服务提供,而对象存储(由 API 驱动的对象或数据块存储)由 Swift 或 Ceph 提供。Swift 和 Ceph 管理服务器中每个被指定为对象存储节点的独立硬盘,就像 RAID 卡管理典型服务器中的硬盘一样。每个硬盘都是一个独立的实体,Swift 或 Ceph 用它来写入数据。例如,如果一个存储节点有 24 块 2.5 英寸的 SAS 硬盘,Swift 或 Ceph 会配置为写入这 24 块硬盘中的任何一块。然而,Cinder 可以使用多种后端来存储数据。例如,Cinder 可以配置为与第三方供应商(如 NetApp 或 Solidfire 存储阵列)通信,或者它可以配置为与 Sheepdog 或 Ceph 通信,还可以与像 LVM 这样的简单服务通信。事实上,OpenStack 可以配置为让 Cinder 使用多个后端,从而使用户能够选择适用于他们所需服务的存储。这为最终用户和操作员提供了极大的灵活性,因为这意味着工作负载可以针对特定的后端进行优化,适合该工作负载或存储需求。
本书简要介绍了 Ceph 作为 Cinder 的后台存储引擎。Ceph 是一个非常流行、高可用的开源存储服务。Ceph 有其自身的磁盘要求,以提供最佳的性能。在前面的图示中,每个 Ceph 存储节点被称为Ceph OSD(Ceph 对象存储守护进程)。我们建议从 5 个节点开始,尽管这不是硬性规定。Ceph 性能调优超出了本书的范围,但至少,我们强烈推荐使用 SSD 来进行 Ceph 日志存储,OSD(物理存储单元)则可以使用 SSD 或 SAS 驱动器。
在此架构中,Swift 节点和 Ceph 节点之间的区别非常小。两者都需要一个用于存储集群中数据复制的接口(为提高容错性,接口通常是绑定的),以及一个用于从客户端或服务读取和写入数据的接口(同样为了容错性,接口通常是绑定的)。
主要的区别在于建议使用 SSD(或 NVMe)作为日志磁盘。
负载均衡
OpenStack 环境的最终用户期望服务具有高度可用性,OpenStack 为其所有功能提供 REST API 服务。这使得 REST API 服务非常适合放置在负载均衡器后面。在大多数部署中,负载均衡器通常是高度可用的硬件设备,例如 F5。为了本书的目的,我们将使用 HAProxy。不过,背后的前提是相同的——确保服务在 控制器 节点故障的情况下仍然可用,以便最终用户可以继续工作。
OpenStack-Ansible 安装要求
操作系统:Ubuntu 16.04 x86_64
最小的数据中心部署要求
对于物理安装,以下是所需的:
-
控制器服务器(也称为基础设施节点)
-
至少 64 GB 内存
-
至少 300 GB 硬盘(RAID)
-
4 个网络接口卡(用于创建两组绑定接口;一组用于基础设施和所有 API 通信,包括客户端,另一组专用于 OpenStack 网络:Neutron)
-
共享存储或对象存储服务,提供基础 OS 镜像的后端存储
-
-
计算服务器
-
至少 64 GB 内存
-
至少 600 GB 硬盘(RAID)
-
4 个网络接口卡(用于创建两组绑定接口,和控制器服务器使用相同方式)
-
-
可选(如果使用 Ceph 作为 Cinder)5 台 Ceph 服务器(Ceph OSD 节点)
-
至少 64 GB 内存
-
2 个 400 GB SSD(RAID1)用于日志记录
-
8 个 300 GB SAS 或 SSD(不使用 RAID)用于 OSD(根据需求调整大小)
-
4 个网络接口卡(用于创建两组绑定接口;一组用于复制,另一组用于在 Ceph 中的数据进出传输)
-
-
可选(如果使用 Swift)5 台 Swift 服务器
-
至少 64 GB 内存
-
8 个 300 GB SAS(不使用 RAID)(根据需求调整大小)
-
4 个网络接口卡(用于创建两组绑定接口;一组用于复制,另一组用于在 Swift 中的数据进出传输)
-
-
负载均衡器
-
配置为一对的 2 台物理负载均衡器
-
或者 2 台运行 HAProxy 和 Keepalived VIP 的服务器,作为 API 端点的 IP 地址:
-
至少 16 GB 内存
-
HAProxy + Keepalived
-
2 个网络接口卡(绑定)
-
-
提示
提示:在设置物理实验室时,请确保你有一个管理型交换机,以便接口可以打上 VLAN 标签。
主机网络配置
使用如 Ansible 这样的编排和配置工具安装 OpenStack 可以自动化很多原本需要手动完成的任务。然而,我们只能在服务器以一致的方式配置并且已向 Ansible 描述时,使用编排工具。
以下部分将描述一种典型的服务器配置,使用两组活动/被动绑定接口供 OpenStack 使用。确保这些接口连接正确。
我们假设每台服务器都已安装以下物理网络卡;根据你的环境进行调整:
-
p2p1
和p2p2
-
p4p1
和p4p2
我们假设 主机 网络当前使用 p2p1
。主机 网络是每台服务器当前所在的基础网络,允许你通过 SSH 访问每台服务器。假设该网络已经配置了默认网关,并且可以访问互联网。在这一阶段,应该不需要其他网络,因为服务器尚未配置,也未运行 OpenStack 服务。
在本节末尾,我们将创建以下绑定接口:
-
bond0
:这由物理接口p2p1
和p4p1
组成。bond0
接口将用于主机、OpenStack 管理和存储流量。 -
bond1
:这由物理接口p2p2
和p4p2
组成。bond1
接口将用于 OpenStack 中的 Neutron 网络。
我们将创建以下 VLAN 标记的接口:
-
bond0.236
:该接口将用于容器网络。 -
bond0.244
:该接口将用于存储网络。 -
bond1.240
:该接口将用于VXLAN 隧道网络。
以及以下桥接:
-
br-mgmt
:该桥接将使用bond0.236
VLAN 接口,并将配置来自172.29.236.0/24
范围内的 IP 地址。 -
br-storage
:该桥接将使用bond0.244
VLAN 接口,并将配置来自172.29.244.0/24
范围内的 IP 地址。 -
br-vxlan
:该桥接将使用bond1.240 VLAN
接口,并将配置来自172.29.240.0/24
范围内的 IP 地址。 -
br-vlan
:该桥接将使用未标记的bond1
接口,并且不会配置 IP 地址。
提示
提示:确保你的子网足够大,既能满足当前需求,也能支持未来的扩展!
以下图示展示了我们在开始安装 OpenStack 之前设置的网络、接口和桥接:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00003.jpeg
准备开始
我们假设每台服务器都已安装 Ubuntu 16.04。
以 root 身份登录到将安装 OpenStack 的每台服务器。
如何操作…
在 Ubuntu 系统上配置主机网络是通过编辑/etc/network/interfaces
文件完成的。
-
首先,确保每台服务器上已安装正确的网络包。由于我们使用 VLAN 和桥接,必须安装以下软件包:
apt update apt install vlan bridge-utils
-
现在使用你喜欢的编辑器编辑第一个服务器上的
/etc/network/interfaces
文件:vi /etc/network/interfaces
-
我们将首先配置绑定接口。文件的第一部分将描述这一点。编辑此文件,使其开始时看起来像以下内容:
# p2p1 + p4p1 = bond0 (used for host, container and storage) auto p2p1 iface p2p1 inet manual bond-master bond0 bond-primary p2p1 auto p4p1 iface p4p1 inet manual bond-master bond0 # p2p2 + p4p2 = bond1 (used for Neutron and Storage Replication) auto p2p2 iface p2p2 inet manual bond-master bond1 bond-primary p2p2 auto p4p2 iface p4p2 inet manual bond-master bond1
-
现在我们将配置与这些绑定接口相关联的 VLAN 接口。继续编辑文件,添加以下标记的接口。请注意,我们尚未为 OpenStack 的绑定接口分配 IP 地址:
# We\'re using bond0 on a native VLAN for the \'host\' network. # This bonded interface is likely to replace the address you # are currently using to connect to this host. auto bond0 iface bond0 inet static address 192.168.100.11 netmask 255.255.255.0 gateway 192.168.100.1 dns-nameserver 192.168.100.1 # Update to suit/ensure you can resolve DNS auto bond0.236 # Container VLAN iface bond0.236 inet manual auto bond1.240 # VXLAN Tunnel VLAN iface bond1.240 inet manual auto bond0.244 # Storage (Instance to Storage) VLAN iface bond0.244 inet manual
提示
提示:根据你自己的环境,使用适当的 VLAN。这里使用的 VLAN 标签仅供参考。
确保正确的 VLAN 标签配置在正确的绑定接口上。
bond0
用于主机类型的流量,bond1
主要用于基于 Neutron 的流量,存储节点除外,在这种情况下它用于存储复制。 -
现在我们将创建桥接,并根据需要在其上配置 IP 地址(请注意,
br-vlan
没有分配 IP 地址)。继续编辑相同的文件,添加以下行:# Container bridge (br-mgmt)auto br-mgmtiface br-mgmt inet static address 172.29.236.11 netmask 255.255.255.0 bridge_ports bond0.236 bridge_stp off# Neutron\'s VXLAN bridge (br-vxlan)auto br-vxlaniface br-vxlan inet static address 172.29.240.11 netmask 255.255.255.0 bridge_ports bond1.240 bridge_stp off# Neutron\'s VLAN bridge (br-vlan)auto br-vlaniface br-vlan inet manual bridge_ports bond1 bridge_stp off# Storage Bridge (br-storage)auto br-storageiface br-storage inet static address 172.29.244.11 netmask 255.255.255.0 bridge_ports bond0.244 bridge_stp off
提示
这些桥接名称会在 OpenStack-Ansible 配置文件中被引用,因此确保你正确命名它们。
小心确保正确的桥接被分配到正确的绑定接口。
-
保存并退出文件,然后执行以下命令:
restart networking
-
由于我们正在配置 OpenStack 环境,使其尽可能具有高可用性,因此建议你此时重新启动服务器,以确保基本的服务器,带有冗余网络,能够按预期重新启动:
reboot
-
现在对你网络中的每台服务器执行相同操作。
-
一旦所有服务器完成配置,确保你的服务器能够通过这些新创建的接口和子网互相通信。类似下面的测试可能会很方便:
apt install fpingfping -a -g 172.29.236.0/24fping -a -g 172.29.240.0/24fping -a -g 172.29.244.0/24
提示
提示:我们还建议你执行一个网络电缆拔除练习,以确保从一个活动接口切换到另一个接口的故障转移功能按预期工作。
它是如何工作的…
我们已经配置了主机的物理网络,以确保在运行 OpenStack 时有一个良好的已知状态和配置。这里配置的每个接口都是 OpenStack 特定的—要么由 OpenStack 直接管理(例如,br-vlan
),要么用于服务间通信(例如,br-mgmt
)。在前一种情况下,OpenStack 使用 br-vlan
桥接并直接在 bond1
上配置标记接口。
请注意,这里使用的约定,VLAN 标签 ID 使用子网的一部分,仅用于突出 VLAN 到特定子网的分离(例如,bond0.236
用于 172.29.236.0/24
子网)。此 VLAN 标签 ID 是任意的,但必须根据你的具体网络需求进行设置。
最后,我们进行了一个相当基础的网络测试。这可以让你确信,OpenStack 云生命周期中将使用的网络配置是合适的,并且在网络电缆或网卡发生故障时,能够提供保障。
Root SSH 密钥配置
Ansible 旨在通过使用编排剧本配置和操作多台服务器,帮助系统管理员提高数据中心的效率。为了使 Ansible 能够履行其职责,它需要在其管理的 Linux 系统上建立 SSH 连接。此外,为了获得更大的自由度和灵活性,必须使用 SSH 公私钥对的无人值守方法。
由于 OpenStack 的安装预计以 root 身份运行,因此此阶段需要将部署主机的 root 公钥传播到所有服务器。
准备工作
确保你在部署主机上是root
用户。在大多数情况下,这是我们为本书目的命名的第一个基础设施控制器节点,命名为infra01
。我们将假设所有的 Ansible 命令都将在这个主机上运行,并且它预计能够通过 SSH 通过主机网络连接到网络上的其他服务器。
如何操作…
为了实现无需人工干预的自动化 OpenStack-Ansible 部署,请按照以下步骤创建并传播 infra01
的 root SSH 公钥至所有安装所需的服务器:
-
作为 root,执行以下命令来创建 SSH 密钥对:
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N \"\"
输出应类似于以下内容:
Generating public/private rsa key pair.Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:SHA256:q0mdqJI3TTFaiLrMaPABBboTsyr3pRnCaylLU5WEDCw root@infra01The key\'s randomart image is:+---[RSA 2048]----+|ooo .. ||E..o. . ||=. . + ||.=. o + ||+o . o oS ||+oo . .o ||B=++.o+ + ||*=B+oB.o ||o+.o=.o |+----[SHA256]-----+
-
这在
/root/.ssh
目录下创建了两个文件,分别叫做id_rsa
和id_rsa.pub
。文件id_rsa
是私钥,必须避免通过网络进行复制。它只需要存在于该服务器上。文件id_rsa.pub
是公钥,可以共享到网络上的其他服务器。如果你有其他节点(例如名为 infra02),可以使用以下命令将此密钥复制到你环境中的该节点:ssh-copy-id root@infra02
提示
提示:确保你能解析
infra02
和其他服务器,否则修改前面的命令,使用主机的 IP 地址代替。 -
现在,对你网络上的所有服务器重复步骤 2。
-
重要:最后,确保执行以下命令,以便能够进行自我 SSH 连接:
ssh-copy-id root@infra01
-
测试你能否作为 root 用户,从
infra01
使用ssh
连接到网络上的其他服务器。如果成功,应该会显示一个终端,准备接受命令,而不会要求输入密码。如果此行为不正常,请查看远程服务器上的/var/log/auth.log
。
其工作原理…
我们首先生成了一个密钥对文件供 SSH 使用。-t
选项指定了 rsa
类型加密,-f
指定了私钥的输出路径,公钥部分将以 .pub
为文件名后缀,-N \"\"
表示不使用密码短语。若选项与贵公司要求不符,请参照贵公司安全标准。
安装 Ansible、剧本和依赖项
为了成功通过 Ansible 安装 OpenStack,我们需要确保在部署主机上安装了 Ansible 及所有预期的依赖项。OpenStack-Ansible 项目为我们提供了一个方便的脚本来完成这项工作,该脚本是我们将要部署的 OpenStack-Ansible 版本的一部分。
准备就绪
确保你在部署主机上以 root
身份登录。在大多数情况下,这将是第一个基础设施控制节点 infra01
。
此时,我们将从 GitHub 检出 OpenStack-Ansible 的版本。
如何操作…
为了设置 Ansible 及其依赖项,请按照以下步骤操作:
-
我们首先需要使用
git
从 GitHub 检出 OpenStack-Ansible 代码,因此确保安装了以下包(以及其他所需的依赖项):apt updateapt install git python-dev bridge-tools lsof lvm2 tcpdump build- essential ntp ntpdate python-dev libyaml-dev libpython2.7-dev libffi-dev libssl-dev python-crypto python-yaml
-
然后我们需要从 GitHub 获取 OpenStack-Ansible 代码。写作时,Pike 发布分支(16.X)描述如下,但在可预见的未来步骤将保持不变。建议访问
github.com/openstack/openstack-ansible/tags
来使用最新的稳定标签。此处我们使用的是最新的 16(Pike)标签,即16.0.5
:提示
提示:要使用 Queens 发布的某个分支,请使用以下命令:
-b 17.0.0
。当 Rocky 发布可用时,请使用-b 18.0.0
。git clone -b 16.0.5 https://github.com/openstack/openstack-ansible.git /opt/openstack-ansible
-
Ansible 和成功安装 OpenStack 所需的依赖项可以在
/opt/openstack-ansible/scripts
目录中找到。运行以下命令以引导环境:cd /opt/openstack-ansiblescripts/bootstrap-ansible.sh
工作原理…
OpenStack-Ansible 项目提供了一个便捷的脚本,以确保在部署主机上安装了 Ansible 和正确的依赖项。这个脚本(bootstrap-ansible.sh
)位于检出的 OpenStack-Ansible 代码的 scripts/
目录中,因此此时我们需要使用 Git 获取我们想要部署的版本。一旦获得代码,我们可以执行脚本并等待其完成。
还有更多内容…
访问 docs.openstack.org/project-deploy-guide/openstack-ansible/latest
获取更多信息。
配置安装
OpenStack-Ansible 是一组官方的 Ansible playbook 和角色,它以最小的先决条件部署 OpenStack。像任何编排工具一样,大部分工作是在配置阶段完成的,然后在 playbook 运行时实现免手动操作。最终的结果是一个经过多次验证的 OpenStack 安装,适用于任何规模的环境,从测试到生产环境。
当我们使用 OpenStack-Ansible 时,实际上是在将 playbooks 从 GitHub 下载到指定的 部署服务器。部署服务器是通过 SSH 访问环境中所有机器的主机(为了便利以及提供无缝的体验,通常通过密钥进行访问)。这个部署服务器可以是你指定的任何一台机器,因为一旦运行,Ansible 不会占用任何持续的资源。
提示
提示:在重新安装 Ubuntu 之前,记得备份与 OpenStack-Ansible 相关的配置目录!
准备工作
确保你是 部署主机 上的 root
用户。在大多数情况下,这将是第一个基础设施控制节点 infra01
。
如何操作…
假设你使用的是第一个基础设施节点 infra01
作为部署服务器。
如果你没有按照前面的 安装 Ansible、playbooks 和依赖项 章节进行操作,请作为 root
执行以下操作(如有必要):
git clone -b 16.05 https://github.com/openstack/openstack-ansible.git /opt/openstack-ansible
这将把 OpenStack-Ansible playbook 下载到 /opt/openstack-ansible
目录。
要配置 OpenStack 部署,请执行以下步骤:
-
我们首先将
etc/openstack_deploy
文件夹从下载的仓库复制到/etc
:cd /opt/openstack-ansiblecp -R /etc/openstack_deploy /etc
-
现在,我们必须通过编辑
/etc/openstack_deploy/openstack_user_config.yml
文件,告诉 Ansible 哪些服务器将执行哪些 OpenStack 功能,如下所示:cp /etc/openstack_deploy/openstack_user_variables.yml.example /etc/openstack_deploy_openstack_user_variables.ymlvi /etc/openstack_deploy/openstack_user_variables.yml
-
第一部分,
cidr_networks
,描述了 OpenStack 在此安装中使用的子网。在这里,我们描述了 容器 网络(每个 OpenStack 服务都运行在一个容器中,并且每个服务有自己的网络,以便它们之间可以相互通信)。我们描述了隧道网络(当用户在 OpenStack 安装中创建租户网络时,这将创建一个在物理网络上隔离的 VXLAN 网络)。最后,我们描述了存储网络子网。编辑此文件,使其看起来如下所示:cidr_networks: container: 172.29.236.0/24 tunnel: 172.29.240.0/24 storage: 172.29.244.0/24
-
继续编辑文件,包含已在 OpenStack 将要部署的环境中由现有物理主机使用的任何 IP 地址(并确保已包含用于物理扩展的任何保留 IP 地址)。包括我们在此章节前已经配置的地址。可以在此处添加单个 IP 地址或地址范围(起始和结束地址用 ‘,’ 分隔)。编辑此部分,使其看起来如下所示,按你的环境和任何保留的 IP 进行调整:
used_ips: - \"172.29.236.20\" - \"172.29.240.20\" - \"172.29.244.20\" - \"172.29.236.101,172.29.236.117\" - \"172.29.240.101,172.29.240.117\" - \"172.29.244.101,172.29.244.117\" - \"172.29.248.101,172.29.248.117\"
-
global_overrides
部分描述了用于环境的桥接和其他接口的具体细节——特别是容器网络如何连接到物理网络接口。对于本书中使用的示例架构,可以使用以下输出。在大多数情况下,除了开始时的负载均衡器信息外,本节内容无需编辑,因此根据需要调整:global_overrides: internal_lb_vip_address: 172.29.236.117 external_lb_vip_address: 192.168.100.117 lb_name: haproxy tunnel_bridge: \"br-vxlan\" management_bridge: \"br-mgmt\" provider_networks: - network: group_binds: - all_containers - hosts type: \"raw\" container_bridge: \"br-mgmt\" container_interface: \"eth1\" container_type: \"veth\" ip_from_q: \"management\" is_container_address: true is_ssh_address: true - network: group_binds: - neutron_linuxbridge_agent container_bridge: \"br-vxlan\" container_type: \"veth\" container_interface: \"eth10\" ip_from_q: \"tunnel\" type: \"vxlan\" range: \"1:1000\" net_name: \"vxlan\" - network: group_binds: - neutron_linuxbridge_agent container_bridge: \"br-vlan\" container_type: \"veth\" container_interface: \"eth11\" type: \"vlan\" range: \"1:1\" net_name: \"vlan\"
-
本文件的剩余部分描述了每个服务运行的服务器。大部分章节内容重复,仅在服务名称上有所不同。这是可以接受的,因为此处的目的是告诉 OpenStack-Ansible 每个服务(我们为它起一个名字,便于 Ansible 通过名称引用,并引用与其关联的 IP 地址)在哪个服务器上运行,例如 Nova API、RabbitMQ 或 Glance 服务等。由于这些示例服务运行在我们的控制节点上,而在生产环境中至少有三个控制节点,所以你可以很快明白为什么这些信息会重复。其他章节则专门提到其他服务,如 OpenStack 计算服务。为了简洁起见,这里展示了几个章节,继续编辑文件以适应你的网络配置:
# Shared infrastructure partsshared-infra_hosts: controller-01: ip: 172.29.236.110 controller-02: ip: 172.29.236.111 controller-03: ip: 172.29.236.112# Compute Hostscompute_hosts: compute-01: ip: 172.29.236.113 compute-02: ip: 172.29.236.114
-
保存并退出文件。接下来,我们需要为 OpenStack 中运行的各个服务生成一些随机密码短语。在 OpenStack 中,每个服务——如 Nova、Glance 和 Neutron(本书中有描述)——都必须向 Keystone 进行身份验证,并授权它们作为服务进行操作。为此,它们自己的用户帐户需要生成密码短语。执行以下命令以生成所需的密码短语,这些密码短语将在稍后执行 OpenStack playbook 时使用:
cd /opt/openstack-ansible/scriptspython pw-token-gen.py --file /etc/openstack_deploy/user_secrets.yml
-
最后,还有另一个文件允许你对 OpenStack 服务的参数进行微调,例如 Glance(OpenStack 镜像服务)将使用的后端存储,并在安装之前配置代理服务。这个文件叫做
/etc/openstack_deploy/user_variables.yml
。让我们查看并编辑这个文件:cd /etc/openstack_deployvi user_variables.yml
-
在一个典型的高可用部署中——即我们有三个控制节点的部署——我们需要配置 Glance 使用共享存储服务,这样三个控制节点就可以对文件系统有相同的视图,从而使启动实例时使用的镜像一致。Glance 可以使用的一些共享存储后端系统包括 NFS 和 Swift。我们甚至可以允许一个私有云环境通过公共网络连接并连接到像 Rackspace Cloud Files 这样的公共服务。如果你有可用的 Swift,可以将以下行添加到
user_variables.yml
文件中,配置 Glance 使用 Swift:glance_swift_store_auth_version: 3glance_default_store: swiftglance_swift_store_auth_address: http://172.29.236.117:5000/v3glance_swift_store_container: glance_imagesglance_swift_store_endpoint_type: internalURLglance_swift_store_key: \'{{ glance_service_password }}\'glance_swift_store_region: RegionOneglance_swift_store_user: \'service:glance\'
提示
提示:OpenStack-Ansible 的最新版本足够智能,能够自动检测是否使用了 Swift,并会相应地更新其配置。
-
查看文件中其他被注释掉的详细信息,看看是否需要根据你的环境进行编辑,然后保存并退出。现在你可以开始安装 OpenStack 了!
它是如何工作的……
Ansible 是一个非常流行的服务器配置工具,非常适合安装 OpenStack。Ansible 使用一组配置文件,Playbooks(一组在服务器上执行的步骤)用来控制它们的执行方式。对于 OpenStack-Ansible,配置分为两个领域:描述物理环境和描述如何配置 OpenStack。
第一个配置文件/etc/openstack_deploy/openstack_user_config.yml
描述了物理环境。每个部分在这里都有描述:
cidr_networks: container: 172.29.236.0/24 tunnel: 172.29.240.0/24 storage: 172.29.244.0/24
本节描述了基于 OpenStack-Ansible 安装所需的网络。查看下面的图示,了解不同的网络和子网。
-
容器:每个部署的容器都会从这个子网中获取一个 IP 地址。负载均衡器也会从这个范围内获取一个 IP 地址。
-
隧道:这是形成 VXLAN 隧道网格的子网。每个参与 VXLAN 隧道的容器和计算主机都会从这个范围内获得一个 IP(当操作员创建一个指定
vxlan
类型的 Neutron 子网时,VXLAN 隧道会被使用,这在这个底层子网上创建了一个虚拟网络)。有关 OpenStack 网络的更多细节,请参阅 第四章,Neutron – OpenStack Networking。 -
存储:这是在 OpenStack 中启动客户端实例时使用的子网,要求 Cinder 块存储:
used_ips: - \"172.29.236.20\" - \"172.29.240.20\" - \"172.29.244.20\" - \"172.29.236.101,172.29.236.117\" - \"172.29.240.101,172.29.240.117\" - \"172.29.244.101,172.29.244.117\" - \"172.29.248.101,172.29.248.117\"
used_ips:
部分指的是已经在该子网中使用的 IP 地址,或为静态设备保留的 IP 地址。此类设备包括负载均衡器或其他属于子网的主机,否则 OpenStack-Ansible 会将这些 IP 随机分配给容器:
global_overrides: internal_lb_vip_address: 172.29.236.117 external_lb_vip_address: 192.168.1.117 tunnel_bridge: \"br-vxlan\" management_bridge: \"br-mgmt\" storage_bridge: \"br-storage\"
global_overrides:
部分描述了容器与桥接网络的设置细节。OpenStack-Ansible 的默认文档假设使用 Linux Bridge;但是,也可以使用 Open vSwitch。有关更多细节,请参考第四章,Neutron – OpenStack 网络。
internal_lb_vip_address:
和 external_lb_vip_address:
部分指的是典型负载均衡器的 私有 和 公共 端口。私有端口(internal_lb_vip_address
)由 OpenStack 内的服务使用(例如,Nova 调用与 Neutron API 的通信时会使用 internal_lb_vip_address
,而用户在 OpenStack 环境安装后进行通信时则会使用 external_lb_vip_address
)。请参见以下图示:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00004.jpeg
为某个 虚拟 IP (VIP) 地址将创建多个负载均衡池,描述与特定服务相关的 IP 地址和端口,对于每个池——一个将在公共/外部网络上创建(在示例中,已为此目的创建了 VIP 地址 192.168.100.117
),另一个 VIP 将供 OpenStack 内部使用(在前面的示例中,已为此目的创建了 VIP 地址 172.29.236.117
)。
tunnel_bridge:
部分是为连接参与 VXLAN 隧道网络的物理接口而设定的桥接名称。
management_bridge:
部分是为所有在容器网络上安装的 OpenStack 服务设定的桥接名称,容器网络如图所示。
storage_bridge:
部分是为与实例连接存储或 Swift 代理的流量而设定的桥接名称。
上述每个桥接名称必须与在每台服务器的 /etc/network/interfaces
文件中配置的名称匹配。
接下来的部分,provider_networks
,相对静态且未更改,它描述了容器网络与物理环境之间的关系。请勿调整此部分。
provider_networks
部分后面是描述哪个服务器或服务器组运行特定服务的部分。每个块的语法如下:
service_name: ansible_inventory_name_for_server: IP_ADDRESS ansible_inventory_name_for_server: IP_ADDRESS
提示
提示:确保每个服务器名称(ansible_inventory_name_for_server
)的拼写正确一致,以确保 Ansible playbook 的正确执行。
这里列出了若干部分及其用途:
-
shared-infra_hosts
:这些支持共享基础设施软件,如 MariaDB/Galera 和 RabbitMQ。 -
repo-infra_hosts
:这是指定的 OpenStack-Ansible 容器版本。 -
haproxy_hosts
:在使用 HAProxy 进行负载均衡时,指示 playbook 安装和配置此服务的位置。 -
os-infra_hosts
:这些包括 OpenStack API 服务,如 Nova API 和 Glance API。 -
log_hosts
:这是运行 rsyslog 服务器的地方。 -
identity_hosts
:这些是运行 Keystone(OpenStack Identity)服务的服务器。 -
storage-infra_hosts
:这些是运行 Cinder API 服务的服务器。 -
storage_hosts
:这是描述 Cinder LVM 节点的部分。 -
swift-proxy_hosts
:这些是将托管 Swift Proxy 服务的主机。 -
swift_hosts
:这些是 Swift 存储节点。 -
compute_hosts
:这是组成虚拟化服务器的主机列表。 -
image_hosts
:这些是运行 Glance(OpenStack Image)服务的服务器。 -
orchestration_hosts
:这些是运行 Heat API(OpenStack Orchestration)服务的服务器。 -
dashboard_hosts
:这些是运行 Horizon(OpenStack Dashboard)服务的服务器。 -
network_hosts
:这些是运行 Neutron(OpenStack Networking)代理和服务的服务器。 -
metering-infra_hosts
:这些是运行 Ceilometer(OpenStack Telemetry)服务的服务器。 -
metering-alarm_hosts
:这些是运行与告警相关的 Ceilometer(OpenStack Telemetry)服务的服务器。 -
metrics_hosts
:运行 Ceilometer 组件(Gnocchi)的服务器。 -
metering-compute_hosts
:使用 Ceilometer 时,这些是需要安装计量代理的计算主机列表。
运行 OpenStack-Ansible playbook。
安装 OpenStack 时,我们只需运行相关的 playbook。总共有三个主要的 playbook,我们将依次使用:
-
setup-hosts.yml
。 -
setup-infrastructure.yml
。 -
setup-openstack.yml
。
准备工作。
确保你是部署主机上的 root
用户。在大多数情况下,这将是第一个基础设施控制节点,infra01
。
如何操作……
要使用 OpenStack-Ansible playbook 安装 OpenStack,首先导航到已克隆 Git 仓库的 playbooks
目录,然后依次执行每个 playbook:
-
首先通过执行以下命令切换到
playbooks
目录:cd /opt/openstack-ansible/playbooks
-
第一步是对你的脚本和配置进行语法检查。由于我们将执行三个 playbook,我们将针对每个 playbook 执行以下操作:
openstack-ansible setup-hosts.yml --syntax-checkopenstack-ansible setup-infrastructure.yml --syntax-checkopenstack-ansible setup-openstack.yml --syntax-check
-
现在我们将使用一个特殊的 OpenStack-Ansible 包装脚本来运行第一个 playbook,配置我们在
/etc/openstack_deploy/openstack_user_config.yml
文件中描述的每个主机:openstack-ansible setup-hosts.yml
-
稍等片刻后,你应该看到一个完全绿色的 PLAY RECAP 输出(其中黄色/蓝色的行表示做出的任何更改),并且输出显示所有更改都成功。如果有问题,请通过滚动回输出内容来查看并留意任何红色输出的内容。请参考本章后面的故障排除安装部分。如果一切正常,我们可以继续运行下一个 Playbook 以设置负载均衡。在此阶段,配置负载均衡器非常重要。OpenStack-Ansible 将 OpenStack 服务安装在每台服务器的 LXC 容器中,到目前为止,我们还没有明确说明哪个容器网络的 IP 地址将安装哪个服务。这是因为我们让 Ansible 为我们管理这一切。因此,虽然在此阶段设置负载均衡似乎有些反直觉——因为我们还不知道每个服务会安装在哪个容器上——但 Ansible 已经在未来的工作之前生成了动态清单,所以它已经知道涉及多少个容器,并知道哪个容器会安装该服务。如果你使用的是 F5 LTM、Brocade 或类似的企业级负载均衡设备,建议你暂时使用 HAProxy,并查看生成的配置,以便手动转移到物理设备上。为了临时设置 HAProxy,使 OpenStack 的安装能够继续,修改你的
openstack_user_config.yml
文件,包含一个 HAProxy 主机,然后执行以下命令:openstack-ansible install-haproxy.yml
-
如果一切正常,我们可以继续运行下一个 Playbook 来设置共享基础设施服务,如下所示:
openstack-ansible setup-infrastructure.yml
-
这个步骤比第一个 Playbook 花费的时间稍长。如同之前一样,检查输出是否有失败。在此阶段,我们应该在每个基础设施节点(也称为控制节点)上运行多个容器。在这些容器中,像 Galera 或 RabbitMQ 这样的容器上,我们应该看到服务在正常运行,等待 OpenStack 对其进行配置。现在,我们可以通过运行最大的 Playbook 来继续安装 OpenStack 本身。为此,请执行以下命令:
openstack-ansible setup-openstack.yml
-
这个过程可能需要一段时间——可能长达数小时——因此请确保你的 SSH 会话在长时间后不会中断,并通过像
tmux
或screen
这样的工具来防止断开连接,做好准备。在 Playbook 执行结束时,如果一切正常,恭喜你,OpenStack 已经安装完成!
它是如何工作的……
使用 OpenStack-Ansible 安装 OpenStack 是通过多个 Playbooks 完成的。第一个 Playbook setup-hosts.yml
配置主机,设置容器配置。在此阶段,Ansible 已经知道将来会在哪些地方放置所有与 OpenStack 相关的服务,因此我们使用动态清单信息来安装 HAProxy,并将其配置为所有 OpenStack 服务(这些服务尚未安装)使用的代理服务。下一个 Playbook setup-infrastructure.yml
配置并安装 OpenStack 期望存在的基础设施服务容器,如 Galera。最后一个 Playbook 是主 Playbook——它安装我们在配置中指定的所有 OpenStack 服务。该过程会运行一段时间,但最终你会得到一个完整的 OpenStack 安装。
OpenStack-Ansible 项目提供了一个包装脚本,包装了通常用于执行 Playbooks 的 ansible
命令。这个脚本叫做 openstack-ansible
。本质上,它确保将正确的清单和配置传递给 ansible
命令,以确保正确运行 OpenStack-Ansible 的 Playbooks。
安装故障排除
Ansible 是一款由人编写的工具,运行由人编写的 Playbooks,来配置通常需要人为手动操作的系统,因此错误是难免发生的。最终结果的质量取决于输入的质量。
常见的故障通常会很快出现,例如连接问题,这些问题会比较明显,或者在长时间运行的任务后出现,可能是由于负载或网络超时导致的。无论如何,OpenStack-Ansible 的 Playbooks 提供了一种高效的机制,可以在不重复已经完成的任务的情况下重新运行 Playbooks。
在失败时,Ansible 会在 /root
目录下生成一个文件(因为我们是以 root
身份运行这些 Playbooks),文件名为 Playbook 的名称,文件扩展名为 .retry
。该文件简单列出了失败的主机,方便在重新运行 Playbook 时参考。这样可以仅针对少数几个失败的主机重新执行,而不是对已经成功完成的大型集群进行重复操作,这样更加高效。
如何操作…
我们将逐步解决导致其中一个 Playbook 失败的问题。
注意失败的 Playbook,然后按照以下步骤重新执行:
-
确保你在
playbooks
目录下,如下所示:cd /opt/openstack-ansible/playbooks
-
现在重新运行该 Playbook,但指定
retry
文件:ansible-openstack setup-openstack.yml --retry /root/setup-openstack.retry
-
在大多数情况下,这足以解决问题,然而,OpenStack-Ansible 已经编写成幂等的——这意味着可以重新运行整个 Playbook,只修改需要的部分。因此,你可以在不指定
retry
文件的情况下再次运行 Playbook。
如果在第一阶段发生故障,请执行以下操作:
-
首先删除生成的
inventory
文件:rm -f /etc/openstack_deploy/openstack_inventory.jsonrm -f /etc/openstack_deploy/openstack_hostnames_ips.yml
-
现在重新运行
setup-hosts.yml
Playbook:cd /opt/openstack-ansible/playbooksopenstack-ansible setup-hosts.yml
在某些情况下,销毁安装并重新开始可能是适用的。由于每个服务都安装在 LXC 容器中,因此很容易擦除安装并从头开始。要执行此操作,请按照以下步骤操作:
-
首先,我们销毁环境中的所有容器:
cd /opt/openstack-ansible/playbooksopenstack-ansible lxc-containers-destroy.yml
您将被要求确认此操作。按照屏幕上的提示操作。
-
我们建议您卸载以下软件包,以避免与将来运行 playbooks 时的任何冲突,并清理每个主机上的任何残留容器:
ansible hosts -m shell -a \"pip uninstall -y appdirs\"
-
最后,删除清单信息:
rm -f /etc/openstack_deploy/openstack_inventory.json /etc/openstack_deploy/openstack_hostnames_ips.yml
工作原理…
Ansible 并不完美,计算机也不是。有时由于 SSH 超时或其他瞬时故障,环境中会发生失败。此外,尽管 Ansible 尝试重新执行 playbook,但结果可能是失败。Ansible 失败非常明显——通常会在屏幕上以红色文本输出。在大多数情况下,重新运行有问题的 playbook 可能会解决一些瞬时问题。每个 playbook 运行一个特定的任务,Ansible 会说明哪个任务失败了。排除为何特定任务失败的故障将最终导致良好的结果。最坏的情况是,您可以从头开始重置安装。
手动测试安装
安装成功后的第一步是测试安装。测试 OpenStack 涉及自动化和手动检查。
手动测试验证用户旅程,这些旅程通常不会通过自动化测试检测到,例如确保 horizon 正确显示。
可以使用诸如 tempest 或 OpenStack 基准测试工具(rally)之类的测试框架调用自动化测试。
准备工作完成后
确保您是第一个基础架构控制器节点infra01
上的root
用户。
如何操作…
OpenStack-Ansible 的安装在每个基础架构节点上创建了几个utility
容器。这些实用程序主机提供了所有必需的命令行工具,用于尝试 OpenStack,当然是使用命令行。按照以下步骤访问实用程序主机并手动验证 OpenStack 的安装:
-
首先,通过执行以下命令查看正在运行的容器:
lxc-ls -f
-
正如您所看到的,这里列出了许多容器,因为 OpenStack-Ansible 安装使用隔离的 Linux 容器来运行每个服务。在每个容器旁边,将列出其 IP 地址和运行状态。您可以在这里看到本章中使用的容器网络为
172.29.236.0/24
,以及为什么这样命名。这里的一个容器是实用程序容器,采用以下格式命名:nodename_utility_container_randomuuid
。要访问此容器,您可以通过 SSH 连接,或者可以执行以下命令:lxc-attach -n infra01_utility_container_34u477d
-
现在,您将在这个容器内运行一个终端,只能访问属于该容器的工具和服务。在这种情况下,我们可以访问所需的 OpenStack 客户端。您需要做的第一件事是载入您的 OpenStack 凭证。OpenStack-Ansible 项目会生成一个 bash 环境文件,其中包含安装过程中设置的
admin
用户和项目。使用以下命令将其加载到 bash 环境中:source openrc
提示
提示:您还可以在 Bash 中使用以下语法: .
openrc
-
现在,您可以使用 OpenStack CLI 查看服务和环境状态,创建网络并启动实例。以下是一些常用命令:
openstack server listopenstack network listopenstack endpoint listopenstack network agent list
它是如何工作的…
OpenStack-Ansible 安装 OpenStack 的方法会将 OpenStack 服务安装到我们 Linux 服务器上的隔离容器中。在每个控制节点(或基础设施节点)上大约有 12 个容器,每个容器运行一个单独的服务,如 nova-api 或 RabbitMQ。您可以通过以 root 身份登录任一服务器并执行lxc-ls -f
命令来查看运行中的容器。-f
参数将显示完整的列表,展示实例的状态,例如它是运行中还是已停止。
基础设施节点上的一个容器名称中包含utility
,在 OpenStack-Ansible 术语中称之为实用容器。这个容器安装了 OpenStack 客户端工具,非常适合手动测试 OpenStack 的安装。在这个容器中,每个容器至少有一个 IP 地址,在本章使用的示例中,IP 地址属于172.29.236.0/24
子网。您可以 SSH 连接到该容器的 IP 地址,或者使用另一个lxc
命令附加到容器:lxc-attach -n
。一旦进入容器内部,您可以像使用其他系统一样使用它,前提是容器内可以使用相应的工具。但是,要使用 OpenStack 命令,您首先需要载入名为
openrc
的资源环境文件。这是一个标准的 bash 环境文件,在安装过程中已预先填充,并提供了使用 OpenStack 所需的所有凭证。
修改 OpenStack 配置
如果认为为了像将 CPU 争用比率从 4:1 更改为 8:1 这样的小改动而需要重新运行所有的 playbook,那简直是荒谬的。因此,playbook 已被开发并标记,以便可以运行与特定项目关联的 playbook,重新配置并重启相关服务,以便应用更改。
准备工作
确保您在部署主机上是root
用户。在大多数情况下,这将是第一个基础设施控制节点infra01
。
如何操作…
以下是常见的更改及其如何通过 Ansible 进行修改。在调整配置时,所有这些命令都将在你用于执行安装的同一主机上执行。
要调整 CPU 超分配/分配比率,请执行以下步骤:
-
编辑
/etc/openstack_deploy/user_variables.yml
文件,并修改(或添加)以下行(根据需要调整数字):nova_cpu_allocation_ratio: 8.0
-
现在执行以下命令以对环境进行更改:
cd /opt/openstack-ansible/playbooksopenstack-ansible os-nova-install.yml --tags \'nova-config\'
对于更复杂的更改,例如添加不是简单单行更改的配置,我们可以使用覆盖的替代方法。要更改默认的 Nova 配额,请按以下示例操作:
-
编辑
/etc/openstack_deploy/user_variables.yml
文件,并修改(或添加)以下行(根据需要调整数字):nova_nova_conf_overrides: DEFAULT: quota_fixed_ips = -1 quota_floating_ips = 20 quota_instances = 20
-
现在执行以下命令以对环境进行更改:
cd /opt/openstack-ansible/playbooksopenstack-ansible os-nova-install.yml --tag \'nova-config\'
对 Neutron、Glance、Cinder 及所有其他服务的更改方式类似。只需在使用的语法中调整服务名称。例如,要更改neutron.conf
文件中的配置项,可以使用以下语法:
neutron_neutron_conf_overrides: DEFAULT: dhcp_lease_duration = -1
然后执行以下命令:
cd /opt/openstack-ansible/playbooksopenstack-ansible os-neutron-install.yml --tag \'neutron-config\'
它是如何工作的…
我们修改了与安装配置章节相同的 OpenStack-Ansible 配置文件,并执行了openstack-ansible playbook
命令,指定了与我们想要更改的服务相对应的 playbook。当我们进行配置更改时,通过--tag
参数通知 Ansible。
有关每个服务的所有配置选项,请参考docs.openstack.org/
。
虚拟实验室 - vagrant up!
在理想的世界里,我们每个人都会有物理服务器和网络设备,以便学习、测试和实验 OpenStack。然而,实际情况往往并非如此。通过使用 Vagrant 和 VirtualBox 创建的虚拟实验室,可以让你在自己的笔记本电脑上体验本章关于 OpenStack-Ansible 的内容。
以下 Vagrant 实验室可以在openstackbook.online/
找到。
这是基于 Vagrant 的 OpenStack 环境架构:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00005.jpeg
本质上,创建了三个虚拟机(一个控制节点,一个计算节点和一个客户端机器),每个主机有四个网络卡(加上 VirtualBox 本身使用的内部桥接接口)。这四个网络卡表示本章描述的网络:
-
Eth1:它包含在
br-mgmt
桥接中,并由容器网络使用。 -
Eth2:它包含在
br-vlan
桥接中,并在 OpenStack 启动并运行后,用于创建基于 VLAN 的 Neutron 网络。 -
Eth3:这是客户端或主机网络——我们用来与 OpenStack 服务交互的网络(例如,负载均衡器的公共/外部端)。
-
Eth4:该接口包含在
br-vxlan
桥接中,并在 OpenStack 启动并运行后用于创建基于 VXLAN 的 Neutron 覆盖网络。
请注意,在此实验中创建的虚拟机 openstack-client
为您提供所有命令行工具,方便您开始使用 OpenStack。
准备就绪
为了在笔记本或指定的主机上运行多节点的 OpenStack 环境作为虚拟环境,以下一组要求是必须的:
-
一台 Linux、Mac 或 Windows 桌面、笔记本电脑或服务器。本书的作者使用 macOS 和 Linux,Windows 作为主机桌面的配置测试较少。
-
至少 16GB 内存,推荐 24GB。
-
大约需要 50GB 的磁盘空间。提供基础设施和计算节点的虚拟机是薄配置的,因此这个要求仅作为参考,具体取决于你的使用情况。
-
需要一个互联网连接。连接速度越快越好,因为安装过程依赖于从互联网直接下载文件和软件包。
如何操作……
要在虚拟环境中运行 OpenStack 环境,我们需要安装几个程序,所有这些程序都可以免费下载安装:VirtualBox、Vagrant 和 Git。VirtualBox 提供虚拟服务器,代表正常 OpenStack 安装中的服务器;Vagrant 以完全自动化的方式描述安装过程;Git 允许我们检出本书中提供的所有脚本,轻松测试虚拟的 OpenStack 安装。以下说明描述了在 Ubuntu Linux 上安装这些工具的步骤。
如果还没有安装 VirtualBox,首先需要安装它。我们建议下载该软件的最新版本。在 Ubuntu Linux 上以 root
用户执行以下步骤:
-
首先使用以下命令添加
virtualbox.org
仓库密钥:wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add –
-
接下来,我们通过创建一个名为
/etc/apt/sources.list.d/virtualbox.conf
的文件,并包含以下内容,将仓库文件添加到apt
配置中:deb http://download.virtualbox.org/virtualbox/debian xenial contrib
-
现在执行
apt update
以刷新并更新apt
缓存,使用以下命令:apt update
-
现在使用以下命令安装 VirtualBox:
apt install virtualbox-5.1
安装 VirtualBox 后,我们可以安装 Vagrant。请按照以下步骤安装 Vagrant:
-
Vagrant 从
www.vagrantup.com/downloads.html
下载。我们需要的版本是 Debian 64 位版本。本文写作时,版本为 2.0.1。要在桌面上下载,执行以下命令:wget https://releases.hashicorp.com/vagrant/2.0.1/vagrant_2.0.1_x86_64.deb
-
现在可以使用以下命令安装该文件:
dpkg -i ./vagrant_2.0.1_x86_64.deb
该实验使用了两个 vagrant 插件:vagrant-hostmanager
和 vagrant-triggers
。要安装这些插件,请执行以下步骤:
-
使用
vagrant
工具安装vagrant-hostmanager
:vagrant plugin install vagrant-hostmanager
-
使用
vagrant
工具安装vagrant-triggers
:vagrant plugin install vagrant-triggers
如果 Git 目前没有安装,可以通过以下命令在 Ubuntu 机器上安装 git
:
apt updateapt install git
现在我们拥有了所需的工具,可以使用OpenStackCookbook
Vagrant 实验环境在 VirtualBox 环境中执行一个完全协调的 OpenStack 安装:
-
我们将首先通过
git
检出实验环境脚本和支持文件,使用以下命令:git clone https://github.com/OpenStackCookbook/vagrant-openstack
-
我们将切换到刚刚创建的
vagrant-openstack
目录:cd vagrant-openstack
-
我们现在可以使用一个简单的命令来协调虚拟机的创建和 OpenStack 的安装:
vagrant up
提示
提示:这将需要一段时间,因为它将创建虚拟机并执行本章中描述的所有相同的剧本步骤。
它是如何工作的……
Vagrant 是一个很棒的工具,可以协调许多不同的虚拟和云环境。它允许我们描述需要创建的虚拟服务器,利用 Vagrant 的配置器,在虚拟机创建后运行脚本。
Vagrant 的环境文件名为Vagrantfile。你可以编辑这个文件来调整虚拟机的设置,例如增加内存或可用的 CPU 数量。
这使得我们可以通过一个命令描述一个完整的 OpenStack 环境:
vagrant up
该环境包含以下组件:
-
一个控制节点,
infra-01
-
一个计算节点,
compute-01
-
一个客户端虚拟机,
openstack-client
一旦环境安装完成,你可以通过在浏览器中访问http://192.168.100.10/
来使用该环境。要获取管理员密码,请按照此处给出的步骤,并查看名为openrc
的文件。
这里有一个单独的控制节点,它配置了一个utility
容器,供本环境使用。可以使用以下命令连接:
vagrant ssh controller-01sudo -ilxc-attach -n (lxc-ls | grep utility)openrc
获取openrc
详情后,将其复制到你的openstack-client
虚拟机中。从这里,你可以像在桌面机器上操作一样,使用命令行访问并操作 OpenStack。
vagrant ssh openstack-clientopenrc
现在你应该能够使用 OpenStack CLI 工具来操作该环境。
第二章:OpenStack 客户端
在本章中,我们将涵盖以下主题:
-
介绍——使用 OpenStack
-
在 Windows 上安装 Python
-
安装 OpenStack 客户端
-
配置您的 Linux 或 macOS 环境
-
配置您的 Windows 环境
-
常见的 OpenStack 网络任务
-
常见的 OpenStack 服务器(实例)任务
-
常见的 OpenStack 镜像任务
-
常见的 OpenStack 身份管理任务
-
常见的 OpenStack 存储任务
-
常见的 OpenStack 编排任务
介绍——使用 OpenStack
OpenStack 可以通过多种方式进行交互——从使用 Horizon(OpenStack 控制面板)Web 界面到命令行的强大功能,再到使用第三方软件,这些都与 OpenStack 透明集成。在本章中,我们将介绍 OpenStack 命令行接口(CLI),并了解如何为您安装的 OpenStack 配置它。OpenStack 命令行工具和大多数 OpenStack 组件一样,都是用 Python 编写的。这意味着计算机上必须安装 Python,才能运行这些客户端。
当我们与 OpenStack 交互时,实际上是在向运行服务API(应用程序编程接口)的服务发起 REST API 调用。REST API 定义了一组函数,开发者可以通过 HTTP 协议(如 GET 和 POST)进行请求并接收响应。OpenStack 命令行客户端将您的直观命令转化为这些 HTTP 调用。在典型的 OpenStack 部署中,并且在第一章,使用 Ansible 安装 OpenStack中描述的那种部署中,通过 Ansible,我们的 OpenStack API 服务已经部署在三个 Controller 节点上。为了使我们能够与这三个 Controller 节点中的任意一个进行交互,以便每个节点可以独立响应,我们将这些服务放置在负载均衡器后面。作为 OpenStack 用户,我们关注的是负载均衡器的VIP(虚拟 IP),即我们为每个配置的池关联的 IP 地址。
在配置环境以便与 OpenStack 配合使用时,有一个特定的服务是用户感兴趣的,那就是 Keystone
服务。
Keystone
服务(OpenStack 身份服务)在 OpenStack 中本质上执行两个功能。它授权用户允许他们执行所请求的操作,并向用户提供服务目录。该目录是 OpenStack 服务地址端点的映射。因此,我们不需要配置客户端来知道如何找到每一个 OpenStack 服务。当用户配置环境以便从命令行使用 OpenStack 时,他们唯一需要知道的信息是 Keystone
所安装的 IP 地址和端口。请参阅以下图示,了解用户如何从概念上看到这一点:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00006.jpeg
提示
本章旨在作为一个快速参考指南,介绍本书中更详细解释的命令。
在 Windows 上安装 Python
为了能够在 Windows 上安装所需的 OpenStack 客户端工具,我们必须首先为 Windows 桌面计算机准备 Python。以下内容适用于 Windows 10。
准备工作
确保你已登录到桌面,并安装了以下内容:
-
PowerShell
-
从此处下载 Python 2.7:
www.python.org/downloads/windows/
-
微软 Visual C++ 构建工具,包含 Windows 10 SDK 功能
如何操作…
配置你的 Windows 环境可以通过你 PC 的 属性 来实现。按照以下说明确保 Python 在你的系统路径中可用,并在 PowerShell 中设置适当的环境变量:
-
转到桌面上的 此电脑 图标并选择 属性,如图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00007.jpeg
-
接下来,从左侧菜单中选择 高级系统设置:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00008.jpeg
-
现在,从 系统属性 窗口的 高级 标签中选择 环境变量,如图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00009.jpeg
-
要设置 Python 的路径,双击 Path 条目,如下所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00010.jpeg
-
现在,按如下所示向路径添加 新 行。我们假设你进行了 Python 2.7 的默认安装,并且安装在
C:\\Python27
目录下:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00011.jpeg -
现在点击 确定。当你加载 PowerShell 会话时,你现在应该能够测试 Python 是否按预期工作,如下所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00012.jpeg
-
现在,你应该能够按照接下来的步骤安装 OpenStack 客户端。
工作原理…
配置 Windows 环境比配置 Unix/Linux 环境稍微复杂一些。我们首先需要确保 Python 配置正确,并且可以在 Shell 中使用。接下来,我们需要一种机制将环境变量加载到 Shell 中,而这并不是 Windows 的本地功能。我们通过 PowerShell 脚本实现这一点。然而,由于 PowerShell 功能强大,我们需要移除一些限制以使其正常工作。一旦正确设置好这些内容,就可以在 Windows 桌面上使用 OpenStack 环境。
安装 OpenStack 客户端
有多个 OpenStack 客户端可用于从命令行与 OpenStack 交互。历史上,OpenStack 中的每个服务都有自己的客户端。例如,OpenStack 计算项目 Nova 有自己的 nova
客户端。同样,OpenStack 网络项目 Neutron 也有自己的名为 neutron
的客户端,依此类推。
官方上,OpenStack 客户端正在趋向统一使用一个客户端:OpenStack 客户端。然而,并非所有命令和功能都可以通过这个工具使用。此外,OpenStack 客户端仍然需要安装每个独立项目的命令行工具才能正常工作;但它提供了一个更一致的界面,而不需要记住每个单独项目的名称。
准备工作
由于我们正在为从命令行与 OpenStack 交互准备桌面,您会发现,针对您选择的桌面操作系统,有多种选择。本节将描述如何安装 OpenStack 客户端。
由于我们将使用 pip
安装 OpenStack 客户端,请确保按照以下步骤安装它:
-
首先,打开终端并使用以下命令切换到 root 用户:
sudo -i
-
我们将使用
pip
安装客户端。如果pip
未安装,请按照以下步骤操作:在 macOS 或其变种上使用以下命令:
wget https://bootstrap.pypa.io/get-pip.pypython get-pip.py
-
在流行的 Linux 系统上,使用您的包管理器安装这些软件包:
Ubuntu:确保安装了
python-dev
和python-pip
Red Hat:确保安装了
python-devel
和python-pip
注意
Windows:确保已安装 Python 并且它在 PATH 中,并已安装 Microsoft Visual C++ Build Tools。
如何操作…
在系统上安装了 pip
后,我们可以通过以下简单步骤安装客户端:
-
要安装 OpenStack 客户端,请执行以下命令:
pip install python-openstackclient
-
要安装各个客户端,请执行以下命令:
pip install python-novaclientpip install python-neutronclientpip install python-glanceclientpip install python-heatclientpip install python-keystoneclientpip install python-cinderclientpip install python-swiftclient
提示
每个项目都有自己的客户端,因此语法为:
pip install python-PROJECTclient
替代方法 – 使用预配置的 OpenStack 客户端虚拟机
有时客户端的开发进度与环境中已安装的项目不同,这可能导致版本不兼容。为了解决这个问题,可以使用 virtualenv
(pypi.python.org/pypi/virtualenv
)或者使用一个已经为访问 OpenStack 环境预配置的虚拟机(在 VirtualBox 中)。使用预构建的虚拟环境,请执行以下操作:
-
克隆客户端 VirtualBox Vagrant 环境:
git clone https://github.com/OpenStackCookbook/openstack-client.git
-
启动客户端:
cd openstack-clientvagrant up
-
访问虚拟机:
vagrant ssh
它是如何工作的…
安装 OpenStack 客户端非常简单,只需要使用 pip
命令行工具,它用于安装 Python 包。用于在命令行中操作 OpenStack 的主要工具叫做 OpenStack 客户端。这个工具用于控制 OpenStack 的各个方面。然而,仍然有一些命令和选项没有加入到主流的 OpenStack 客户端中。为了解决这个问题,可以继续使用旧版的遗留项目工具。确保也使用以下语法安装这些工具:
pip install python-PROJECTclient
将 PROJECT 替换为 OpenStack 项目的具体名称,例如 glance 或 neutron。
或者,可以将这些工具创建在小型虚拟机中,这样工具始终可用。可以从 github.com/OpenStackCookbook/ope
获取一个 Vagrant OpenStack 客户端环境。
配置你的 Linux 或 macOS 环境
OpenStack 工具通过在你的 shell 或桌面设置环境变量来进行配置。
准备工作
确保已按照本章中第一部分 介绍 - 使用 OpenStack 中的说明安装 OpenStack 客户端。
如何操作…
通过设置环境变量来配置你的命令行环境;然而,将这些变量放入一个文件中,以便以后加载到环境中,会更简单和方便。在安装过程中,OpenStack-Ansible 会创建一个名为 openrc
的纯文本文件,并将其放置在所有创建的容器的 /root
目录中。这个文件是配置环境的一个很好的起点,因为它包含了操作命令行环境所需的所有必需元素。
在你自己的客户端上,例如基于 Linux 或 Mac 的系统,选择一个工作目录,例如 $HOME/openstack
,并创建一个名为 openrc
(或你选择的具有意义的名称)的文件,内容如下:
export OS_USERNAME=adminexport OS_PASSWORD=secreteexport OS_TENANT_NAME=adminexport OS_AUTH_URL=http://192.168.100.117:5000/v3export OS_NO_CACHE=1export OS_USER_DOMAIN_NAME=Defaultexport OS_PROJECT_DOMAIN_NAME=Defaultexport OS_IDENTITY_API_VERSION=3export OS_AUTH_VERSION=3
现在通过以下方式在你的 shell 中加载该文件:
source openrc
提示
在 Bash 中,你也可以使用以下语法:
. openrc
该文件包含了访问你云环境的认证信息。请确保文件安全,并且权限设置不允许其他用户读取此文件。如果不确定,建议按以下方式设置权限:
chmod 0600 openrc
这将使文件仅对你(用户)可读写。
现在,您可以使用命令行工具了。如果在执行书中命令时出现任何问题,请检查文件中的凭证——确保您设置了正确的租户/项目、用户名和密码,并确保指定了正确的 OpenStack 认证 URL 端点。一旦对文件做出任何更改,请记得将其重新加载到 shell 中。
它是如何工作的…
本质上,我们只是在 shell 中设置一些环境变量,客户端工具用这些变量来进行 OpenStack 环境的身份验证。不过,为了简化操作,我们将这些环境变量存储在一个文件中。这样,我们只需要运行一个命令即可设置所有必需的凭证,方便访问环境。
配置 Windows 环境
配置 Windows 环境以使用 OpenStack 需要稍微多一点的工作,但基本前提依然不变:我们正在配置桌面,使其能够访问环境变量,并确保我们用 Python 编写的工具能够正确执行。
准备就绪
以下内容适用于 Windows 10。请确保您已按照步骤安装了 Python。
如何操作…
执行以下操作,将所需的环境变量加载到您的 Windows 会话中:
-
为了能够像在 Unix/Linux 平台上一样加载所需的 OpenStack 环境功能,我们可以使用 PowerShell 实现类似的效果。在 PowerShell 终端中,获取以下 PowerShell 脚本并将其下载到您的工作客户端目录中(例如
C:\\Users\\Username\\OpenStack
):mkdir OpenStackcd OpenStackwget https://raw.githubusercontent.com/OpenStackCookbook/vagrant-openstack/master/Source-OpenRC.ps1 -UseBasicParsing -OutFile Source-OpenRC.ps1
-
使用与配置您的 Linux 或 macOS 环境部分中描述的相同 OpenStack 凭证,确保将其命名为
openrc
,以与以下示例匹配,然后在 PowerShell 中执行以下操作:.\\Source-OpenRC.ps1 .\\openrc
注意
警告:执行 PowerShell 脚本时,可能会遇到错误。大多数 Windows 10 桌面似乎默认有一个受限策略,这排除了运行未签名的 PowerShell 脚本——即使是您自己创建的脚本。要移除此限制,请执行以下操作并确认警告:
Set-ExecutionPolicy –ExecutionPolicy RemoteSigned Unrestricted -Scope CurrentUser
-
现在,您应该能够在 Windows 桌面的 PowerShell 终端中使用 OpenStack 客户端。
它是如何工作的…
配置 Windows 环境比配置 Unix/Linux 环境稍微复杂一些。我们需要一个机制来将环境变量加载到 shell 中,而这是 Windows 的原生功能所不具备的。我们通过 PowerShell 脚本来实现这一点。但为了使其工作,我们必须移除一个限制。一旦正确设置好所有内容,便能够从 Windows 桌面使用 OpenStack 环境。
常见的 OpenStack 网络任务
本节仅简要列出了常见的 OpenStack 网络任务,供快速参考。如需详细了解如何使用 Neutron 及其工作原理——包括浮动 IP 和路由器等特性的使用场景和细节,请参阅第四章,Neutron – OpenStack 网络。
准备工作
确保您已安装 OpenStack 客户端,具体安装方法请参考本章的第一部分。
如何操作…
执行以下步骤以在 OpenStack 中创建和修改网络:
创建网络
通常,创建网络有两个步骤:创建一个相当于 L2 网络的网络,接着为其分配子网(及相关详细信息)。
-
首先,创建网络:
openstack network create NETWORK_NAME
-
现在在此网络上创建子网:
openstack subnet create SUBNET_NAME --network NETWORK_NAME--subnet-range CIDR
创建提供者网络(用于浮动 IP)
要创建一个浮动 IP 提供者网络,请执行以下命令。此命令假设我们的提供者接口(在 OpenStack 中查看并在 Neutron 中配置)正在使用“flat”接口。在数据中心的典型部署中,可能会使用“vlan”作为提供者类型和设备,因此请根据您的环境调整配置。
-
首先,创建网络(在本示例中,我们指定了
flat
的提供者类型):openstack network create --share --project admin --external --default --provider-network-type flat --provider-physical-network flat GATEWAY_NET
-
现在,我们指定一些子网选项,以使得该网络能够从 OpenStack 外部进行访问:
openstack subnet create --project admin --subnet-range 192.168.100.0/24 --dhcp --gateway 192.168.100.1 --allocation-pool start=192.168.100.200,end=192.168.100.250 --network GATEWAY_NET GATEWAY_SUBNET
创建一个新的安全组
在development
项目中创建一个新的安全组,例如webserver
,可以通过以下方式实现:
openstack security group create --project development webserver
向安全组添加规则
要向前面创建的名为webserver
的安全组添加规则,例如允许来自任何地方的端口80
的入站访问,请执行以下操作:
openstack security group rule create --remote-ip 0.0.0.0/0 --dst-port 80:80 --protocol tcp --ingress --project development webserver
创建路由器
要在我们的项目中创建一个名为myRouter
的路由器,请执行以下命令:
openstack router add myRouter
向路由器添加子网
要向我们的路由器myRouter
添加一个名为private-subnet
的私有租户子网,请执行以下命令:
openstack router add subnet myRouter private-subnet
设置路由器上的网关
要为我们的路由器添加网关,首先必须确保网关网络已创建,并使用--external
标志,如本章“创建提供者网络”部分所述(用于浮动 IP)。然后,我们将执行以下命令,将外部网关网络设置为GATEWAY_NET
,并应用到我们名为myRouter
的路由器上:
openstack router set myRouter --external-gateway GATEWAY_NET
常见的 OpenStack 服务器(实例)任务
本节概述了一些常见命令,这些命令可以在操作实例(例如虚拟机)时执行。有关每个任务的详细信息和解释,请参阅第五章,Nova – OpenStack 计算。
准备工作
确保您已安装 OpenStack 客户端,具体安装方法请参考本章的第一部分。
如何操作…
执行以下操作以启动和操作正在运行的实例:
启动实例
要通过命令行启动实例,您需要以下信息:
-
一个镜像
-
一个网络
-
一个规格
-
一个可选的安全组(如果没有指定,默认使用)
-
一个可选的密钥(如果您打算访问该实例)
执行以下步骤以通过命令行启动实例:
-
首先,列出可用的镜像:
openstack image list
-
现在,我们列出可用的网络(这将是我们将使用的网络的 UUID):
openstack network list
-
我们需要一个规格,如果需要提醒,请使用以下命令列出它们:
openstack flavor list
-
如果您需要特定的安全组,请使用以下命令列出它们:
openstack security group list
-
如果您需要获取要使用的密钥对的名称,请使用以下命令:
openstack keypair list
-
现在,您可以使用以下命令启动实例:
openstack server create --image IMAGE --flavor FLAVOR --security-group SECGROUP --nic net-id=NETWORK_UUID --key-name KEYPAIR_NAME INSTANCE_NAME
列出 OpenStack 实例
要列出已启动的 OpenStack 实例,请执行以下命令:
openstack server list
创建实例快照
要创建正在运行的实例的快照,请执行以下命令:
openstack server image create --name snapshotRunningWebserver1 myRunningWebserver1
调整实例大小
要修改正在运行的实例的规格并使用新设置重新启动,请执行以下命令:
-
首先,我们使用以下命令指定新的规格大小:
openstack server resize --flavor m1.small myWebserver1
-
接下来,列出正在运行的实例以确认状态。状态应为
VERIFY_RESIZE
:openstack server list
输出将显示如下内容:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00013.jpeg
-
然后,我们使用以下命令确认操作:
openstack server resize --confirm myWebserver1
创建规格
要创建一个规格,名为 m1.tiny
,包含 512 MB 的 RAM、1 个 vCPU 和没有固定大小的磁盘,请执行以下命令:
openstack flavor create --ram 512 --disk 0 --vcpus 1 --public m1.tiny
常见的 OpenStack 镜像任务
本节概述了一些步骤,作为快速概述,仅用于操作 OpenStack 镜像服务(称为 Glance)时的参考。如需更详细的信息和每个任务的解释,请参见 第六章,Glance – OpenStack 镜像服务。
准备工作
确保您已经安装了 OpenStack 客户端,安装方法请参考本章开头的配方。
如何做…
执行以下步骤以在 OpenStack 中创建和修改镜像:
上传镜像到 Glance
将镜像上传到 OpenStack 可通过以下命令完成。要上传一个 QCOW2 镜像(如 CirrOS 提供的用于测试的镜像),请执行以下命令:
openstack image create --container-type bare --disk-format qcow2 --public --file /path/to/cirros-0.3.5-x86_64-disk.img
从 Glance 下载镜像或快照作为文件
要从 Glance 下载镜像,可能是为了复制到其他环境或作为异地备份存储,请执行以下命令:
openstack image save --file myImage.qcow2 myImage
在项目间共享镜像
在大多数情况下,镜像要么是公开的(对所有项目可用),要么是私有的(仅对上传该镜像的项目可用)。但是,您可以将一个私有镜像共享给您选择的隔离项目。要做到这一点,您需要以下内容:
-
您将要共享的镜像的 UUID
-
您将与之共享镜像的项目的 UUID
执行以下步骤以将镜像与另一个项目共享。在以下示例中,我们将共享当前仅在 admin
项目中可用的 cirros-image
,并将其共享到 anotherProject
项目:
-
首先,查询项目列表:
openstack project list
这将返回类似以下内容的输出:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00014.jpeg
-
我们将设置要共享的镜像:
openstack image set cirros-image --shared
-
然后,我们将告诉 OpenStack 通过以下命令共享哪个项目:
openstack image add project anotherProject
这将返回类似以下内容的输出 —— 我们将在下一步中使用 image_id:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00015.jpeg
-
重要提示:作为 接收(anotherProject)项目中的用户,执行以下操作:
openstack image set --accept f6578a80-5f6f-4f2d-9a8a-9d84cec8a60d
-
现在,作为该用户,您可以通过执行镜像列表命令来确认自己能看到这个共享的镜像:
openstack image list
这将返回类似以下内容的输出,显示可用的镜像:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00016.jpeg
常见的 OpenStack 身份任务
本节概述了使用 OpenStack 身份服务执行一些常见操作的常见步骤。此部分仅作为快速参考指南。如需更详细的信息和每个任务的解释,请参阅第三章,Keystone – OpenStack 身份服务。
准备工作
确保您已安装 OpenStack 客户端,如本章第一部分所述。
如何执行…
执行以下步骤以在 OpenStack 中创建和修改用户和项目:
创建新项目
在项目中创建新用户通过以下命令实现。例如,要创建名为 development
的项目,请执行以下命令:
openstack project create development
创建用户
要创建一个名为 developer
的用户,并设置密码为 password123
,请执行以下命令:
openstack user create --domain default --password password123 --enable developer
向项目中添加用户
要将具有 _member_
角色(普通用户)的用户添加到 development
项目中,请执行以下命令:
openstack role add --project development --user developer _member_
作为管理员更改用户密码
作为管理员,您有权更改他人的密码。要为 developer
用户更改密码,请执行以下命令:
openstack user set --password cookbook4 developer
更改自己的密码
要将自己的密码更改为其他内容,请执行以下命令:
openstack user password set --password cookbook4
常见的 OpenStack 存储任务
本节概述了使用 OpenStack 块存储和对象存储服务执行的一些常见任务。如需更多存储信息,请参阅第七章,Cinder – OpenStack 块存储 和 第八章,Swift – OpenStack 对象存储。
准备工作
确保您已安装 OpenStack 客户端,如本章第一部分所述。
如何执行…
执行以下步骤在 OpenStack 中创建和修改用户和项目:
创建一个新的 Cinder 卷
要创建一个新的 Cinder 块存储卷,请执行以下命令。大小以千兆字节为单位:
openstack volume create --size 5 my5GVolume
附加一个卷
要将卷附加到运行中的实例,请执行以下命令。使用运行中的 实例 UUID,并可以通过列出运行中的实例找到:
openstack server add volume my5GVolume 58ea640b-16ba-447c-85db-952174d70f7c
分离一个卷
要分离一个卷,首先像平常一样将其从运行中的实例中卸载,然后执行以下命令:
openstack server remove volume my5GVolume 58ea640b-16ba-447c-85db-952174d70f7c
创建一个卷快照
要创建卷的快照,请执行以下步骤。首先,您必须将卷从运行中的实例中分离,以确保数据一致性。该操作在前面的任务中已经描述。
现在,分离后,执行以下命令
openstack snapshot create --name myVolumeSnapshot myVolume
列出对象存储统计信息
要显示有关对象存储容器的信息,请执行以下命令:
openstack object store account show
列出对象存储容器及其内容
要列出对象存储的内容,请执行以下命令:
openstack object store listopenstack object store list myContainer
创建并上传文件到对象存储服务
要创建一个对象存储容器,请执行以下命令:
openstack object create myContainer
要将文件上传到对象存储容器,请执行以下命令:
openstack object create myContainer myFile
从对象存储下载
要从对象存储容器下载文件,请使用此命令
openstack object save myContainer myFile
要从对象存储容器下载所有文件,请执行以下命令:
openstack object save myContainer
常见的 OpenStack 编排任务
本节概述了使用 OpenStack 编排(Heat)服务启动 堆栈(使用 Heat 编排的环境)的一些常见任务。有关 Heat 和编排的更多信息,请参考 第九章,使用 Heat 和 Ansible 的 OpenStack 编排。
准备工作
确保您已安装 OpenStack 客户端,安装方法请参考本章的前几个食谱。
如何操作…
执行以下步骤,在 OpenStack 中创建并使用 Heat 模板来创建编排环境:
从模板和环境文件启动堆栈
要从 Heat 编排模板(hot)启动堆栈,请执行以下命令:
openstack stack create --template myStack.yml --environment myStack-Env.yml myStack
列出堆栈
要列出运行中的堆栈,请执行以下命令:
openstack stack list
删除一个运行中的堆栈
要销毁名为 myStack
的运行中堆栈,请执行以下命令:
openstack stack delete myStack
列出堆栈中的资源
要列出运行中的堆栈中的资源,请执行以下命令:
openstack stack resource list
要列出特定资源的详细信息,例如名为 myResource
的资源,请执行以下命令:
openstack stack resource show myResource
查看运行中堆栈的输出
要查看堆栈生成的输出,请执行以下命令:
openstack stack output list
要查看特定输出的详细信息,请执行以下命令:
openstack stack output show myOutput
第三章. Keystone – OpenStack 身份服务
本章我们将讨论以下主题:
-
介绍 – OpenStack 身份
-
在 Keystone 中创建 OpenStack 域
-
在 OpenStack 仪表盘中启用域
-
在 Keystone 中创建 OpenStack 项目
-
配置 Keystone 中的角色
-
在 Keystone 中添加用户
-
配置 Keystone 中的组
-
删除项目
-
删除用户
-
删除角色
-
删除组
-
删除域
-
OpenStack 端点信息
介绍 – OpenStack 身份
OpenStack 身份服务,称为Keystone,提供身份验证和管理用户帐户及角色信息的服务,适用于我们的 OpenStack 云环境。
这是一个至关重要的服务,支撑着我们所有 OpenStack 云服务之间的认证与验证,是在 OpenStack 环境中需要首先安装的服务。OpenStack 身份服务通过在所有 OpenStack 服务之间传递一个经过验证的授权令牌来验证用户和项目。这个令牌会传递给其他服务,如存储和计算服务,以授予用户对特定功能的访问权限。因此,必须首先完成 OpenStack 身份服务的配置,才能使用其他任何服务。设置身份服务涉及为用户和服务、项目、用户帐户以及构成云基础设施的服务 API 端点创建适当的角色。由于我们使用 Ansible 来部署环境(更多细节请参见第一章,使用 Ansible 安装 OpenStack),所有基本配置都已经在 Ansible 剧本中为我们完成。
在 Keystone 中,我们有域、项目、角色、用户和用户组的概念。Keystone 域(不要与 DNS 域混淆)是一个高层次的 OpenStack 身份资源,其中包含项目、用户和组。一个项目有用户、镜像、实例等资源,并且其中的网络可以仅限于该项目,除非显式与其他项目共享。一个用户可以属于一个或多个项目,并能够在这些项目之间切换,以访问相应的资源。项目中的用户可以分配不同的角色。用户可以组织成用户组,并且组可以被分配角色。在最基本的场景下,用户可以被分配管理员角色或仅是成员。当一个用户在项目中拥有管理员权限时,管理员能够利用可以影响项目的功能(例如修改外部网络),而普通用户则被分配成员角色。这个成员角色通常用于执行与用户相关的任务,如启动实例、创建卷和创建隔离的项目专用网络。
注意
项目在早期版本的 OpenStack 中被称为租户。
在 Keystone 中创建 OpenStack 域
如果您希望在 OpenStack 部署中使用多个域名,请考虑使用单独的域。在大型组织中,域可以视为单独的账户或部门。在本节中,我们将为我们的项目创建一个名为 bookstore
的域。
准备工作
确保您已以具有管理员权限的用户身份登录到正确配置的 OpenStack 客户端,并能够访问 OpenStack 环境。
参考 第二章,OpenStack 客户端,以了解设置您的环境以使用 OpenStack 命令行客户端的详细信息。
如何做…
要在我们的 OpenStack 环境中创建一个域,请执行以下步骤:
-
我们首先创建一个名为
bookstore
的域,如下所示:openstack domain create --description \"Book domain\" bookstore
输出将类似于以下内容:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00017.jpeg
工作原理…
在 OpenStack 中,高级别的身份资源可以分组到不同的域下。如果您需要在 OpenStack 环境中管理不同的组织,为它们管理的资源使用单独的域可能非常有益。默认情况下,您的 OpenStack 环境很可能有一个名为 “Default” 的默认域。通过运行上述命令,我们刚刚创建了一个额外的域,用于管理与本书相关的资源。语法如下:
openstack domain create --description
description
参数也是可选的,但强烈推荐。域名必须与环境中的其他域名唯一。
注意
在我们的操作中,我们将使用 --domain
参数并指定域名。如果未指定域,则 OpenStack 命令行客户端将使用在 openrc
文件中指定的当前用户的域,最可能是 default
域。
在 OpenStack 仪表板中启用域
如果您在 OpenStack 环境中使用多个域,还需要在 OpenStack 仪表板(Horizon)中启用它们。为此,需要将 Horizon 设置中的 OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT
变量设置为 True
。在此示例中,我们将展示如何使用 OpenStack Ansible playbook 完成此操作。
准备工作
我们将使用 Ansible 更新 Horizon 设置。确保您可以访问您的 openstack-ansible
部署主机。
如何做…
要在 OpenStack 仪表板中启用多域支持,我们将使用 openstack-ansible
部署工具更新 local_settings.py
中的一个 Horizon 变量 OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT
。首先,您需要连接到您的 openstack-ansible
部署主机。连接后,执行以下步骤:
-
编辑
/etc/openstack_deploy/user_variables.yml
文件,添加以下行:horizon_keystone_multidomain_support: True
-
使用
openstack-ansible
命令部署 Horizon:openstack-ansible /opt/openstack-ansible/playbooks/os-horizon-install.yml
openstack-ansible
命令会生成大量输出。为简洁起见,已省略其输出。 -
启动 OpenStack 仪表盘,验证登录屏幕现在是否显示域字段:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00018.jpeg
它是如何工作的…
在 OpenStack 中,如果你正在利用多域功能,可以通过命令行工具完全控制。然而,如果你希望能够在 OpenStack 仪表盘上使用多个域,则需要启用 Horizon 的多域支持。为此,你需要更新 Horizon 设置文件。由于我们使用的是openstack-ansible
工具,我们更新了user_variables.yml
文件并运行了openstack-ansible
命令。此命令更新了所需的变量,并重新启动了 Horizon 容器上的apache2
(HTTP 服务器)服务。
在 Keystone 中创建 OpenStack 项目
用户在没有分配项目的情况下无法创建,因此必须先创建项目。对于本节内容,我们将为我们的用户创建一个名为cookbook
的项目。
准备工作
确保你已登录到配置正确的 OpenStack 客户端,并且可以作为具有管理员权限的用户访问 OpenStack 环境。
请参阅第二章,OpenStack 客户端,了解如何设置环境以使用 OpenStack 命令行客户端。
如何操作…
要在我们的 OpenStack 环境中创建项目,请执行以下步骤:
-
我们首先创建一个名为
cookbook
的项目,如下所示:openstack project create --domain bookstore --description \"Cookbook Project\" cookbook
该命令应产生类似如下的输出:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00019.jpeg
它是如何工作的…
通过运行前面的命令,我们刚刚在bookstore
域中创建了一个项目。语法如下:
openstack project create --domain --description
domain
参数是可选的,用于确定项目将属于哪个域。如果省略,项目将在default
域中创建。description
参数也是可选的,但强烈建议填写。name
参数必须在该安装中唯一。
在 Keystone 中配置角色
角色是分配给项目中用户的权限。角色还可以限定在特定的域中,这样可以限制特定用户在某个域和项目中的权限。如果你使用了 Ansible 安装 OpenStack 环境,它应该已经包含一些默认角色,例如admin
和_member_
。在这里,我们将配置一个角色,即cloud_admin
角色,允许管理我们的示例bookstore
域环境,以及一个user
角色,授予default
域中的普通用户,该用户将使用云环境。
准备工作
确保你已登录到配置正确的 OpenStack 客户端,并且可以作为具有管理员权限的用户访问 OpenStack 环境。
请参阅第二章,OpenStack 客户端,了解如何设置环境以使用 OpenStack 命令行客户端。
如何操作…
要在我们的 OpenStack 环境中创建所需的角色,请执行以下步骤:
-
cloud_admin
角色的创建如下所示:openstack role create --domain bookstore cloud_admin:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00020.jpeg
-
要为
default
域配置user
角色,请执行以下命令:openstack role create user
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00021.jpeg
该命令创建了一个名为
user
的新角色。由于我们未指定域,它是在default
域下创建的。 -
查看与
bookstore
域关联的角色:openstack role list --domain bookstore
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00022.jpeg
-
列出与当前管理员用户关联的角色:
openstack role list
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00023.jpeg
它是如何工作的…
角色的创建简单地通过 OpenStack 客户端完成,使用role create
选项,语法如下:
openstack role create --domain
domain_name
属性是可选的,如果省略该属性,将为default
域创建一个角色。
对于role_name
属性,admin
和_member_
角色名称不能重复使用。admin
角色是 OpenStack 代码中从 Pike 版本开始默认设置的,在 Pike 版本之前的版本中,它在/etc/keystone/policy.json
文件中被设置为具有管理员权限:
{ \"admin_required\": \"role:admin or is_admin:1\",}
_member_
角色在通过 Web 界面创建非管理员用户时,也会在仪表盘中默认配置。
创建角色时,会返回与角色关联的 ID,我们可以在分配角色给用户时使用它。要查看我们环境中角色及其关联 ID 的列表,可以执行以下命令:
openstack role list --domain
注意
如果未指定domain
参数,则只会看到与当前用户域关联的角色。
在 Keystone 中添加用户
向 OpenStack 身份服务中添加用户需要用户属于某个域或该域中的项目,并且需要分配一个在该域或项目中定义的角色。在本节中,我们将创建两个用户。第一个用户命名为cloud_admin
,并将在cookbook
项目中为其分配cloud_admin
角色。第二个用户命名为reader
,并将在同一cookbook
项目中为其分配默认的_member_
角色。
准备就绪
确保你已登录到正确配置的 OpenStack 客户端,并且可以作为具有管理员权限的用户访问 OpenStack 环境。
参见第二章,OpenStack 客户端,了解如何设置你的环境以使用 OpenStack 命令行客户端。
如何操作…
为了在 OpenStack 中创建用户并为其分配角色,我们需要执行以下列出的命令。
-
首先,获取
bookstore
域 ID 或域名:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00024.jpeg -
使用
bookstore
域名,创建一个新的cloud_admin
用户:openstack user create --domain bookstore --password verysecret cloud_admin
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00025.jpeg
-
接下来,获取一个 cookbook 项目的 ID 或项目名:
openstack project list
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00026.jpeg
-
在
bookstore
域的cookbook
项目中创建reader
用户:openstack user create --domain bookstore --project cookbook --password verysecret reader
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00027.jpeg
-
将
cloud_admin
用户分配给admin
角色:openstack role add --domain bookstore --user cloud_admin --role-domain bookstore admin
此命令没有输出。
-
将
reader
用户分配给_member_
角色:openstack role add --project cookbook --user reader _member_
此命令没有输出。
-
列出用户和角色分配:
openstack role assignment list
输出将是角色、用户、组、项目和域 ID 的矩阵。由于包含每个角色、用户、组、项目、域的 ID 矩阵及其是否继承角色的庞大表格,我们省略了示例输出。
工作原理……
在 OpenStack 身份服务中添加用户涉及多个步骤和依赖关系。首先,需要一个域和项目,用户必须属于其中一个。用户必须始终属于一个域。如果没有创建自定义域,则将使用default
域。一旦项目存在,用户可以被添加。在此时,用户没有关联的角色,因此最后一步是将角色分配给该用户,例如_member_
、admin
或自定义角色。
使用user create
选项创建用户时,语法如下:
openstack user create --domain --password
user_name
属性是一个任意名称,但不能包含空格。必须存在password
属性。在之前的示例中,这些设置为verysecret
。如果未指定domain
属性,则将设置为default
域。
要使用role add
选项将角色分配给用户,default
域的语法如下:
openstack role add --project --user
对于自定义域中的用户,使用以下语法分配角色:
openstack role add --domain --user --role-domain
role_domain
参数是角色所属的域的名称(或 ID)。
我们还需要用户、角色和项目的名称或 ID,以便将角色分配给用户。这些名称或 ID 可以通过以下命令找到:
openstack project list openstack user list openstack role list
--domain
选项仅在使用自定义域时需要。如果要获取域列表,请发出以下命令:
openstack domain list
要获取域、项目、用户和角色分配的矩阵,请使用以下命令:
openstack role assignment list
配置 Keystone 中的组
如果您希望按角色组织用户,可以使用 Keystone 组创建一个用户组。组属于一个域。在此示例中,我们将创建一个组reader_group
,并为其设置cloud_admin
角色。我们还将向其中添加两个用户reader
和reader1
。我们还将验证这些用户是否属于该组,并在之后移除其中一个用户。
正在准备中
确保您已登录到正确配置的 OpenStack 客户端,并且能够以具有管理员权限的用户身份访问 OpenStack 环境。
请参阅第二章,OpenStack 客户端,以获取设置环境以使用 OpenStack 命令行客户端的详细信息。
如何执行…
为了创建组并将用户分配给它们,我们将需要执行以下步骤:
-
首先创建一个组:
openstack group create --domain bookstore --description \"Bookstore reader group\" reader_group
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00028.jpeg
-
列出现有组:
openstack group list
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00029.jpeg
-
将组添加到角色:
openstack role add --group reader_group --domain bookstore --role-domain bookstore cloud_admin
--domain
和--role-domain
参数是必需的。此命令没有输出。 -
将
reader
用户添加到组中:openstack group add user --group-domain bookstore --user-domain bookstore reader_group reader
这将产生类似以下的信息:
reader added to group reader_group
-
将
reader1
用户添加到组中:openstack group add user --group-domain bookstore --user-domain bookstore reader_group reader1
这将输出以下信息:
reader1 added to group reader_group
-
检查
reader
是否在reader_group
组中:openstack group contains user reader_group reader
这将输出以下信息:
reader in group reader_group
-
检查
reader1
是否在reader_group
组中:openstack group contains user readergroup reader1
这将产生类似以下的信息:
reader1 in group readergroup
-
将
reader1
用户从reader_group
组中移除:openstack group remove user reader_group reader1
这将产生类似以下的信息:
reader1 removed from group reader_group
-
再次检查
reader1
是否在reader_group
组中:openstack group contains user reader_group reader1
这将产生类似以下的信息:
reader1 not in group reader_group
它是如何工作的…
将用户添加到身份组是一种为他们授予特定角色集合的好方法,而无需单独为每个用户分配每个角色。如果您需要管理总是获得相同角色集合的用户,可以创建一个用户组,并根据需要添加或删除用户,而不是为每个用户设置单独的角色。角色的分配方式与将角色分配给用户类似。在我们的示例中,我们首先创建了一个自定义组 reader_group
。创建组的命令如下:
openstack group create --domain --description
由于我们在示例中使用了自定义域,因此需要 。但是,如果省略
,将使用当前用户的域。
将组添加到角色:
openstack role add --group --domain --role-domain
role_domain
参数是角色所属域的名称(或 ID)。
我们还需要知道组名、角色名和项目名,以便将角色分配给用户。这些名称可以使用以下命令查找:
openstack project list openstack group list openstack role list
如果你使用自定义域,请将 --domain
作为选项传递给前面的命令。要获取域的列表:
openstack domain list
要将用户添加到组中,请使用以下命令:
openstack group add user --group-domain --user-domain
要将用户从组中移除,请执行以下命令:
openstack group remove user
要验证用户是否属于该组,请使用此命令:
openstack group contains user
要获取域、项目、用户、组和角色分配的矩阵,请使用以下命令:
openstack role assignment list
你也可以在所有前面的命令中使用项目的 ID,而不是名称。
注意
组是在 Keystone v3 中引入的。
删除项目
即使项目中有用户与之关联,也可以删除项目,因此在删除项目之前,务必先删除用户和其他项目资源,否则可能会留下孤立的资源。在本示例中,我们将展示如何删除名为 oldbook
的项目。
准备就绪
确保你已登录到正确配置的 OpenStack 客户端,并且能够以具有管理员权限的用户身份访问 OpenStack 环境。
参阅第二章,OpenStack 客户端,了解如何设置环境以使用 OpenStack 命令行客户端。
如何操作…
要删除项目,请执行以下命令:
-
从当前项目列表中获取项目名称:
openstack project list
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00030.jpeg
-
删除项目:
openstack project delete oldbook
此命令将没有输出。
它是如何工作的…
使用 OpenStack 命令行工具删除不必要的项目非常简单。确保只删除空项目。首先使用命令获取现有的项目:
openstack project list
执行以下命令删除项目:
openstack project delete
这里的 参数可以是项目 ID 或项目名称。
如果项目已分配用户,则这些用户不会被删除,但该项目将被删除。
删除用户
从 OpenStack 身份服务中删除用户是一个简单的单步过程。在本例中,我们将展示如何删除一个名为 oldreader
的用户。
准备工作
确保您已经登录到正确配置的 OpenStack 客户端,并且可以作为具有管理员权限的用户访问 OpenStack 环境。
详细信息请参见第二章,OpenStack 客户端,了解如何设置环境以使用 OpenStack 命令行客户端。
如何操作…
要删除用户,请执行以下命令:
-
从当前域中的用户中获取用户的名字:
openstack user list
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00031.jpeg
-
删除
oldreader
用户:openstack user delete oldreader
此命令将没有输出。
它是如何工作的…
使用 OpenStack 命令行工具删除不必要的用户非常简单。首先使用命令获取现有的用户:
openstack user list
执行以下命令删除用户:
openstack user delete
这里的 参数可以是用户 ID 或用户名。
删除角色
从 OpenStack 身份服务中删除角色是一个简单的单步过程。在本例中,我们将展示如何删除一个名为 oldrole
的角色。
准备工作
确保您已经登录到正确配置的 OpenStack 客户端,并且可以作为具有管理员权限的用户访问 OpenStack 环境。
详细信息请参见第二章,OpenStack 客户端,了解如何设置环境以使用 OpenStack 命令行客户端。
如何操作…
要删除角色,请执行以下命令:
-
从当前角色列表中获取角色的名字:
openstack role list
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00032.jpeg
-
删除
oldrole
角色:openstack role delete oldrole
此命令将没有输出。
它是如何工作的…
使用 OpenStack 命令行工具删除不必要的角色非常简单。首先使用命令获取现有角色:
openstack role list
执行以下命令删除角色:
openstack role delete
这里的 参数可以是角色 ID 或角色名称。
删除组
从 OpenStack 身份服务中删除用户组是一个简单的单步过程。在本例中,我们将展示如何删除一个名为 oldgroup
的组。请注意,当您删除一个组时,并不会删除分配给该组的用户。角色和组权限映射将消失,结果是,用户可能会丧失权限。
准备工作
确保您已经登录到正确配置的 OpenStack 客户端,并且可以作为具有管理员权限的用户访问 OpenStack 环境。
参见 第二章,OpenStack 客户端,了解如何配置环境以使用 OpenStack 命令行客户端。
如何操作…
要删除一个用户组,请执行以下命令:
-
从当前的组列表中获取组名称:
openstack group list
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00033.jpeg
-
删除
oldgroup
组:openstack group delete oldgroup
此命令将没有输出。
它是如何工作的…
使用 OpenStack 命令行工具删除不必要的组非常简单。首先使用命令获取现有组:
openstack group list
执行以下命令删除组:
openstack group delete
在此, 参数可以是组 ID 或组名称。
删除域
如果域没有任何关联的用户,Keystone 域可以被删除。如果尝试删除时域中有用户,系统将显示错误。在此示例中,我们将展示如何删除一个不再使用的域,名为 olddomain
。
准备工作
确保你已登录到正确配置的 OpenStack 客户端,并且可以作为具有管理员权限的用户访问 OpenStack 环境。
参见 第二章,OpenStack 客户端,了解如何配置环境以使用 OpenStack 命令行客户端。
如何操作…
要删除一个域,请执行以下命令:
-
从当前域列表中获取域的名称:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00034.jpeg
-
验证我们将要删除的
olddomain
域没有任何关联的用户:openstack user list --domain olddomain
在继续之前,该列表应为空。如果不为空,请删除所有用户后再进行下一步。
-
禁用该域:
openstack domain set --disable olddomain
此命令将没有输出。
-
删除域:
openstack domain delete olddomain
如果成功,该命令将没有输出。
它是如何工作的…
删除不必要的域需要确保域没有任何关联的用户。
验证该域没有任何关联的用户:
openstack user list --domain
删除域之前需要先禁用该域。即使域中有用户,也可以禁用该域:
openstack domain set --disable
只有在禁用域并且该域没有任何关联的用户之后,才可以删除该域:
openstack domain delete
如果你需要删除用户,请参考本章前面提到的 删除用户 章节。
OpenStack 端点信息
如果你需要查看不同 OpenStack 服务的端点信息,或者查看 OpenStack 安装上运行的服务,可以使用 OpenStack 服务目录。如果你需要自动化任何 OpenStack 任务,或者将其他工具与 OpenStack 集成,服务目录也会很有用。该目录列出了每个服务的服务和端点信息。每个部署的目录可能不同。
准备工作
确保你已登录到正确配置的 OpenStack 客户端,并且可以作为具有管理员权限的用户访问 OpenStack 环境。
请参考第二章,OpenStack 客户端,了解如何设置环境以使用 OpenStack 命令行客户端。
如何操作…
要列出 OpenStack 目录信息,请执行以下命令:
openstack catalog list
如何工作…
在 OpenStack 中,可以使用 OpenStack 目录查找不同的服务 API 端点。该目录将列出它所知道的所有 OpenStack 服务及其各自的内部、管理员和公共 URL。如果你尝试自动化任何 OpenStack 任务,目录也非常方便。在命令行界面(CLI)中,通过运行以下命令列出可用的端点:
openstack catalog list
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00035.jpeg
我们的 catalog
命令的输出已为本示例进行了截断。完整的目录命令将列出所有已安装的服务。
注意
每个 OpenStack 安装的服务目录将有所不同。