Openstack 云计算秘籍(四)
原文:
annas-archive.org/md5/2ca02d976e2dad8eba9e4b7090f2058d
译者:飞龙
协议:CC BY-NC-SA 4.0
第九章:使用 Heat 和 Ansible 进行 OpenStack 编排
本章将涵盖以下主题:
-
介绍 – 使用 OpenStack 进行编排
-
使用 Heat 创建您的第一个堆栈
-
使用 Heat 启动您的堆栈
-
查看通过 Heat 创建的堆栈的资源和输出
-
删除 Heat 堆栈
-
更新 Heat 堆栈
-
安装和配置 Ansible 以用于 OpenStack
-
使用 Ansible 启动实例
-
使用 Ansible 编排软件安装
-
使用 Ansible 在多个实例之间编排软件安装
-
使用 Ansible 完全编排 Web 服务器和负载均衡器堆栈的创建
介绍 – 使用 OpenStack 进行编排
OpenStack 被选择作为平台有很多原因,但其中一个经常排在首位的是编排。如果您的 OpenStack 环境没有编排元素,那么您就拥有了一辆强大的涡轮增压赛车,却仅仅用于接送孩子上学。与任何云环境一样,帮助编排工作负载的工具有很多,但 OpenStack 自带 Heat——编排引擎。
使用 Heat,您可以在模板中定义丰富的环境,例如多层 Web 应用程序,这使得用户在启动这些相对复杂的部署时保持一致性。我将 Heat 编排模板(称为 HOT(Heat Orchestration Template)——明白了吗?)看作是用 YAML(Yet Another Markup Language)编写的食谱。您定义构成环境的配料。在烹饪食谱中,这将列出制作蛋糕所需的巧克力、面粉和糖的数量。在 HOT 文件中,这就是参数部分。您定义实例的规格、使用的镜像以及实例应该在哪些网络上启动。
像任何好的食谱一样,您可以覆盖这些默认值——所以如果您想尝试用果酱代替巧克力酱,或者调整所需糖分的量——您可以进行调整。此外,在 Heat 中,您是在环境文件中执行此操作。此文件的布局就像您正在为参数分配值。例如,HOT 文件中的输入参数可能是 image_name
,而在环境文件中,您将 image_name=ubuntu-image
进行分配。
HOT 文件中的下一部分是最大的也是最复杂的,因为它是配方的“方法”部分——即“所有配料如何创造一个蛋糕”的部分。在 Heat 中,这是资源部分的开始。资源部分描述了实例之间如何相互作用。例如,在 Heat 运行期间,可能会创建一个包含三个 Web 服务器的负载均衡器。负载均衡器资源将有一个方法,将这三个未知的 Web 服务器附加到负载均衡池中,以便该资源完成。
最后一部分是输出部分。在烹饪食谱中,你会把蛋糕从烤箱中取出。在 OpenStack 中,这将是最终结果——你的多层 Web 应用程序。然而,由于 OpenStack 以及启动多个实例到可能尚未创建网络的环境中的特性,很难知道已经使用了哪些 IP 地址,而这些信息可能是访问已部署堆栈所需要的。因此,为此,我们有了输出部分,OpenStack 的用户可以查询堆栈并获得有用的信息,以便已启动的堆栈可用。
然而,在实例和应用程序生命周期管理方面,我们不仅限于使用 OpenStack 内的 Heat 编排引擎。如第一章 《使用 Ansible 安装 OpenStack》 中介绍的,Ansible 是一个平台无关的工具,我们可以利用它来帮助编排任务。通过使用特定于目标环境(如 OpenStack)的 Ansible 模块,我们可以以结构化的方式启动实例并执行软件安装,这种方式适用于 OpenStack 用户和其他云环境的用户。
Ansible 的基本结构非常简单。最基本的形式中,它包括剧本(playbooks)、剧本任务(plays)和任务(tasks)。如果你研究第一章 《使用 Ansible 安装 OpenStack》 中描述的 OpenStack-Ansible 剧本,你将获得一些本章未涉及的高级功能的见解,这些功能可以帮助你将基于 OpenStack 的云环境扩展为完全编排的杰作!
创建你的第一个堆栈
使用 Heat,我们可以创建各种各样的模板,从启动基本实例,到为应用程序创建完整的环境。在这一部分,我们将通过启动一个实例并将其附加到现有的 Neutron 网络,并为其分配浮动 IP,来展示 Heat 的基础知识。Heat 模板描述了所使用的资源、实例的类型和大小、实例将附加的网络,以及运行该环境所需的其他信息。
在这一部分,我们将展示如何使用 HOT 文件启动两个运行 Apache 的 Web 服务器,并将其连接到第三个运行 HAProxy 的实例上,后者充当负载均衡器。
准备工作
确保你已登录到正确配置的 OpenStack 客户端,并能够访问 OpenStack 环境。有关如何设置环境以使用 Heat 的详细信息,请参考第二章 《OpenStack 客户端》。
如何实现…
在这一部分,我们将下载一个名为 cookbook.yaml
的 HOT 文件,该文件将描述我们的实例及其要连接的网络:
-
首先,我们从 Cookbook GitHub 仓库下载 HOT 文件:
wget -O cookbook.yaml https://raw.githubusercontent.com/OpenStackCookbook/OpenStackCookbook/master/cookbook.yaml
-
Heat 从命令行或环境文件中获取输入参数,这些参数会传递给模板。这些参数出现在 HOT 文件的顶部,如下所示:
parameters: key_name: type: string description: Name of keypair to assign to servers image: type: string description: Name of image to use for servers flavor: type: string description: Flavor to use for servers public_net_id: type: string description: > ID of public network for which floating IP addresses will be allocated private_net_id: type: string description: ID of private network into which servers get deployed private_subnet_id: type: string description: ID of private sub network into which servers get deployed
-
如图所示,我们在启动这个模板时预计会传入多个参数。通过运行以下命令,确保我们拥有这些详细信息:
openstack keypair listopenstack image listopenstack flavor listopenstack network list
openstack network list
的输出可能如下所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00166.jpeg
-
有了手头的信息后,我们创建一个环境文件,用于存储将在启动堆栈时传递给 HOT 文件的参数。根据之前命令的输出,在与
cookbook.yaml
相同的目录下创建cookbook-env.yaml
文件(根据你的环境进行调整):parameters: key_name: demokey image: xenial-image flavor: m1.tiny public_net_id: 2da8979e-dcf8-4eb8-b207-f33bfce4a15a private_net_id: 78a5a119-c27a-41c4-8310-5c04d3a6bc31 private_subnet_id: 3cee2bb9-5673-4a6e-bb1e-8cb66be066b2
它是如何工作的…
Heat Orchestration Templates (HOT) 是描述我们的环境的 YAML 文件,环境也称为“堆栈”(Stacks)。基本模板通常具有以下结构:
-
description:
-
parameters:
-
resources:
-
outputs:
description:
部分包含了一些词语,帮助用户理解使用模板时预期会发生什么。
parameters:
部分定义了输入变量,例如,要使用的镜像类型、要将实例附加到的网络、以及与实例关联的密钥对名称。参数是任意的,可以包含执行模板所需的任何信息。parameters:
部分与附带的环境文件中的信息直接配合(如 --environment
参数所指定)。每个参数必须要么有默认值,要么在环境文件中指定,以便堆栈能够成功启动。
resources:
部分通常是最大的一部分,因为它描述了环境。它可以描述将要使用的实例、实例的命名、需要附加的网络,以及所有元素如何相互关联以及环境是如何协调的。如何编写这些资源的最佳方法超出了本书的范围。
outputs:
部分指的是运行堆栈时的“返回”值。例如,用户需要知道如何访问刚刚创建的某个堆栈。随机的 IP 和主机名可以像正常运行堆栈一样被分配,因此,能够查询正确的信息以访问环境是必须的。
使用 Heat 启动堆栈
要启动一个 Heat 堆栈,我们需要三样东西:堆栈的 名称,描述部署的 模板(HOT),以及最后,填补输入参数空白的 环境文件。
准备就绪
确保您已登录到正确配置的 OpenStack 客户端,并且能够访问 OpenStack 环境。有关如何设置环境以使用 OpenStack 的详细信息,请参考第二章,OpenStack 客户端。
提示
如果收到openstack: \'stack\' 不是一个 openstack
命令,请参考openstack --help
。
确保已安装python-heatclient
包:
sudo -H pip install python-heatclient
还要确保您已下载示例cookbook.yaml
Heat 模板,并根据前面的步骤创建了环境文件。
如何操作…
在本节中,我们将下载一个名为cookbook.yaml
的 HOT 文件,该文件将描述我们的实例及其要连接的网络:
-
我们将使用以下命令启动堆栈:
openstack stack create myStack --template cookbook.yaml --environment cookbook-env.yaml
提示
提示:您可以使用
-t
标志代替--template
,使用-e
代替--environment
。这将生成如下输出:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00167.jpeg
-
要查看堆栈列表,请执行以下命令:
openstack stack list
这将返回当前运行的堆栈列表:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00168.jpeg
注意堆栈状态。成功启动时,状态会标记为CREATE_COMPLETE。
它是如何工作的…
启动堆栈很简单。我们将使用--template
参数指定 HOT 文件,然后使用--environment
参数指定一个文件,该文件中描述了模板中的输入。
语法如下:
openstack stack create nameOfStack --template template.yaml --environment template-env.yaml
注意
请注意,堆栈名称在您的项目中必须是唯一的。
查看使用 Heat 创建的堆栈的资源和输出
堆栈是一个编排的服务集,启动堆栈的用户不需要过多关心分配了哪些 IP 地址。然而,应用堆栈的启动是为了某个目的,因此了解如何访问它非常有用!要访问该环境,用户需要查询堆栈的“输出”,这些输出是模板的一部分。在本示例中,我们关心的是如何访问在 HAProxy 服务器后面运行的网站。HAProxy 服务器已从 GATEWAY_NET 网络分配了一个浮动 IP 地址,假设这是访问该应用程序的方式。
准备工作
确保您已登录到正确配置的 OpenStack 客户端,并且能够访问 OpenStack 环境。有关如何设置环境以使用 Heat 的详细信息,请参考第二章,OpenStack 客户端。
如何操作…
要查看应用堆栈并获取有关如何访问它的信息,请执行以下步骤:
-
您可以使用以下命令查看堆栈的更多详细信息:
openstack stack show myStack
这将返回关于创建的堆栈的多个详细信息:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00169.jpeg
-
模板中的一部分引用了输出。输出使得用户可以查询这些值,从而访问正在运行的堆栈。如果没有这个功能,用户就需要深入研究运行中的系统,才能找出分配给堆栈组成实例的 IP 地址。要查看与我们正在运行的堆栈相关联的输出列表,请执行以下命令:
openstack stack output list myStack
这将返回以下输出:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00170.jpeg
-
要查看特定的值,比如分配给 HAProxy 实例的公共 IP(浮动 IP),我们可以访问通过负载均衡器后面的私有地址运行的站点。要做到这一点,请执行以下命令:
openstack stack output show myStack haproxy_public_ip
这将返回我们用于访问该特定服务的 IP 地址,该服务设置为一个堆栈:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00171.jpeg
-
在这个示例应用堆栈中,我们可以使用
http://192.168.100.108/
地址,它会将请求发送到任意正在运行的 Web 服务器,这些服务器是作为 HAProxy 负载均衡器演示的一部分进行配置的。
它是如何工作的…
一个堆栈被设计为接受多个输入,执行一些操作,并生成多个运行应用的实例,准备提供服务。然而,这种免操作的方式意味着许多决策都是由 OpenStack 自动决定的——主要是因为这些实例是从启用 DHCP 的子网中提供的。为了了解堆栈的状态以及如何访问堆栈的信息,用户需要查询模板中描述的输出。在示例模板中,输出部分如下所示:
outputs: webserver1_private_ip: description: IP address of webserver1 in private network value: { get_attr: [ webserver1, first_address ] } webserver2_private_ip: description: IP address of webserver2 in private network value: { get_attr: [ webserver2, first_address ] } haproxy_public_ip: description: Floating IP address of haproxy in public network value: { get_attr: [ haproxy_floating_ip, floating_ip_address ] }
包含更多信息的输出标注如下:
-
webserver1_private_ip
-
webserver2_private_ip
-
haproxy_public_ip
在这个教程中,我们特别针对haproxy_public_ip
进行了设置,因为这是我们访问所创建的 Web 服务的方式。我们执行了以下命令来实现这一点:
openstack stack output show myStack haproxy_public_ip
删除 Heat 堆栈
要删除一个运行中的 Heat 堆栈,我们将按照此教程中的方式发出一个简单的调用。
准备就绪
确保您已经登录到正确配置的 OpenStack 客户端,并能够访问 OpenStack 环境。有关如何设置环境以使用 OpenStack,请参阅第二章,OpenStack 客户端,其中详细介绍了如何设置您的环境。
如何操作…
在本节中,我们将展示如何删除堆栈。
-
要删除名为
myStack
的运行堆栈,请执行以下命令:openstack stack delete myStack
-
系统会提示您确认是否删除,正如下面所示。输入
y
以继续销毁堆栈:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00172.jpeg -
您可以通过列出已创建的堆栈来检查删除状态:
openstack stack list
如果没有堆栈可显示,或者在删除期间出现以下情况,它将返回一个空列表:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00173.jpeg
它是如何工作的…
就像我们可以轻松启动堆栈一样,删除堆栈只需指定我们要销毁的堆栈,并使用stack delete
命令即可。
如果您希望在不确认的情况下销毁堆栈,请使用以下语法:
openstack stack delete nameOfStack -y
更新 Heat 堆栈
我们的运行堆栈是基于模板的,这允许我们通过更改输入来修改应用程序堆栈。如果我们想更改 flavor 的大小或使用的密钥,可以通过更改输入并发出stack update
命令来触发堆栈中实例的重建。
准备工作
确保您已登录到配置正确的 OpenStack 客户端,并能够访问 OpenStack 环境。有关设置环境以使用 OpenStack 的详细信息,请参阅第二章,OpenStack 客户端。
如何操作…
在本节中,我们将修改环境文件,将 flavor 从m1.tiny
更改为m1.large
。(在继续之前,请确保您有一个有效的 flavor 名称!)
-
我们首先编辑名为
cookbook-env.yaml
的环境文件,展示我们希望对正在运行的堆栈进行的更改:parameters: key_name: demokey image: xenial-image flavor: m1.large public_net_id: 2da8979e-dcf8-4eb8-b207-f33bfce4a15a private_net_id: 78a5a119-c27a-41c4-8310-5c04d3a6bc31 private_subnet_id: 3cee2bb9-5673-4a6e-bb1e-8cb66be066b2
-
通过查看资源,确保堆栈正在正常运行:
openstack stack show myStack
这将返回类似以下的输出:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00169.jpeg
-
现在,我们将使用更新后的环境文件来修改正在运行的堆栈:
openstack stack update myStack --existing
提示
提示:我们使用
--existing
参数,以避免再次指定模板和环境文件。这将返回类似以下的输出,显示更新已经开始:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00174.jpeg
-
完成此操作后,我们还可以查看堆栈的状态,以显示反映的更改:
openstack stack show myStack
这将返回类似以下的输出(注意 flavor 已从
m1.tiny
更改为m1.large
)。还请注意,IP 地址没有改变:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00175.jpeg
它是如何工作的…
OpenStack Orchestration 服务 Heat 旨在遵循模板为最终用户提供运行中的服务。从头到尾,所有操作都是自动化的。这个关键功能允许我们更新正在运行的堆栈,实际上是通过更新重新部署堆栈,运行完全自动化的流程来恢复服务,使用相同的 IP 地址,但做出所需的更改。
更新堆栈的语法如下:
openstack stack update nameOfStack --environment updatedEnvironmentFile.yaml --template originalStackTemplate.yml
在我们的示例中,我们省略了--environment
和--template
参数,因为我们直接在最初使用的环境文件中对堆栈进行了所需的更改。这使得语法更简单:
openstack stack update nameOfStack --existing
安装和配置 Ansible 以用于 OpenStack
Ansible 对大多数 Linux 和 macOS 系统的先决条件要求较少。然而,在我们能使用 Ansible 来管理 OpenStack 环境之前,仍有一些步骤需要遵循。
准备工作
确保您已登录到正确配置的 OpenStack 客户端,并且可以访问 OpenStack 环境。有关如何设置环境以使用 OpenStack 的详细信息,请参见第二章,OpenStack 客户端。
Ansible 2.x 版本需要 Python 2.6 或 2.7。大多数现代 Linux 发行版和 macOS/OS X 都已经安装了这些。如果您能成功执行第二章中描述的openstack
命令,OpenStack 客户端,那么您就可以继续进行。
您可能需要安装 Shade。Shade 是一个与 OpenStack 云交互的简单客户端库。Red Hat 和 CentOS 环境默认未安装此库。可以通过以下命令进行安装:
sudo pip install shade
注意
请注意,Shade 可能会引入其他依赖项,这些依赖项可能会破坏您的环境。建议您使用虚拟环境(venv)来避免此问题。
如何做…
由于我们在客户端计算机上执行此操作,请确保您拥有安装软件的必要权限。准备好后,根据您选择的操作系统执行以下步骤。
Ubuntu
对于 Ubuntu,我们可以按以下方式使用 Ansible PPA:
-
首先,确保我们可以通过安装以下工具来添加PPA(个人软件包档案):
sudo apt-get install software-properties-common
-
接下来,我们将添加 PPA:
sudo apt-add-repository ppa:ansible/ansible
-
最后,我们将运行安装:
sudo apt-get updatesudo apt-get install ansible
macOS/OS X(以及那些想使用 pip 的人)
对于 macOS,我们可以按照以下方式使用 pip:
-
确保
pip
可用:sudo easy_install pip
-
接下来,使用
pip
安装 Ansible:sudo pip install ansible
验证安装
要验证安装,请发出以下命令:
ansible --version
这应该会产生如下输出:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00176.jpeg
它是如何工作的…
为了能够使用 Ansible 管理我们的 OpenStack 环境,我们必须确保已经正确设置了 Ansible。前面的步骤仅帮助我们使用该操作系统提供的工具将 Ansible 安装到我们的客户端上。
使用 Ansible 启动实例
使用 Ansible 启动实例是一种方便的平台无关方法。虽然我们需要为 OpenStack 指定如何执行此操作作为特定任务,但 Ansible playbook 可以扩展,使用户能够使用相同的 Ansible 命令在任何云上启动实例。本教程是将 Ansible 与 OpenStack 一起使用的一个非常基础的介绍。
准备就绪
确保您已登录到正确配置的 OpenStack 客户端,并且可以访问已安装 Ansible 的 OpenStack 环境。
如何做…
Ansible 通过称为 playbook 的任务执行文件来执行任务。在本例中,我们将创建一个简单的任务来启动名为cookbook1
的特定实例:
-
第一步是为我们的任务创建 Ansible playbook,该任务将启动我们的实例。在你的客户端创建一个名为
launch-instance.yml
的文件,放在你选择的目录中:- name: Launch instance on OpenStack hosts: localhost gather_facts: false tasks: - name: Deploy an instance os_server: state: present name: cookbook1 image: xenial-image key_name: demokey timeout: 200 flavor: m1.tiny network: private-net verify: false
-
一旦描述了这些,我们只需使用
ansible-playbook
命令运行该特定任务,如下所示:source openrcansible-playbook launch-instance.yml
这将恢复熟悉的 Ansible 输出,如下所示:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00177.jpeg
注意
这是一个
localhost
任务,因此可以忽略警告。 -
我们可以通过查看服务器列表来验证是否在 OpenStack 中启动了实例,如下所示:
openstack server list
这将恢复如下所示的输出:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00178.jpeg
请注意,任务自动从GATEWAY_NET
网络分配了一个公共浮动 IP 地址。这是一个重要细节,因为 Ansible 能做的不仅仅是启动实例。如果我们希望能够安装和配置实例,Ansible 必须能够从客户端通过 SSH 连接到正在运行的实例。私有租户网络通常无法访问;因此,Ansible 将使用公共路由网络来访问实例,就像你通过 SSH 连接到它一样。
工作原理…
使用 Ansible 启动实例使用的是os_server
Ansible 模块。该模块从 Ansible 2.0 版本开始可用。os_server
模块接受许多参数,这些参数描述了使用命令行启动实例时通常会遇到的参数。
请注意,我们在任务中没有指定任何认证细节。这是因为该模块会解释我们的 shell 环境变量,就像我们使用 OpenStack 客户端工具时一样。
你会注意到,任务中的一个条目标明了如下内容:
os_server: state: present
这在 Ansible 中有特定的意图,因为 Ansible 旨在确保任务的状态一致性,无论该任务执行多少次。这个简单的语句基本上表示该实例必须存在。如果不存在,它将启动该实例。一旦实例启动,它将满足该条件。在 Ansible 输出中,你会看到整体运行状态为ok=1 changed=1。这意味着它改变了这个环境的状态。换句话说,它启动了实例(这是一种状态变化)。
然而,如果我们再次运行该任务,输出中会出现以下微妙的变化,表明任务不需要执行,因为实例已经“存在”(即,正在运行):
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00179.jpeg
请注意,任务执行成功,但由于changed=0输出的原因,PLAY RECAP行中没有需要更改的内容。
另请参见
-
访问
docs.ansible.com/ansible/latest/os_server_module.html
获取更多信息 -
对于那些不想通过
source openrc
方法将环境变量导入到 playbook 中的用户,可以访问docs.openstack.org/shade/latest/
来设置clouds.yaml
云环境文件
使用 Ansible 来协调软件安装
使用 Ansible 启动实例并不会为用户提供太多,除了提供一致性,因为 playbook 描述了环境的最终状态:每次用户运行任务时,要么需要启动该特定实例以确保它存在,要么跳过该任务,因为该实例已经在运行。然而,我们可以通过 Ansible 实现更多的功能,而不仅仅是启动虚拟机。在这个食谱中,我们将启动另一个实例,该实例将安装并启动 Apache。
准备工作
确保你已经登录到正确配置的 OpenStack 客户端,并且可以访问安装了 Ansible 的 OpenStack 环境。
如何操作…
Ansible 执行任务的 playbook。在此示例中,我们将扩展启动特定实例的任务,允许 Ansible 连接到该实例并安装 Apache:
-
我们通过扩展前面食谱中介绍的 Ansible playbook 来开始,增加了创建安全组规则(这是为了确保 Ansible 可以通过端口
22
访问实例,并且最终能够通过端口80
访问运行的 Web 服务器)。创建一个名为orchestrate-instance.yml
的文件,内容如下:- name: Launch instances on OpenStack hosts: localhost gather_facts: false tasks: - name: Create ansible security group os_security_group: state: present name: ansible verify: false - name: Create a rule to allow SSH connections os_security_group_rule: security_group: ansible protocol: tcp port_range_min: 22 port_range_max: 22 remote_ip_prefix: 0.0.0.0/0 verify: false - name: Create webserver security group os_security_group: state: present name: webserver verify: false - name: Create rule to allow http connections os_security_group_rule: security_group: webserver protocol: tcp port_range_min: 80 port_range_max: 80 remote_ip_prefix: 0.0.0.0/0 verify: false
-
一旦我们配置了安全组,我们就可以确保这些安全组规则包含在任务中,该任务用于启动实例。我们还确保包括一个新的条目,名为
register
。这使我们能够设置与该实例关联的变量,然后可以在其他任务中引用该变量。继续编辑此文件并加入以下任务:- name: Deploy an instance os_server: state: present name: cookbook1 image: xenial-image key_name: demokey timeout: 200 flavor: m1.tiny network: private-net security_groups: default,ansible,webserver verify: false register: nova_cookbook
-
接下来,我们将添加一个任务,将该特定实例添加到一个内部的内存库存中,我们可以在 playbook 后续部分访问该库存。作为这个库存的一部分,我们告诉 Ansible,当访问该库存项时,当 Ansible 想连接到它(通过
ssh
)时,它将使用特定的 IP 地址(在我们的案例中是公共浮动 IP)。继续编辑文件并添加下一个条目,格式如下所示。由于我们使用的是 YAML,确保每个元素的缩进一致。例如,这个额外的- name: Add instance to Inventory
块必须与前一个- name: Deploy an instance
块在同一列对齐,因为它是同一个 play 的一部分:- name: Add instance to Inventory add_host: name=cookbook1 groups=webservers ansible_ssh_host={{ nova_cookbook.server.accessIPv4 }}
-
接下来,我们将添加一个新的任务,告诉 Ansible 等待该实例完成启动过程。由于 Ansible 使用 SSH 执行任务,因此合理的做法是仅在 SSH 守护进程运行并接受连接时继续。确保运行 Ansible 任务的私钥与
key_name:
中描述的公钥部分匹配。提示
请注意,这是一个新的剧本和任务,因此确保这一条目从行的起始列(列 0)开始。
- name: Wait for port 22 to be ready hosts: webservers gather_facts: False tasks: - local_action: wait_for port=22 host=\"{{ ansible_ssh_host }}\" search_regex=OpenSSH delay=10
-
这最后一组任务在运行中的实例内执行步骤;下一任务将在该运行中的实例上安装 Apache。Ansible 知道操作这个实例,因为这组任务是对
webservers
主机组执行的。我们在步骤 2 的任务中,在内存中的库存中注册了这个新组。注意
pre_tasks:
部分是可选的,在所有情况下可能不需要。本书中的示例是使用 Ubuntu 16.04 镜像创建的。Ubuntu 16.04 默认不安装 Python 2,然而这个特定的 Ansibleapt
模块,最终将安装 Apache,需要执行 Python 2 代码才能正常工作。因此,我们执行一个初始的raw
命令,这个命令不执行任何 Python,而是运行一些 shell 脚本来为我们设置一些东西。如果你正在使用随附的 Vagrant 环境,这个示例也会更加复杂,因为实例没有直接访问互联网的权限。所以,作为pre_tasks:
部分的一部分,我们还配置了一个 APT 代理服务器。- hosts: webservers remote_user: ubuntu become: yes gather_facts: no pre_tasks: - name: Set APT proxy raw: echo \"Acquire::http::Proxy \\\"http://192.168.1.20:3128\\\";\" > /etc/apt/apt.conf - name: \'install python2\' raw: sudo apt-get -y install python-simplejson tasks: - name: Ensure Apache is installed apt: name=apache2 state=latest - name: Ensure that Apache is started service: name=apache2 state=started
提示
提示:这个剧本也可以在
raw.githubusercontent.com/OpenStackCookbook/vagrant-openstack/master/orchestrate-instance.yml
找到。
创建此文件后,保存并退出。然后运行以下命令,这将启动一个实例并安装 Apache:
source openrcansible-playbook orchestrate-instance.yml
这将返回类似下面的熟悉的 Ansible 输出:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00180.jpeg
它是如何工作的…
我们在这里做的是扩展原本简单的剧本,该剧本启动了一个单一实例,并在实例完成启动过程后,添加了后续的任务,使我们能够在该实例上安装一些软件。如何实现这一点的关键细节在这里描述。
在第一个剧本中,名为 Launch instance on OpenStack
,我们首先配置一些任务来设置我们的安全组规则。默认情况下,不允许任何传入连接,而 Ansible 使用 SSH 来执行任务,因此我们至少需要确保 TCP 端口 22 是开放的。我们还配置了适合我们正在安装的服务的规则。在这种情况下,我们运行 Apache,所以我们打开 TCP 端口 80。安全组配置好之后,我们有一个名为 Deploy an instance
的任务。我们确保这个实例启动时使用我们刚刚配置的安全组,并且我们还将该实例注册到名为 nova_cookbook
的变量中。
Ansible 使用inventory数据来允许后续的 play 和 task 访问 Ansible 在环境中执行过的详细信息,因此下一个名为Add instance to Inventory
的task会将一个名为cookbook1
的host放入一个名为webservers
的host group中。对于这个特定的host(名为cookbook1
,属于webservers
组),我们设置了 Ansible 访问该实例时使用的变量,即分配的浮动 IP 地址:(ansible_ssh_host={{ nova_cookbook.server.accessIPv4 }}
。如你所见,我们使用了已注册的变量nova_cookbook
来访问 Ansible 存储的该实例的信息。使用浮动 IP 地址非常重要,因为私有租户网络无法从我们的客户端路由,因此 Ansible 无法连接以执行 Apache 安装。
下一个名为Wait for port 22 to be ready
的play基本上是一个等待 SSH 启动的task。这表示实例已准备好使用,因此我们可以通过 SSH 进入该实例并执行进一步的 Ansible 命令。
最后一个play包含执行 Apache 安装的tasks。如前所述,我们在此部分加入了一组可选的pre_tasks
,以解决 Ubuntu 16.04 没有提供 Ansible 运行所需的 Python 依赖包的问题。我们还在这里设置了一个可选的 APT 代理,因此可以根据所使用的镜像和环境自由删除和调整此部分。
这个play中的最后一组tasks基本上确保 Apache 已经安装并运行。在这里,你可以进一步添加tasks从 GitHub 拉取 Apache 配置数据,或者安装其他软件包,从而通过单个 Ansible 命令完成该实例的设置。
使用 Ansible 在多个实例上协调软件安装。
到目前为止,我们创建的 playbook 首先启动了一个实例,然后在前一个配方中扩展了该过程,接着在运行中的实例上安装了 Apache。本配方描述了一个 playbook,它可以启动任意数量的实例,并在每个实例上安装 Apache。
准备工作
确保你已登录到一个正确配置的 OpenStack 客户端,并能够访问安装了 Ansible 的 OpenStack 环境。
如何操作…
我们将扩展前一个配方中的 playbook,以增加灵活性,支持包括可变数量的实例。
-
基本结构在前面的配方中已经提供,因此我们唯一需要调整的是第一个启动实例的play,名为
Launch instances on OpenStack
。这个完整的play如下所示,其中我们引入了一个名为count
的变量,已设置为2
,并且我们还引入了with_sequence
部分,形成一个循环,该循环会执行指定次数的task。请注意,我们还将 count 值作为实例名称的一部分:- name: Launch instances on OpenStack hosts: localhost gather_facts: false vars: count: 2 tasks: - name: Create ansible security group os_security_group: state: present name: ansible verify: false - name: Create a rule to allow SSH connections os_security_group_rule: security_group: ansible protocol: tcp port_range_min: 22 port_range_max: 22 remote_ip_prefix: 0.0.0.0/0 verify: false - name: Create webserver security group os_security_group: state: present name: webserver verify: false - name: Create a rule to allow http connections os_security_group_rule: security_group: webserver protocol: tcp port_range_min: 80 port_range_max: 80 remote_ip_prefix: 0.0.0.0/0 verify: false - name: Deploy an instance os_server: state: present name: cookbook{{ item }} image: xenial-image key_name: demokey timeout: 200 flavor: m1.tiny network: private-net verify: false register: nova_cookbook with_sequence: count={{ count }} - name: Add instance to Inventory add_host: name=\"{{ item.server.name }}\" groups=webservers ansible_ssh_host=\"{{ item.server.accessIPv4 }}\" with_items: \"{{ nova_cookbook.results }}\"
-
下一组任务与前面的食谱中描述的内容相同,例如等待实例的 SSH 可用并随后安装 Apache,这里列出是为了完整性:
- name: Wait for port 22 to be ready hosts: webservers gather_facts: False tasks: - local_action: wait_for port=22 host=\"{{ ansible_ssh_host }}\" search_regex=OpenSSH delay=10- hosts: webservers remote_user: ubuntu become: yes gather_facts: no
注意
pre_tasks:
部分是可选的。您的使用方式将根据您所使用的镜像或环境所施加的任何隐性限制而有所不同。有关如何使用它的说明,请参见前面一篇食谱中的描述:pre_tasks: - name: Set APT proxy raw: echo \"Acquire::http::Proxy \\\"http://192.168.1.20:3128\\\";\" > /etc/apt/apt.conf - name: \'install python2\' raw: sudo apt-get -y install python-simplejsontasks: - name: Ensure Apache is installed apt: name=apache2 state=latest - name: Ensure that Apache is started service: name=apache2 state=started
-
假设您创建的文件名为
multi-orchestrate-instances.yml
,您可以使用以下命令执行它:source openrcansible-playbook multi-orchestrate-instances.yml
这将返回如下输出。这产生的输出比到目前为止的其他任务要多,因此这里只显示了最后一部分:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00181.jpeg
它是如何工作的…
我们在这个剧本中添加了一些额外的内容,扩展了前一个用于将 Apache 安装到新启动实例的剧本。这里对这些内容进行了描述:
vars: count: 2
我们引入了一个名为 count
的变量,给它赋值为 2
。这个变量的作用范围仅限于当前特定的任务(名为 Launch instances on OpenStack
)。这个变量用于形成一个循环,正如下面这个分配给 os_server
调用的属性所示:
with_sequence: count={{ count }}
这基本上表示:当 count = 1
时运行 os_server
模块任务,count = 2
时也运行。在这个顺序中,我们可以访问 count
的值,并存储在一个名为 item
的变量中。我们利用这个值来追加到实例的 name
变量中,从而最终生成 cookbook1
和 cookbook2
,其语法如下:
name: cookbook{{ item }}
使用 Ansible 完全编排创建 Web 服务器和负载均衡器堆栈
前面的食谱将实例启动到一个现有环境中,包括现有的网络、镜像和密钥等。例如,使用 Ansible 编排 OpenStack 环境提供了完整的模块集,可以用于操作不仅仅是 Nova。例如,我们可以使用 Ansible 来控制 Glance、Neutron、Cinder 等。
在这个食谱中,我们仅假设用户能够对一个项目进行身份验证。我们不假设任何网络存在,甚至假设没有镜像存在。我们可以获取 Ansible 的世界视图,以确保镜像和网络存在,如果不存在——就创建它们。
请注意,这个食谱旨在带您进入 Ansible 的美妙世界。这个示例展示了从头到尾创建堆栈的过程。优化 Ansible 剧本超出了本书的范围。
准备工作
确保您已登录到正确配置的 OpenStack 客户端,并且可以访问已安装 Ansible 的 OpenStack 环境。
如何操作…
执行以下步骤以启动一个环境,确保镜像可用,设置正确的安全组,创建新的网络和路由器,最后在两台 Web 服务器上安装 Apache:
-
我们可以假设一个空白的 OpenStack 项目,但我们要确保有适当运行的实例和服务。我们首先将任务包含在
Create OpenStack Cloud Environment
的剧本中,该剧本首先下载 Ubuntu 16.04 镜像,并将其加载到 OpenStack 中。首先创建full-stack.yml
文件,并添加以下内容:- name: Create OpenStack Cloud Environment hosts: localhost gather_facts: false vars: webserver_count: 2 tasks: - name: Download Ubuntu 16.04 Xenial get_url: url: http://releases.ubuntu.com/16.04/ubuntu-16.04.3-server-amd64.img dest: /tmp/ubuntu-16.04.img - name: Ensure Ubuntu 16.04 Xenial Image Exists os_image: name: xenial-image container_format: bare disk_format: qcow2 state: present filename: /tmp/ubuntu-16.04.img verify: false
-
接下来,我们将创建 私有租户网络和路由器。我们假设已经存在一个共享的提供者网络。在此实例中,我们假设这个提供者网络(提供浮动 IP 地址)被称为
GATEWAY_NET
。继续编辑文件,将以下 任务 添加到相同的Create OpenStack Cloud Environment
剧本中:- name: Create the cookbook network os_network: state: present name: cookbook_network external: false shared: false verify: false register: cookbook_network - name: Create the test subnet os_subnet: state: present network_name: \"{{ cookbook_network.id }}\" name: cookbook_subnet ip_version: 4 cidr: 192.168.0.0/24 gateway_ip: 192.168.0.1 enable_dhcp: yes dns_nameservers: - 192.168.1.20 verify: false register: cookbook_subnet - name: Create the test router os_router: state: present name: cookbook_router network: GATEWAY_NET external_fixed_ips: - subnet: GATEWAY_SUBNET interfaces: - cookbook_subnet verify: false
注意
可选(如果使用 Vagrant 环境)。当前,
os_router
模块无法向路由器中插入静态路由,因此,如果您需要在 Ansible 控制的剧本中使用静态路由,可以通过执行openstack
命令来实现,如下所示。如果您使用的是本书附带的 Vagrant 实验环境,您可能需要为路由器提供静态路由,以便流量从物理主机流向 VirtualBox/VMware 环境。如果需要此功能,请添加以下 任务(根据您的环境进行修改)。在此示例中,运行 Vagrant 环境的物理主机 IP 地址为 192.168.100.1,并允许流量从物理主机流向通过192.168.100.0/24
提供商网络的实例,这里的提供商网络即为示例中的GATEWAY_NET
:- name: Insert routes into router command: openstack router set --route destination=192.168.1.0/24,gateway=192.168.100.1 cookbook_router register: cookbook_router_route
-
接下来,我们配置安全组。记住,Ansible 使用 SSH 连接到服务器,而默认情况下,云镜像会阻止任何传入连接。因此,其中一条规则应该是允许传入的 SSH 连接。我们还需要配置安全组规则,以支持将在实例上运行的服务。在这种情况下,我们将在 TCP 端口 80 上运行 Apache 和 HAProxy,因此这里也需要进行配置:
- name: Create ansible security group os_security_group: state: present name: ansible verify: false - name: Create rule to allow SSH connections os_security_group_rule: security_group: ansible protocol: tcp port_range_min: 22 port_range_max: 22 remote_ip_prefix: 0.0.0.0/0 verify: false - name: Create webserver security group os_security_group: state: present name: webserver verify: false - name: Create rule to allow http connections os_security_group_rule: security_group: webserver protocol: tcp port_range_min: 80 port_range_max: 80 remote_ip_prefix: 0.0.0.0/0 verify: false
注意
由于我们是从一个特定的主机上运行 Ansible,因此可以通过限制来自单个 IP 地址的访问,而不是 0.0.0.0/0 的通用范围,进一步增强 Ansible SSH 安全组规则:
-
我们现在可以启动实例。继续编辑此文件,以添加启动多个网页服务器和一个单独 HAProxy 实例的任务,如下所示。请注意,选择的网络、镜像和安全组应与前面任务中创建的设置相匹配:
- name: Deploy Webserver Instances os_server: state: present name: webserver{{ item }} image: xenial-image key_name: demokey timeout: 200 flavor: m1.tiny network: cookbook_network security_groups: default,ansible,webserver verify: false register: nova_webservers with_sequence: count={{ webserver_count }} - name: Add webservers to Inventory add_host: name=\"{{ item.server.name }}\" groups=webservers ansible_ssh_host=\"{{ item.server.accessIPv4 }}\" with_items: \"{{ nova_webservers.results }}\" - name: Deploy HAProxy Instance os_server: state: present name: haproxy image: xenial-image key_name: demokey timeout: 200 flavor: m1.tiny network: cookbook_network security_groups: default,ansible,webserver verify: false register: nova_haproxy with_sequence: count=1 - name: Add HAProxy to Inventory add_host: name=\"{{ item.server.name }}\" groups=haproxy ansible_ssh_host=\"{{ item.server.accessIPv4 }}\" with_items: \"{{ nova_haproxy.results }}\"
-
正如我们所看到的,我们需要等到 SSH 可用后,Ansible 才能继续,因此我们添加一个 wait,直到满足此条件。请注意,我们将此剧本应用于
webservers
和haproxy
hosts 组:- name: Wait for port 22 to be ready hosts: webservers:haproxy gather_facts: False tasks: - local_action: wait_for port=22 host=\"{{ ansible_ssh_host }}\" search_regex=OpenSSH delay=10
-
一旦实例启动并运行,最后的任务是安装和配置在实例上运行的服务。我们将首先在我们的网页服务器上安装 Apache。这个剧本应用于我们的
webservers
主机,因此这些任务将在每台主机上运行:- name: Configure Web Servers hosts: webservers remote_user: ubuntu become: yes gather_facts: Falsepre_tasks: - name: Set APT proxy raw: echo \"Acquire::http::Proxy \\\"http://192.168.1.20:3128\\\";\" > /etc/apt/apt.conf - name: \'install python2\' raw: sudo apt-get -y install python-simplejsontasks: - name: Ensure Apache is installed apt: name=apache2 state=latest - name: Ensure that Apache is started service: name=apache2 state=started
-
由于我们的 Plays 将
gather_facts
设置为False
(因为我们使用的镜像没有预期的 Python 库来运行 Ansible,默认情况下 Ansible 任务会立即失败,这意味着我们将在新的 Play 中启动一个单独的任务来填充 Ansible 的事实清单,我们在前面的 Play 中安装了先决条件 Python 2 库)。我们需要这些信息以后来填充 HAProxy 配置文件:- name: Gathering facts about webservers hosts: webservers remote_user: ubuntu become: yes tasks: - name: Gathering facts setup:
-
现在我们可以安装和配置 HAProxy。这将应用于我们haproxy主机组(只有一个名为haproxy的服务器)。作为这个 Play 的一部分,我们将引用一个 HAProxy 配置文件模板。我们将在下一步中创建这个模板。
注意
Ansible 提供了预定义且经过广泛测试的角色,可用于软件安装。以下指南仅供示例目的。实际上,您将利用来自
galaxy.ansible.com/
的角色。继续构建此
full-stack.yml
playbook 文件,其中包含以下内容:- name: Configure HAProxy hosts: haproxy remote_user: ubuntu become: yes gather_facts: False pre_tasks: - name: Set APT proxy raw: echo \"Acquire::http::Proxy \\\"http://192.168.1.20:3128\\\";\" > /etc/apt/apt.conf - name: \'install python2\' raw: sudo apt-get -y install python-simplejson tasks: - name: Update apt cache apt: update_cache=yes cache_valid_time=3600 - name: Install haproxy apt: name=haproxy state=present - name: Enable init script replace: dest=\'/etc/default/haproxy\' regexp=\'ENABLED=0\' replace=\'ENABLED=1\' - name: Update HAProxy config template: src=templates/haproxy.cfg.j2 dest=/etc/haproxy/haproxy.cfg notify: - restart haproxy handlers: - name: restart haproxy service: name=haproxy state=restarted
-
在我们继续执行 playbook 之前,我们需要根据前面步骤中指定的内容创建 HAProxy 配置模板文件。配置指向一个名为
haproxy.cfg.j2
的模板文件,位于templates
目录中。在您正在编辑full-stack.yml
文件的当前工作目录中创建此目录:mkdir templates/vi templates/haproxy.cfg.j2
-
将
haproxy.cfg.j2
文件填充如下内容:global log 127.0.0.1 local0 notice maxconn 2000 user haproxy group haproxy daemondefaults log global mode http option httplog option dontlognull retries 3 option redispatch timeout connect 5000 timeout client 10000 timeout server 10000listen {{haproxy_app_name}} bind *:80 mode {{haproxy_mode}} stats {{haproxy_enable_stats}} {% if haproxy_enable_stats == \'enable\' %} stats uri /haproxy?stats stats realm Strictly\\ Private {% endif %} balance {{haproxy_algorithm}} option httpclose option forwardfor {% for host in groups[\'webservers\'] %} server {{ hostvars[host].inventory_hostname }} {{ hostvars[host][\'ansible_all_ipv4_addresses\'][0] }} check {% endfor %}
注意
server {{ hostvars[host]...check
行都在一行上。 -
templates/haproxy.cfg.j2
文件还涉及到一些我们尚未向 Ansible 声明的变量,例如haproxy_app_name
和haproxy_algorithm
。这些变量位于特定于我们haproxy
组的group_var
文件中。要创建此组变量文件,我们需要创建一个名为group_vars/haproxy
的目录,并在其中创建一个名为main.yml
的文件。从与我们的full-stack.yml
文件相同的目录中执行以下步骤:mkdir -p group_vars/haproxyvi group_vars/haproxy/main.yml
-
将
group_vars/haproxy/main.yml
文件填充如下内容:---haproxy_app_name: myapphaproxy_mode: httphaproxy_enable_stats: enablehaproxy_algorithm: roundrobin
-
现在我们可以准备运行我们的
full-stack.yml
playbook,以创建类似于 Heat 示例描述的环境。执行以下命令:source openrcansible-playbook full-stack.yml
这将产生类似于以下内容的输出。由于这是一个较长的 playbook,只显示最后部分:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00182.jpeg
我们还可以通过查看
openstack server list
的输出来验证这些实例正在运行并分配的地址:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00183.jpeg
-
最后,我们可以通过访问 HAProxy 服务器的浮动 IP 地址来测试我们的设置,如下所示。在这里,我们可以查看 HAProxy 统计信息:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00184.jpeg
工作原理是这样的…
我们在这里做的是系统地构建一个名为full-stack.yml
的 playbook,它执行以下步骤:
-
如有必要,请下载并安装 Ubuntu 16.04 镜像
-
创建我们的 Web 服务器和 Ansible SSH 安全组
-
创建一个私有租户网络、路由器并配置路由器
-
启动两个 Web 服务器实例和一个 HAProxy 实例
-
为每个 Web 服务器安装 Apache
-
对于 HAProxy 服务器,安装 HAProxy 并配置配置文件,自动填充 Ansible 从启动 Web 服务器中获取的信息(例如分配给每个 Web 服务器的 IP 地址)。
在这个示例中,我们介绍了几个显著的项:Ansible 事实、Jinja2配置模板文件(haproxy.cfg.j2
文件)和group_vars
。
Ansible 的事实和 HAProxy 的group_var
变量被用来填充 HAProxy 配置文件templates/haproxy.cfg.j2
。这个文件大部分看起来像普通的haproxy.cfg
文件,但包含适用于 Jinja2 的元素,Ansible 会解析这些元素。特别值得注意的是haproxy.cfg
文件,它包含负载均衡池成员行,通常看起来像以下基本结构:
server webserver1 192.168.0.6 checkserver webserver2 192.168.0.3 check
当我们将实例启动到 OpenStack 时,我们不知道它们会被分配什么 IP 地址,但 Ansible 通过其事实收集做到了这一点。如果我们看看模板中的同一行,我们得到以下内容:
{% for host in groups[\'webservers\'] %}server {{ hostvars[host].inventory_hostname }} {{ hostvars[host][\'ansible_all_ipv4_addresses\'][0] }} check{% endfor %}
这一行在开头和结尾有一些静态文本,用server
和check
表示。它们是相同的server
和check
文本,正如我们在最终输出中看到的。
模板和 Ansible 的魔力在于我们可以通过循环来做的事情,这个循环包围了这一行和我们可以访问的hostvars
。循环说明:
对于webservers
组中的每个hosts
(回顾一下,我们将 Web 服务器实例注册到这个特定的清单组中),获取hostvars[host].inventory_hostname
和hostvars[host][\'ansible_all_ipv4_addresses\'][0]
(来自收集的事实)的值。这个最后的变量取ansible_all_ipv4_addresses
字典中的第一个条目,它是我们实例的内部 IP。
结果是上一页显示的输出,列出了 HAProxy 可以访问的负载均衡池中的 Web 服务器。
我们并不局限于 Ansible 收集到的变量。我们指定了一个group_var
变量文件,内容如下:
---haproxy_app_name: myapphaproxy_mode: httphaproxy_enable_stats: enablehaproxy_algorithm: roundrobin
这在模板文件中的以下位置直接引用。这允许我们添加一些可配置的静态元素,同时保持灵活的、环境无关的 Playbook 集合。
listen {{haproxy_app_name}} bind *:80 mode {{haproxy_mode}} stats {{haproxy_enable_stats}} {% if haproxy_enable_stats == \'enable\' %} stats uri /haproxy?stats stats realm Strictly\\ Private {% endif %} balance {{haproxy_algorithm}}
第十章:使用 OpenStack Dashboard
本章将涵盖以下主题:
-
介绍 – OpenStack Dashboard
-
使用 OpenStack Dashboard 进行密钥管理
-
使用 OpenStack Dashboard 管理 Neutron 网络和路由器
-
使用 OpenStack Dashboard 管理安全组
-
使用 OpenStack Dashboard 启动实例
-
使用 OpenStack Dashboard 删除实例
-
使用 OpenStack Dashboard 添加新项目
-
使用 OpenStack Dashboard 进行用户管理
-
使用 OpenStack Dashboard 配合 LBaaS
-
使用 OpenStack Dashboard 与 OpenStack Orchestration 配合使用
介绍 – OpenStack Dashboard
通过命令行接口管理我们的 OpenStack 环境使我们能够完全控制云环境,但提供一个基于 Web 的界面,供操作员和管理员用来管理他们的环境和实例,则使这个过程更加便捷。OpenStack Dashboard,称为 Horizon,提供了一个图形化的 Web 用户界面。Horizon 是一个 Web 服务,运行在 Apache 安装下,使用 Python 的 Web Service Gateway Interface (WSGI) 和 Django,一个快速开发的 Web 框架。
安装 OpenStack Dashboard 后,我们可以管理 OpenStack 环境的所有核心组件。如果你使用 OpenStack Ansible playbook,Horizon 会通过 os-horizon-install.yml
playbook 安装。
使用 OpenStack Dashboard 进行密钥管理
SSH 密钥对允许用户在不需要密码的情况下连接到他们的 Linux 实例,它几乎是所有你将在 OpenStack 中使用的 Linux 镜像的默认访问机制。用户可以通过 OpenStack Dashboard 管理自己的密钥对。通常,这是新用户在获得访问 OpenStack 环境权限后要做的第一项任务。
准备工作
打开一个 Web 浏览器,访问我们的 OpenStack Dashboard 地址 http://192.168.100.117/
,并以 default
域中的用户身份登录,例如在 第二章 OpenStack 客户端 配方中创建的 developer
用户,使用密码 cookbook4
。我们的 Dashboard URL 与 第一章 使用 Ansible 安装 OpenStack 中讨论的公共负载均衡器 IP 相同。如果你需要查找 Horizon 的 URL,可以根据 第三章 Keystone – OpenStack 身份服务 中描述的方式,使用 OpenStack 目录列表中的公共 IP 地址。
如何操作…
登录用户的密钥对管理通过以下章节中讨论的步骤来实现:
添加密钥对
密钥对可以通过以下步骤添加:
-
可以通过点击项目 | 计算部分中的密钥对选项卡,将新密钥对添加到我们的系统:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00185.jpeg
-
我们现在会看到一个屏幕,允许密钥对管理。在屏幕的右上角有一个创建密钥对按钮。点击该按钮来创建新的密钥对:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00186.jpeg
-
在创建密钥对屏幕上,输入一个有意义的名称(例如
developer
),确保名称中没有空格,然后点击创建密钥对按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00187.jpeg -
新密钥对创建后,密钥对的私钥部分将自动下载。如果没有,请点击**重新生成并下载密钥对 “developer”**按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00188.jpeg
注意
私有 SSH 密钥无法重新创建,因此请妥善保管,并确保将其安全地存储在文件系统中。
-
点击密钥对链接,返回到我们的密钥对列表。此时我们会看到新创建的密钥对已列出。在启动实例时,我们可以选择这个新密钥对,并仅使用我们本地存储的私钥访问它:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00189.jpeg
删除密钥对
可以通过执行以下步骤删除密钥对:
-
当不再需要密钥对时,我们可以将其从 OpenStack 环境中删除。为此,请点击屏幕左侧的密钥对选项卡。
-
然后我们将看到一个屏幕,允许访问密钥对管理。在密钥对下,会列出我们可以用来访问实例的密钥对。要从系统中删除一个密钥对,点击我们想要删除的密钥对旁边的删除密钥对按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00190.jpeg
-
我们将看到一个确认对话框:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00191.jpeg
一旦点击删除密钥对按钮,密钥对将被删除。
导入密钥对
如果你有用于访问其他系统的密钥对,这些密钥对可以导入到我们的 OpenStack 环境中,从而继续用于访问我们 OpenStack 计算环境中的实例。要导入密钥对,请执行以下步骤:
-
我们可以将传统 Linux 环境中创建的密钥对导入到 OpenStack 设置中。如果你还没有密钥对,可以在 Linux 或其他 Unix 主机上运行以下命令:
ssh-keygen -t rsa -f cookbook.key
-
这将在我们的客户端上生成以下两个文件:
cookbook.key
cookbook.key.pub
-
cookbook.key
文件是我们的私钥,必须保护它,因为它是唯一与cookbook.key.pub
密钥对的公钥部分匹配的密钥。 -
我们可以导入这个公钥到 OpenStack 环境中,这样当实例启动时,公钥会被插入到正在运行的实例中。要导入公钥,确保你在访问与安全屏幕,然后在密钥对下,点击导入密钥对按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00192.jpeg
-
我们看到一个屏幕,要求我们命名密钥对并粘贴我们的公钥内容。所以请命名密钥对,然后将公钥的内容复制并粘贴到空白处——例如,
cookbook.key.pub
的内容。一旦输入完毕,点击导入密钥对按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00193.jpeg
完成后,我们会看到该用户可用的密钥对列表,包括我们导入的密钥对:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00194.jpeg
工作原理…
密钥对管理很重要,因为它为访问我们的运行实例提供了一种一致且安全的方式。允许用户在其项目中创建、删除和导入密钥对,可以帮助他们创建更安全的系统。
OpenStack 仪表盘允许用户轻松创建密钥对。不过,用户必须确保下载的私钥保持安全。
虽然删除密钥对很简单,但用户必须记住,删除与正在运行的实例关联的私钥会导致无法访问正在运行的系统。从仪表盘删除密钥对不会删除已经运行的实例中的密钥。每个创建的密钥对都是唯一的,不管其名称是什么。名称只是标签,密钥的唯一指纹是必需的,且无法重新创建。
导入密钥对的优势在于,我们可以在 OpenStack 内部使用我们已经在外部使用的现有安全密钥对。这为在不同环境之间迁移提供了一致的用户体验。
使用 OpenStack 仪表盘管理 Neutron 网络和路由器
OpenStack 仪表盘具有查看、创建和编辑 Neutron 网络的功能,这使得管理复杂的软定义网络变得更加容易。某些功能,如创建共享网络和提供商路由器,要求用户以管理员权限登录 OpenStack 仪表盘,但任何用户都可以创建私有网络。为了帮助管理复杂的软定义网络,OpenStack 仪表盘提供了图形化查看和更新网络拓扑的功能。
准备工作
打开一个网页浏览器,访问我们的 OpenStack Dashboard 地址 http://192.168.100.117/
,并以 default
域中的用户身份登录,例如在第二章 OpenStack 客户端 中创建的 developer
用户,密码为 cookbook4
。我们的 Dashboard URL 与第一章 使用 Ansible 安装 OpenStack 中讨论的公共负载均衡器 IP 地址相同。如果你需要找出 Horizon 的 URL,请使用 OpenStack 目录列表中的公共 IP,方法如在第三章 Keystone – OpenStack 身份服务 中所述。
如何操作
本食谱将指导你通过 OpenStack Dashboard 创建和删除网络:
创建网络
要为已登录用户创建私有网络,请执行以下步骤:
-
要管理 OpenStack Dashboard 中的网络,选择网络标签,如下图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00195.jpeg
-
选择该选项后,我们将看到一个可以分配给实例的网络列表:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00196.jpeg
-
要创建一个新网络,点击创建网络按钮。
-
我们将看到一个对话框,首先要求我们为网络命名:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00197.jpeg
-
选择名称后,保持管理状态设置为启用(这意味着我们的网络将处于开启状态,并且实例可以连接到该网络),然后选择子网标签或点击下一步按钮为其分配一个子网:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00198.jpeg
-
填写子网的详细信息后,选择子网详情标签,允许我们配置例如 DHCP 范围、DNS 和用户选择该网络时希望设置的任何其他路由:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00199.jpeg
-
填写完所有详细信息后,点击创建按钮,这将使该网络对我们项目的用户可用,并将我们带回可用网络列表:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00200.jpeg
创建路由器
一旦添加了私有网络,它可能需要连接到外部网络。如果你有公共网络,只需在私有网络和公共网络之间创建一个路由器即可。
要管理路由器,请执行以下步骤:
-
选择路由器标签,如下图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00201.jpeg
这将显示已登录用户可用的路由器:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00202.jpeg
-
点击创建路由器按钮以添加新路由器:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00203.jpeg
-
输入路由器名称并选择外部网络。在我们的例子中,我们将选择 公共 网络。点击 创建路由器 按钮。将显示可用路由器的列表,包括新创建的路由器:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00204.jpeg
-
点击新创建的路由器名称查看详细信息:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00205.jpeg
-
此路由器仍然缺少一个接口。要将私有网络作为可用接口添加,请选择 接口 标签:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00206.jpeg
-
点击 添加接口 按钮以添加缺失的接口:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00207.jpeg
-
选择需要通过路由器连接到公共网络的子网,并点击 提交 按钮。现在我们的路由器有了一个额外的接口:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00208.jpeg
查看网络
OpenStack 控制面板为用户和管理员提供查看环境拓扑的能力。要查看网络拓扑,请执行以下步骤:
-
要在我们的 OpenStack 控制面板中管理网络,请选择 网络拓扑 标签,如下图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00209.jpeg
-
点击 网络拓扑 标签会显示一个丰富的界面,概览我们网络及附加在其上的实例,如下所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00210.jpeg
-
在这个界面中,我们可以点击该界面的各个部分,如网络(带我们进入管理网络界面)、实例(带我们进入实例界面),以及创建新网络、路由器和启动新实例。
删除路由器
要删除登录用户的私有路由器,请执行以下步骤:
-
要在我们的 OpenStack 控制面板中管理路由器,请选择 路由器 标签,如下图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00211.jpeg
-
选择此选项后,我们将看到所有登录用户的可用路由器:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00212.jpeg
-
要删除路由器,请点击 清除网关 按钮旁边的下拉操作菜单项,然后点击 删除路由器 选项:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00213.jpeg
-
一旦路由器被删除,您将看到可用剩余路由器的列表:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00214.jpeg
删除网络
要删除登录用户的私有网络,请执行以下步骤:
-
要在我们的 OpenStack 控制面板中管理网络,请选择 网络 标签,如下图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00215.jpeg
-
选择此选项后,我们将看到一个可以分配给实例的网络列表:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00216.jpeg
-
要删除网络,请选中我们想要删除的网络名称旁的复选框,然后点击 删除网络 按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00217.jpeg
-
我们将看到一个对话框,要求我们确认删除操作:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00218.jpeg
-
点击 删除网络 按钮将删除该网络,并返回到可用网络的列表中。
注意
你只能删除没有实例附加的网络。如果该网络上仍然有实例,系统会警告你无法删除。
它是如何工作的…
查看和编辑 Neutron 网络的功能是 OpenStack 较早版本引入的一个便捷特性。管理 Neutron 网络和路由器可能相当复杂,但借助 OpenStack Dashboard 提供的可视化帮助,操作变得更加轻松。
作为管理员(具有管理员角色的用户),你可以创建共享网络。前面的配方中的相同过程也适用,但你会看到一个额外的选项,允许所有创建的网络被所有项目看到。
使用 OpenStack Dashboard 进行安全组管理
安全组是网络规则,允许一个项目中的实例与另一个项目中的实例相隔离。在 OpenStack Dashboard 中,管理安全组规则变得非常简单。
准备好
打开一个网页浏览器,访问我们的 OpenStack Dashboard 地址 http://192.168.100.117/
,并以 default
域中的用户身份登录,例如在第二章 OpenStack 客户端 的 常见 OpenStack 身份任务 配方中创建的 developer
用户,使用 cookbook4
密码。我们的 Dashboard URL 与第一章 使用 Ansible 安装 OpenStack 中讨论的公共负载均衡器 IP 地址相同。如果你需要查找 Horizon 的 URL,请使用 OpenStack 目录列表中的公共 IP,如第三章 Keystone – OpenStack 身份服务 中所述。
操作步骤…
要在 OpenStack Dashboard 中管理安全组,请按照以下章节中的步骤进行操作:
创建安全组
创建安全组,请执行以下步骤:
-
通过 网络 部分的 安全组 标签,我们可以将新的安全组添加到系统中,因此请点击它:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00219.jpeg
-
接下来,我们将看到一个屏幕,允许访问安全设置并管理密钥对。在 安全组 中,将列出我们启动实例时可以使用的安全组。要创建一个新的安全组,请点击 创建安全组 按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00220.jpeg
-
我们需要为安全组命名并提供描述。名称不能包含空格:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00221.jpeg
-
创建新安全组后,屏幕上将显示可用安全组的列表。在这里,我们可以向新的安全组添加新的网络安全规则:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00222.jpeg
编辑安全组以添加和删除规则
要添加和删除规则,可以通过执行以下步骤编辑安全组:
-
当我们创建了一个新的安全组,或者希望修改现有安全组的规则时,可以点击该安全组的管理规则按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00223.jpeg
-
在点击管理规则按钮后,我们将进入一个列出所有现有规则的界面,允许我们向该安全组添加新规则:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00224.jpeg
要向新的安全组添加规则,我们点击添加规则按钮。这将允许我们根据不同的协议类型创建规则:ICMP、TCP和UDP。还提供了常用服务的规则模板列表。举个例子,我们将添加一条允许来自任何地方的HTTPS访问的安全组规则。为此,我们选择以下选项:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00225.jpeg
-
我们从下拉菜单中选择HTTPS选项。这会将我们带回到添加规则菜单,在这里我们可以指定网络流量的来源:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00226.jpeg
-
当我们点击添加按钮时,我们会被重定向到与我们的安全组相关联的规则列表。重复前一步骤,直到配置完成与安全组相关的所有规则:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00227.jpeg
-
我们还可以为没有内置规则模板的服务添加自定义安全规则。在点击添加规则按钮后,我们将从规则下拉列表中选择自定义 TCP 规则选项。然后,我们将从开放端口下拉列表中选择端口范围选项,这将展示起始端口和结束端口字段。我们输入端口范围后,点击添加按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00228.jpeg
-
请注意,我们也可以在这里删除规则。只需选择我们不再需要的规则,并点击删除规则按钮。系统将要求我们确认删除操作。
删除安全组
删除安全组的步骤如下:
-
删除安全组的操作是选择我们要删除的安全组,并点击删除安全组按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00229.jpeg
-
您将被要求确认此操作。点击删除安全组将删除安全组及其关联的访问规则:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00230.jpeg
注意
如果有实例正在使用该安全组,您将无法删除该安全组。
它是如何工作的…
安全组对我们的 OpenStack 环境至关重要,因为它们为访问运行中的实例提供了一种一致且安全的方式。允许用户创建、删除和修改安全组以供其项目使用,使他们能够创建安全的环境。安全组中的规则是“默认拒绝”,意味着如果没有为特定协议定义规则,则该协议的流量无法访问分配给该安全组的运行实例。
安全组在创建时与实例关联;然而,它们也可以稍后添加到正在运行的实例中。例如,假设某个实例仅使用default
安全组启动。我们设置的default
安全组仅允许访问 TCP 端口22
,并且能够 ping 实例。如果我们需要访问 TCP 端口80
,则必须将此规则添加到default
安全组中,或者将一个新的安全组添加到正在运行的实例中。
提示
对安全组的修改会立即生效,任何分配了该安全组的实例都将应用这些新规则。
使用 OpenStack Dashboard 启动实例
使用 OpenStack Dashboard 启动实例非常简单。我们只需选择所需的镜像,选择实例的大小,然后启动它。
准备工作
打开一个网页浏览器,访问我们的 OpenStack Dashboard 地址http://192.168.100.117/
,并以default
域中的用户(如在第二章的Common OpenStack 身份任务配方中创建的developer
用户)身份登录,密码为cookbook4
。我们的仪表板 URL 与在第一章的使用 Ansible 安装 OpenStack中讨论的公共负载均衡器 IP 相同。如果需要查找你的 Horizon 的 URL,请使用 OpenStack 目录列表中的公共 IP,方法请参考第三章的Keystone – OpenStack 身份服务。
如何操作…
要通过 OpenStack Dashboard 界面启动实例,请执行以下步骤:
-
转到计算部分的实例标签页:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00231.jpeg
-
到达此页面后,您将看到所有正在运行的实例:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00232.jpeg
-
在实例屏幕上,点击启动实例按钮。这将显示实例创建的第一个标签页:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00233.jpeg
输入实例名称,选择可用区和实例数量。然后,点击下一步按钮。
-
选择实例启动时应使用的源。我们在示例中使用的是预加载的
ubuntu-xenial
镜像。如果需要 Cinder 卷,也可以在此标签中指定。设置好实例源信息后,点击下一步按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00234.jpeg -
选择你的虚拟机(VM)规格。规格决定了虚拟机的大小。点击下一步按钮继续:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00235.jpeg
-
选择在启动时应该附加到实例的网络。可以指定多个网络。选择网络后,点击左侧的安全组标签:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00236.jpeg
-
选择应该附加到实例的安全组。安全组决定了新创建的虚拟机的网络访问权限。点击下一步按钮继续:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00237.jpeg
-
在此屏幕上,我们需要选择一个密钥对,用于实例启动后访问该实例。选择密钥对后,你可以点击启动实例按钮,或者查看其余屏幕以获取可能会添加到实例中的额外信息:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00238.jpeg
-
虚拟机启动后,将显示现有实例列表。如果新创建的虚拟机出现问题,它将在状态列中显示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00239.jpeg
它是如何工作的……
从 Horizon——OpenStack 仪表板——启动实例是通过几个步骤完成的,所有这些都通过引导式的启动实例界面。以下是启动实例所需的属性:
-
来源:这可以是镜像、快照、卷或卷快照
-
规格或大小:这决定了实例的计算、内存和存储容量
-
网络:必须选择至少一个网络接口以启动实例
-
安全组:这些不是启动实例所必需的,但它们用于控制实例的网络访问
-
密钥对:这是可选的,但建议用于登录到实例
实例标签显示了我们开发项目中正在运行的实例。
提示
你还可以通过点击概览标签,查看我们环境中正在运行的概况。
使用 OpenStack 仪表板删除实例
使用 OpenStack 仪表板终止实例非常简单。
准备工作
打开一个网页浏览器,访问我们的 OpenStack Dashboard 地址 http://192.168.100.117/
,并以 default
域中的用户身份登录,例如在 第二章 OpenStack 客户端 中创建的 developer
用户,密码为 cookbook4
。我们 Dashboard 的 URL 与 第一章 使用 Ansible 安装 OpenStack 讨论的公共负载均衡器 IP 相同。如果你需要查找 Horizon 的 URL,可以使用 OpenStack 目录列表中的公共 IP,如 第三章 Keystone – OpenStack 身份服务 中所述。
如何操作……
使用 OpenStack Dashboard 删除实例,请执行以下步骤:
-
选择 实例 标签页,勾选要终止的实例旁边的复选框,然后点击红色的 删除实例 按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00240.jpeg
-
我们将看到一个确认屏幕。点击 删除实例 按钮以终止选定的实例:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00241.jpeg
-
现在我们会看到 实例 屏幕,并确认实例已成功删除。
它是如何工作的……
使用 OpenStack Dashboard 删除实例很简单。我们只需选择正在运行的实例,并点击 删除实例 按钮,该按钮在选择实例时会被高亮显示。点击 删除实例 按钮后,我们需要确认此操作,以最大程度地减少意外终止实例的风险。
使用 OpenStack Dashboard 添加新项目
OpenStack Dashboard 不仅仅是管理我们实例的界面。它还允许管理员配置环境、用户和项目。在 OpenStack Dashboard 中,添加用户可以加入的新项目非常简单。
准备就绪
打开一个 web 浏览器,指向我们的 OpenStack Dashboard 地址 http://192.168.100.117/
,并以 default
域中的用户(例如在第二章中的Common OpenStack identity tasks食谱创建的 developer
用户)身份登录,使用 cookbook4
密码。我们的仪表盘网址与第一章中讨论的公共负载均衡器 IP 相同。如果你需要查找 Horizon 的 URL,可以使用 OpenStack 目录列表中的公共 IP,正如在第三章中描述的那样,Keystone – OpenStack 身份服务。
如何操作…
要将一个新项目添加到我们的 OpenStack 环境,执行以下步骤:
-
在我们以具有管理员权限的用户身份登录后,我们将看到更多的菜单选项出现在身份选项卡下。其中一个选项是项目,如下图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00242.jpeg
-
要管理项目,我们点击身份选项卡下列出的项目选项。这将列出我们环境中可用的项目,如下图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00243.jpeg
-
要创建一个新项目,点击创建项目按钮。
-
接下来,我们将看到一个表单,要求输入项目名称和描述。将
horizon
作为我们的项目名称,并输入描述:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00244.jpeg -
我们通过选择启用复选框来启用该项目,然后点击创建项目按钮。
-
我们将看到一个当前可用的项目列表,并显示一条消息,说明
horizon
项目已成功创建。
它是如何工作的…
OpenStack Dashboard 是一个功能丰富的界面,补充了在管理 OpenStack 环境时可用的命令行选项。这意味着我们可以简单地创建一个项目,用户可以加入到该项目中,使用 OpenStack Dashboard。创建新项目时,我们需要以具有管理员权限的用户身份登录,以便访问完整的项目管理界面。
使用 OpenStack Dashboard 进行用户管理
OpenStack Dashboard 使我们能够通过 Web 界面管理用户。这允许管理员轻松地在 OpenStack 环境中创建和编辑用户。要管理用户,你必须使用管理员角色成员的帐户登录。
准备工作
打开一个网页浏览器,将其指向我们 OpenStack Dashboard 的地址 http://192.168.100.117/
,并以 default
域中的用户身份登录,例如在第二章的常见 OpenStack 身份任务食谱中创建的 developer
用户,密码为 cookbook4
。我们的仪表板的 URL 与第一章的使用 Ansible 安装 OpenStack中讨论的公共负载均衡器 IP 相同。如果你需要查找 Horizon 的 URL,请使用 OpenStack 目录列表中的公共 IP,如第三章的Keystone – OpenStack 身份服务中所述。
如何操作……
在 OpenStack Dashboard 中的用户管理通过执行以下章节讨论的步骤来实现。
添加用户
要添加用户,请执行以下步骤:
-
在身份面板中,点击用户选项以显示系统上配置的用户列表:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00245.jpeg
此截图为了清晰和节省空间,截断了可用的用户列表。
-
要创建一个新用户,点击创建用户按钮。
-
我们将看到一个表单,要求填写用户名的详细信息。请输入用户名、电子邮件和该用户的密码。在下面的截图示例中,我们创建了一个名为
test
的用户,设置了密码,并将该用户分配给horizon
项目,角色为管理员。点击创建用户按钮以创建一个包含所有指定详细信息的新用户:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00246.jpeg -
我们将返回到列出我们 OpenStack 环境中的用户的屏幕,并显示一条消息,表示我们的用户创建成功。
删除用户
要删除用户,请执行以下步骤:
-
在身份面板中,点击用户选项以显示系统上的用户列表。
-
我们将看到我们 OpenStack 环境中的用户列表。要删除一个用户,点击编辑按钮,弹出一个下拉列表,其中包含删除用户选项:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00247.jpeg
-
点击删除用户选项会弹出确认对话框。点击删除用户按钮确认,删除该用户:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00248.jpeg
更新用户的详细信息和密码
要更新用户的详细信息和密码,请执行以下步骤:
-
在身份面板中,点击用户选项以显示系统上的用户列表。
-
要更改用户的密码、电子邮件地址或主要项目,点击该用户的编辑按钮。
-
这将弹出一个对话框,要求提供相关信息。当信息设置完成后,点击更新用户按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00249.jpeg
将用户添加到项目中
要将用户添加到项目中,请执行以下步骤:
-
在身份面板中,点击项目选项以显示系统中的项目列表:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00250.jpeg
-
点击管理成员选项以显示与项目关联的用户列表以及我们可以将其添加到项目中的用户列表:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00251.jpeg
-
要将新用户添加到列表中,只需点击该用户旁边的**+**(加号)按钮。
-
要更改该项目中用户的角色,请选择用户名旁边的下拉菜单并选择新的角色(或多个角色):https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00252.jpeg
在我们的示例中,我们已将
developer
用户添加到demo
项目,并为user
分配了admin
和_member_
角色。 -
在点击对话框底部的保存按钮后,我们将看到一条消息,表示我们的项目已更新。此用户现在可以在不同的项目中启动实例。
从项目中移除用户
要从项目中移除用户,请执行以下步骤:
-
在身份面板中,点击项目选项以显示系统中的项目列表。
-
例如,要从
demo
项目中移除用户,请点击管理成员按钮:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00253.jpeg -
点击管理成员按钮后,您将看到一个弹出窗口,显示所有用户以及项目成员的列表,我们可以将其从项目中移除:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00254.jpeg
-
要从此项目中移除用户,请点击项目成员下该特定用户旁边的**-**(减号)按钮。
-
在点击对话框底部的保存按钮后,我们将看到一条消息,表示我们的项目已更新。
工作原理……
OpenStack 仪表板使得创建用户、修改其在项目中的成员身份、更新密码以及将其从系统中删除变得更加简便。
使用 OpenStack 仪表板与 LBaaS
OpenStack 仪表板具有查看、创建和编辑负载均衡器、添加虚拟 IP(VIPs)以及将节点添加到负载均衡器后的功能。仪表板还提供了创建 HA Proxy 服务器负载均衡服务的接口。我们首先通过创建负载均衡池来做,然后将正在运行的实例添加到这些池中。
在本节中,我们将使用两个运行 Apache 的实例。我们将创建一个 HTTP 负载均衡池,创建一个虚拟 IP(VIP),并将实例配置为池的一部分。结果是能够使用 HTTP 负载均衡池地址将流量发送到两个运行 Apache 的实例。
准备工作
打开一个网页浏览器,访问我们的 OpenStack 仪表盘地址 http://192.168.100.117/
,并以 default
域中的用户登录,例如在第二章的常见 OpenStack 身份任务食谱中创建的 developer
用户,使用 cookbook4
密码登录。我们的仪表盘 URL 与在第一章的使用 Ansible 安装 OpenStack中讨论的公共负载均衡器 IP 相同。如果您需要查找 Horizon 的 URL,可以使用在第三章的Keystone – OpenStack 身份服务中描述的 OpenStack 目录列表中的公共 IP。
如何操作…
本食谱将指导您如何使用 OpenStack 仪表盘创建和删除负载均衡器:
创建负载均衡器
要为已登录用户创建负载均衡器池,请执行以下步骤:
-
要在我们的 OpenStack 仪表盘中管理负载均衡器,请选择负载均衡器选项卡,如下图所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00255.jpeg
-
这将显示可用的负载均衡池。由于我们当前没有任何已创建的负载均衡池,请点击右上角的创建负载均衡器按钮以添加负载均衡器。
-
点击创建负载均衡器按钮后,我们将看到一个弹出窗口。填写详细信息以添加新的负载均衡器:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00256.jpeg
-
IP 地址不是必需的;如果未提供,系统将选择所选子网中的下一个可用 IP。
-
通过点击下拉菜单选择池的子网。我们的所有实例都连接到私有网络,因此我们选择private-subnet。
-
点击下一步按钮后,提供负载均衡器监听器的详细信息:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00257.jpeg
-
HTTP
和TCP
协议可供我们选择,因此我们将使用HTTP
。TERMINATED_HTTPS
仅在配置了密钥管理服务时可用。 -
选择前端监听的端口。一个负载均衡器可以配置多个监听器,但每个监听器必须具有唯一的端口。
-
点击下一步按钮后,提供池的详细信息。我们将使用
ROUND_ROBIN
负载均衡方法。其他算法包括LEAST_CONNECTIONS
和SOURCE_IP
:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00258.jpeg -
点击下一步按钮进入池成员页面。通过点击可用实例旁边的添加按钮,将成员添加到池中:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00259.jpeg
提示
如果实例未列在可用实例中,请点击添加外部成员按钮。
-
点击下一步按钮后,我们将进入监控器详情页面。在这里,我们为池成员配置健康检查。我们将使用
PING
作为监控器类型。其他可选类型包括HTTP
和TCP
。 -
设置健康检查间隔时间(以秒为单位),然后设置重试次数和健康检查超时的时间:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00260.jpeg
注意
每个池只能关联一个健康监控器。
-
点击创建负载均衡器按钮,使用所有输入的详情创建负载均衡器。您将在所有可用负载均衡器的列表中看到新创建的负载均衡器。https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00261.jpeg
删除负载均衡器
要删除负载均衡器,我们首先需要删除附加的健康监控器、监听器和池。在我们的示例中,我们将展示如何删除其中一个,但如果有多个池,您需要在删除负载均衡器之前删除所有池、监听器和健康监控器。
-
从负载均衡器页面开始,点击您希望删除的负载均衡器名称。在我们的示例中,名称是
web-loadbalancer
:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00262.jpeg -
从负载均衡器详情页面,点击监听器名称。在我们的示例中,监听器名为
test-lb
:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00263.jpeg -
在监听器详情页面,点击默认池 ID:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00264.jpeg
默认池 ID 位于管理员状态下方,它是显示的三个 ID 中的第一个:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00265.jpeg
-
点击池 ID 会将我们带到池详情页面。点击添加/移除池成员按钮删除所有池成员:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00266.jpeg
-
这将显示一个新的页面,用于移除池成员。通过点击每个成员旁边的移除按钮,删除所有池成员:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00267.jpeg
-
点击添加/移除池成员按钮以保存更改:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00268.jpeg
-
删除池成员后,我们将返回到池详情页面。我们需要删除所有健康监控器,才能删除池:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00269.jpeg
-
点击健康监控器 ID以访问健康监控器详情:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00270.jpeg
-
从健康监控器详情页面,点击编辑按钮旁边的下拉箭头,选择删除健康监控器选项。点击删除健康监控器选项以删除健康监控器:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00271.jpeg
-
这将显示一个确认页面。点击删除健康监控器按钮进行确认:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00272.jpeg
-
删除健康监控后,我们会回到池的页面。点击编辑池按钮旁边的操作箭头,展开删除池选项。点击删除池选项:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00273.jpeg
-
系统会显示确认页面。点击删除池按钮以确认删除池:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00274.jpeg
-
删除池后,我们会回到监听器详情页面。点击编辑按钮旁边的操作箭头,展开删除监听器选项。点击删除监听器选项以删除监听器:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00275.jpeg
-
系统会显示确认页面;点击删除监听器按钮以确认删除监听器:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00276.jpeg
-
删除监听器后,我们会回到负载均衡器详情页面。点击编辑按钮旁边的操作箭头,展开删除负载均衡器选项。点击删除负载均衡器选项以删除负载均衡器:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00277.jpeg
-
系统会显示确认页面。点击删除负载均衡器按钮以删除负载均衡器:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00278.jpeg
工作原理……
我们创建了一个带有健康监控的负载均衡池,并向其中添加了两个实例。为此,我们执行了以下步骤:
-
从负载均衡器页面创建负载均衡器。
-
创建监听器时,选择所有节点所连接的子网。
-
向监听器添加成员。
-
添加健康监控。
创建负载均衡器后,所有负载均衡器的详细信息都可以编辑。删除负载均衡器时需要删除所有已创建的资源:池、监听器和健康监控。
使用 OpenStack 仪表盘与 OpenStack 编排
Heat 是 OpenStack 编排引擎,允许用户通过模板快速启动整个环境。Heat 模板,称为HOT(Heat 编排模板),是基于YAML(另一种标记语言)的文件。这些文件描述了所使用的资源、实例的类型和大小,以及实例将连接的网络等信息,这是运行该环境所需的其他信息。
在第九章中,使用 Heat 和 Ansible 进行 OpenStack 编排,我们向你展示了如何使用 Heat 命令行客户端。在本节中,我们将展示如何在 OpenStack 仪表盘中使用现有的 Heat 模板文件启动两个运行 Apache 的 Web 服务器,并将其连接到一个运行 HA Proxy 的第三个实例。
正在准备
打开一个网页浏览器,访问我们的 OpenStack 仪表板地址http://192.168.100.117/
,并以default
域中的用户身份登录,例如在第二章的常见 OpenStack 身份任务食谱中创建的developer
用户,使用密码cookbook4
。我们仪表板的 URL 与第一章的使用 Ansible 安装 OpenStack中讨论的公共负载均衡器 IP 相同。如果需要找出 Horizon 的 URL,请使用 OpenStack 目录列表中的公共 IP,如第三章的Keystone – OpenStack 身份服务中所述。
如何操作…
本教程将引导您使用 OpenStack 仪表板启动和删除编排堆栈。
启动堆栈
要为已登录用户启动 Heat 堆栈,请执行以下步骤:
-
要查看我们 OpenStack 仪表板中可用的 Heat 堆栈,请从编排菜单中选择堆栈选项卡,如下所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00279.jpeg
-
单击堆栈选项卡后,您将看到环境中所有运行的堆栈。在我们的例子中,列表是空的,如下所示:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00280.jpeg
-
单击启动堆栈按钮以创建一个新的堆栈。您将看到以下窗口:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00281.jpeg
-
有几种方式可以指定要在堆栈中使用的模板源:文件、直接输入或URL。选择对您来说最方便的选项。在我们的示例中,您可以直接使用 URL,也可以上传文件。模板文件可以从这里下载:
raw.githubusercontent.com/OpenStackCookbook/OpenStackCookbook/master/cookbook.yaml
。我们将使用URL选项,直接在模板中使用链接。 -
就像可以上传模板源文件一样,我们也可以上传环境源文件。在这种情况下,我们不一定非要使用环境源文件,但它使得过程更加便捷。环境文件存储了我们需要手动输入到浏览器中的值,而是会在启动堆栈屏幕上加载这些值,如第 8 步所示。在我们的示例中,我们使用的环境文件可以从这里下载:
raw.githubusercontent.com/OpenStackCookbook/OpenStackCookbook/master/cookbook-env.yaml
。请更新public_net_id
、private_net_id
和private_subnet_id
字段,以匹配您的环境。提示
如果您不确定在哪里找到网络信息,请参考使用 OpenStack Dashboard 管理 Neutron 网络和路由器一文。
-
选择模板源和环境源文件后,点击下一步:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00282.jpeg
-
我们的示例环境文件包含以下内容:
parameters: key_name: web image: ubuntu-xenial flavor: small public_net_id: eacdcb30-9c41-4be5-8954-d8dfff793512 private_net_id: 9db0448b-eb48-4cd0-ac01-676266c3463e private_subnet_id: 4485b7ba-d895-487a-83c7-a319e90549ba
-
点击下一步将显示一个启动堆栈窗口,包含所有输入项:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00283.jpeg
-
请注意,我们模板中的大部分输入项现在已经填写。如果您在前一步中没有指定环境源文件,您需要填写
key_name
、image
、flavor
、public_net_id
、private_net_id
和private_subnet_id
字段。注意
这些字段是特定于每个模板的。您的模板可能有不同的字段。
-
输入堆栈名称和您的用户密码。如果您以 admin 或 demo 身份登录,密码为
openstack
。 -
点击启动开始堆栈创建。如果所有输入项都正确,您应该会看到堆栈正在创建,类似以下示例:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00284.jpeg
-
在堆栈创建完成后,如果没有出现错误,您将看到堆栈的状态更新为创建完成:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00285.jpeg
查看堆栈详情
启动堆栈后,会有很多与每个堆栈相关的信息,包括输入、输出以及在出现错误时,堆栈创建失败的原因信息。
-
要查看堆栈的详细信息,请点击堆栈列表中的堆栈名称。第一个可用视图是拓扑:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00286.jpeg
点击节点可以浏览拓扑。如果图形不完全适合,或者您希望看到不同的视角,可以拖动图形到窗口中的其他位置。
-
下一个标签页是概览,它将提供用于创建堆栈的所有信息:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00287.jpeg
概览标签页中提供的堆栈信息如下:
-
信息
-
状态
-
输出
-
堆栈参数
-
启动参数
-
-
资源标签页将显示在堆栈启动过程中创建的所有 HEAT 资源:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00288.jpeg
如果在堆栈启动过程中出现错误,请查看此页面,了解哪个组件的创建失败。
-
事件标签页显示堆栈创建过程中发生的所有事件。此页面在排查 Heat 模板问题时也非常有帮助。https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00289.jpeg
-
模板标签页将显示用于创建堆栈的模板。
-
在您的 Heat 堆栈运行时,您还可以在计算标签页的实例选项中查看它创建了多少实例。这是我们在实例页面上看到的实例:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00290.jpeg
删除堆栈
堆栈删除很简单,但请注意,在删除时,它会删除堆栈启动过程中创建的所有资源。
-
要删除堆栈,首先在堆栈页面查看可用的堆栈:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00291.jpeg
-
选择要删除的堆栈,然后点击 删除堆栈 按钮删除堆栈。系统会要求你确认删除:https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00292.jpeg
-
确认删除后,所有与堆栈相关的资源将被删除。
它是如何工作的……
我们使用 OpenStack 仪表板来启动、查看和删除编排堆栈。我们首先需要从 GitHub 下载一个示例 HAProxy Heat 编排模板(HOT)。由于我们使用了环境文件,我们还需要修改适当的输入。你自己的模板可能有不同的输入。
在启动 HAProxy 堆栈后,我们探索了其拓扑、资源和事件。在堆栈启动过程中创建的资源也会反映在环境的其他部分。如果你正在启动新的实例,所有实例也会在 实例 页面上显示。仅通过 OpenStack 仪表板的编排部分或命令行删除和修改在堆栈启动过程中创建的资源。通过仪表板删除堆栈将删除所有相关资源。
你可能喜欢的另一本书
如果你喜欢这本书,可能会对 Packt 的另一本书感兴趣:
https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00293.jpeg
OpenStack 架构师指南
Michael Solberg, Ben Silverman
ISBN: 978-1-78439-510-0
-
熟悉 OpenStack 的各个组件
-
构建一个日益复杂的 OpenStack 实验室部署
-
为你组织内的架构团队编写有说服力的文档
-
应用敏捷配置管理技术部署 OpenStack
-
将 OpenStack 与你组织的身份管理、供应和计费系统集成
-
为用户配置一个稳健的虚拟环境以进行互动
-
使用企业安全指南进行 OpenStack 部署
-
创建一个能够迅速为平台用户提供功能的产品路线图
留下评论——让其他读者知道你的想法
请通过在购买书籍的网站上留下评论与他人分享你对这本书的看法。如果你是通过亚马逊购买的书籍,请在本书的亚马逊页面上留下诚实的评论。这对其他潜在读者非常重要,他们可以通过你的公正意见做出购买决策,我们也可以了解客户对我们产品的看法,作者们则能看到你对他们与 Packt 合作创作的书籍的反馈。只需要几分钟时间,但对其他潜在客户、我们的作者和 Packt 都非常有价值。谢谢!