工程

对所有操作进行自动化:Terraform + Ansible + Elastic Cloud Enterprise

作为我们首篇博文使用 Ansible 自动安装 Elastic Cloud Enterprise 的续篇,本篇博文会向您展示如何通过 Terraform 来将自动化扩展到云配置方面。在第一篇博文中,我们详细说明了如何使用 Ansible 来跨三个可用区部署和配置 Elastic Cloud Enterprise (ECE)。然而,底层 EC2 实例的配置以及安全群组的配置全要手动完成。

在本篇博文中,我们将会改善所用方法,即借助 Terraform 来自动完成这些 EC2 实例和安全群组的配置。而且,我们还要使用这一方法来自动安装、配置和执行上次所构建的 Ansible Playbook。自动化是好事。

顺便问一下,Terraform 是什么?它与《星际迷航 2》中的创世设备可没有任何关系,虽然我一开始也是这么以为的。按照 HashiCorp(开发人员)的说法,这是一个使用整体配置对基础设施进行构建、更改和版本控制的工具,也就是“基础设施即代码”。这一工具使用很方便,它有很多好处,其中之一就是设置、运行和配置基础设施所需的全部内容都保存在文本文件中,而且您可对这些文本文件进行版本控制并自动完成 CRUD(创建、读取、更新、删除)操作。

尽管本篇博文所关注的云服务提供商是 AWS,但是您使用 Terraform 可在任何云服务提供商平台上配置和管理资源。您可以查看他们的大型云服务提供商列表,以及规模较小的(一眼就可以看出来)云服务提供商列表。我们在 GitHub 上的示例存储库中提供了一个使用 GCP 的示例。

最后一点,和之前一样,本篇博文只是一个简单演示,仅会针对小型的概念验证或开发环境创建一个合适的 ECE 环境。完整的生产部署应当使用实例群组、负载均衡器以及其他高可用性架构,我们在本文的设置中不会涉及这些内容。如需了解生产规划和部署的更多详情,欢迎查看 Elastic Cloud Enterprise 规划文档

我们可以开始了吧?

任务

我们这次还是按照 ECE 文档中的小型基准安装示例来进行操作,但我们的任务却大有不同:

  1. 安装 Terraform
  2. 定义基础设施
  3. 运行
  4. 大功告成

安装 Terraform

要完成这一步,我们需要前往 HashiCorp 的文档。您还需要使用 Ansible,这一工具我们在第一篇博文中已安装过。如果您尚未安装,欢迎查看 Ansible 文档。至于我嘛,我在自己 Macbook Pro 清脆的键盘上使用的是下列命令:

> brew install terraform
> brew install ansible

有很重要的一点需要注意:我所使用的配置与 Terraform 0.12 版本兼容。具体来说,我使用的是 0.12.19。

定义基础设施

此任务中的步骤如下:

  1. 引导您按照我所用的配置完成 Terraform 的配置。
  2. 浏览其中的内容,以大体上有个了解。
  3. 将某些变量设置为您的特有值。

引导您完成 Terraform 的配置

如之前所说,Terraform 能够让您通过配置文件对基础设施进行配置,所以有很多的配置文件。为尽快完成这一步骤,可以复制整个存储库,也可以从 GitHub 上的示例存储库中下载文件。我们的所有操作都是对这些文件进行的。

和之前一样,我的步骤更加符合热衷使用 CLI 的用户(和我一样)的习惯,因为让我写出“在某个位置点击某个按钮”这样的说明简直太难啦!

步骤
  1. 复制或下载示例存储库。
    > git clone https://github.com/elastic/examples.git
    	
  2. 按照您的情况浏览并找到文件的存储位置。
    > cd /workspace/github/elastic/examples
    	
  3. 导航到 ECE AWS Terraform 示例。
    > cd Cloud\ Enterprise/Getting\ Started\ Examples/aws/terraform
    	
  4. 准备进行一些文本编辑工作

浏览并了解各个文件

您现在应该拥有下列文档。如果愿意,可以浏览一下这些文档!

terraform.tfvars.example您首先需要将其重命名为 terraform.tfvars,我们主要在这里设置一些机密内容,并覆盖 variables.tf 中的任何变量(如果希望那么做的话)。
variables.tf各种变量,您可能需要完整了解一下。
provider.tfTerraform 配置,会告诉 Terraform 如何连接至 AWS。
servers.tfTerraform 配置,其能够找到我们所需的 AMI,部署我们的示例,并采集 Ansible 要使用的实例元数据。
networking.tfTerraform 配置,会完成各种各样的 AWS 网络设置:VPC、互联网网关、路由表、子网以及安全群组。
main.tfTerraform 配置,会启动 Ansible 脚本并收集其更为重要的某些输出。
ansible-install.shTerraform 会使用此脚本来进行编辑和调用,从而使用 ECE 角色来配置和运行 Ansible。

设置变量

我们需要设置几个不同变量以便您能够正常运行(我则不需这样了,因为我已经能够正常运行,所以这一部分只是针对您)。

  • 项目名称,在所创建的全部 AWS 资源上都要添加此标签
  • 您的 IP,以便只有您才拥有底层实例的 ssh 访问权限;如果您想让世界都看到,也可以设置为 0.0.0.0/0
  • AWS 访问凭据,以便让 Terraform 可以配置内容

如果您还没有 AWS 访问/机密密钥对,请按照 AWS 文档的说明创建一个

注意:variables.tf 会定义一个公共和私密密钥文件位置,以便在通过 ssh 方式访问 EC2 实例时使用。如果您还没有 ssh 密钥,我建议上网搜索一下。DigitalOcean 针对 Linux/OSXWindows 均提供了很好的基本说明。

步骤
  1. terraform.tfvars.example 重命名为 terraform.tfvars
  2. terraform.tfvars 中,完成下列变更:
    1. 设置一个 project_name,您将需要用该名称来识别所有 AWS 资源。
    2. CIDR 备注中为您的 IP 设置 trusted_network,或者您喜欢的任何范围。
    3. aws_access_keyaws_secret_key 设置为您的信息。
    4. 可选步骤,覆盖 aws_regionpublic_key 和/或 private_key

下面两项设置我希望您不要更改:AMI 和 EC2 实例类型设置。之所以如此建议,有多项原因,但主要是降低入门时的复杂程度。和上次一样,我们的计划是基于一个 CentOS 7 AMI 来部署三个 i3.xlarge 实例。

  • 为确保 Terraform 能够找到正确的 AMI,我们可以向其提供各种元数据。在这个例子中,我使用的是名称模式、所有者 ID(centos.org 的)以及虚拟化类型。名称模式和所有者 ID 在 variables.tf 中均可以配置,但要注意如果选择了其他 AMI(例如使用 Ubantu 的 AMI),您可能需要为 remote_user 设置不同的值。
  • 更改实例类型同样也有细分情况。i3 会使用本地附加型 NVMe 硬盘,此类硬盘在 Terraform 中有特定的 OS 设备名称和配置设置。如果使用其他实例并附加 EBS 卷,则您需要更改 servers.tf 以便正确进行映射。请查看 Terraform 文档了解更多信息。

请查看 variables.tf 以了解我针对 AMI 和 EC2 实例类型所使用的设置。

# AWS Marketplace 中的 AMI 名称
variable "aws_ami_name" {
  default = "CentOS Linux 7 x86_64 HVM*"
}
# AMI 的所有者
variable "aws_ami_owner" {
  default = "679593333241" # centos.org
}
# 用户登录实例并执行安装
# 取决于您所用的 AMI,所以请确保二者之间的一致性。举例说明,Ubuntu AMI 将需要使用 ubuntu 用户
variable "remote_user" {
  default = "centos"
}
# ECE 实例类型
variable "aws_instance_type" {
  default = "i3.xlarge"
}
# 非根卷的设备名称,ECE 会用到该名称
# 对于 i3 实例,此值为 nvme0n1。
# 如果您使用的是其他实例类型,此值可能有变,还可能需要对 servers.tf 中的资源定义进行变更
variable "device_name" {
  default="nvme0n1"
}

运行

我们基本上完成了。很不可思议,对吧?很可能的一种情况是:您使用默认值直接运行,并未花费太长时间钻研所有配置文件;只是安装了 Terraform,复制了一些文件,设置了几个变量,就到了这一步。那么然后呢?然后您只需要正常运行就可以啦!

步骤
  1. 初始化 Terraform。
    > terraform init
    	
  2. 应用我们费了那么大力气构建而成的各项配置。
    > terraform apply
    	

欧耶!好了,就这么简单!

几分钟后,您应该就会看到类似下面的一些输出,告诉您 ECE 管理员控制台的 URL 和管理员密码:

null_resource.run-ansible (local-exec):TASK [ansible-elastic-cloud-enterprise : debug] ********************************
null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => {
null_resource.run-ansible (local-exec):     "msg":"Adminconsole is reachable at: https://ec2-35-175-235-131.compute-1.amazonaws.com:12443"
null_resource.run-ansible (local-exec): }
null_resource.run-ansible (local-exec):TASK [ansible-elastic-cloud-enterprise : debug] ********************************
null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => {
null_resource.run-ansible (local-exec):     "msg":"Adminconsole password is: yI6ClXYNQ5LGiZlBuOm94s8hGV5ispQS24WVfL5fE9q"
null_resource.run-ansible (local-exec): }
null_resource.run-ansible (local-exec):TASK [ansible-elastic-cloud-enterprise : include_tasks] ************************
null_resource.run-ansible (local-exec): skipping: [ec2-52-70-7-3.compute-1.amazonaws.com]
null_resource.run-ansible (local-exec):PLAY RECAP *********************************************************************
null_resource.run-ansible (local-exec): ec2-34-229-205-85.compute-1.amazonaws.com : ok=68   changed=37   unreachable=0    failed=0    skipped=7    rescued=0    ignored=1
null_resource.run-ansible (local-exec): ec2-35-175-235-131.compute-1.amazonaws.com : ok=68   changed=29   unreachable=0    failed=0    skipped=8    rescued=0    ignored=1
null_resource.run-ansible (local-exec): ec2-52-70-7-3.compute-1.amazonaws.com : ok=68   changed=37   unreachable=0    failed=0    skipped=7    rescued=0    ignored=1
null_resource.run-ansible:Creation complete after 16m50s [id=7701810896203834102]
Apply complete!Resources:1 added, 0 changed, 1 destroyed.
Outputs:
ece-instances = [
  [
    "ec2-35-175-235-131.compute-1.amazonaws.com",
    "ec2-34-229-205-85.compute-1.amazonaws.com",
    "ec2-52-70-7-3.compute-1.amazonaws.com",
  ],
]
installed-ece-url = https://ec2-35-175-235-131.compute-1.amazonaws.com:12443

我建议您打开并快速尝试一下。不要害怕!如果弄砸了,只需删除并像下面这样重新创建即可:

> terraform destroy
> terraform apply

注意:TLS 所用的证书是自签署型的,所以当您尝试访问管理员控制台时会在浏览器中收到一条警告。您可以随时将 ECE 配置为使用您自己的证书。有关更多详情,请参阅文档

大功告成

希望您觉得这次所需完成的工作量比上一次大幅减少。我们做到了完全避免使用 AWS 控制台,也无需遵循之前的约 38 个步骤,便成功部署、配置了所有资源并确保了它们的安全(据我算来,这种新方法只有 10 步)。

现在您可以放心大胆地扩展啦,云服务不再庞大,因为您已掌握了强大方法!尝试 ECE 的各种配置,快速部署和升级集群,调整集群规模。尽享轻松,高枕无忧。