作为我们首篇博文使用 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 文档中的小型基准安装示例来进行操作,但我们的任务却大有不同:
- 安装 Terraform
- 定义基础设施
- 运行
- 大功告成
安装 Terraform
要完成这一步,我们需要前往 HashiCorp 的文档。您还需要使用 Ansible,这一工具我们在第一篇博文中已安装过。如果您尚未安装,欢迎查看 Ansible 文档。至于我嘛,我在自己 Macbook Pro 清脆的键盘上使用的是下列命令:
> brew install terraform > brew install ansible
有很重要的一点需要注意:我所使用的配置与 Terraform 0.12 版本兼容。具体来说,我使用的是 0.12.19。
定义基础设施
此任务中的步骤如下:
- 引导您按照我所用的配置完成 Terraform 的配置。
- 浏览其中的内容,以大体上有个了解。
- 将某些变量设置为您的特有值。
引导您完成 Terraform 的配置
如之前所说,Terraform 能够让您通过配置文件对基础设施进行配置,所以有很多的配置文件。为尽快完成这一步骤,可以复制整个存储库,也可以从 GitHub 上的示例存储库中下载文件。我们的所有操作都是对这些文件进行的。
和之前一样,我的步骤更加符合热衷使用 CLI 的用户(和我一样)的习惯,因为让我写出“在某个位置点击某个按钮”这样的说明简直太难啦!
步骤
- 复制或下载示例存储库。
> git clone https://github.com/elastic/examples.git
- 按照您的情况浏览并找到文件的存储位置。
> cd /workspace/github/elastic/examples
- 导航到 ECE AWS Terraform 示例。
> cd Cloud\ Enterprise/Getting\ Started\ Examples/aws/terraform
- 准备进行一些文本编辑工作。
浏览并了解各个文件
您现在应该拥有下列文档。如果愿意,可以浏览一下这些文档!
terraform.tfvars.example | 您首先需要将其重命名为 terraform.tfvars ,我们主要在这里设置一些机密内容,并覆盖 variables.tf 中的任何变量(如果希望那么做的话)。
|
variables.tf | 各种变量,您可能需要完整了解一下。 |
provider.tf | Terraform 配置,会告诉 Terraform 如何连接至 AWS。 |
servers.tf | Terraform 配置,其能够找到我们所需的 AMI,部署我们的示例,并采集 Ansible 要使用的实例元数据。 |
networking.tf | Terraform 配置,会完成各种各样的 AWS 网络设置:VPC、互联网网关、路由表、子网以及安全群组。 |
main.tf | Terraform 配置,会启动 Ansible 脚本并收集其更为重要的某些输出。 |
ansible-install.sh | Terraform 会使用此脚本来进行编辑和调用,从而使用 ECE 角色来配置和运行 Ansible。 |
设置变量
我们需要设置几个不同变量以便您能够正常运行(我则不需这样了,因为我已经能够正常运行,所以这一部分只是针对您)。
- 项目名称,在所创建的全部 AWS 资源上都要添加此标签
- 您的 IP,以便只有您才拥有底层实例的 ssh 访问权限;如果您想让世界都看到,也可以设置为
0.0.0.0/0
- AWS 访问凭据,以便让 Terraform 可以配置内容
如果您还没有 AWS 访问/机密密钥对,请按照 AWS 文档的说明创建一个。
注意:variables.tf
会定义一个公共和私密密钥文件位置,以便在通过 ssh 方式访问 EC2 实例时使用。如果您还没有 ssh 密钥,我建议上网搜索一下。DigitalOcean 针对 Linux/OSX 和 Windows 均提供了很好的基本说明。
步骤
- 将
terraform.tfvars.example
重命名为terraform.tfvars
。 - 在
terraform.tfvars
中,完成下列变更:- 设置一个
project_name
,您将需要用该名称来识别所有 AWS 资源。 - 在 CIDR 备注中为您的 IP 设置
trusted_network
,或者您喜欢的任何范围。 - 将
aws_access_key
和aws_secret_key
设置为您的信息。 - 可选步骤,覆盖
aws_region
、public_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,复制了一些文件,设置了几个变量,就到了这一步。那么然后呢?然后您只需要正常运行就可以啦!
步骤
- 初始化 Terraform。
> terraform init
- 应用我们费了那么大力气构建而成的各项配置。
> 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 的各种配置,快速部署和升级集群,调整集群规模。尽享轻松,高枕无忧。