Terraform + Ansible实现基础设施及配置管理
前言
在当今时代基础设施自动化非常重要,我们更倾向于软件的部署过程,但是同样基础设施的部署同样重要,基础设施自动化不仅仅能帮助我们快速实现灾难恢复,也使得开发和测试很容易,拥有良好的基础设施自动化,测试环境可以快速实现部署,
一 IaC
让我们首先简要地解释一下代码基础结构(infrastructure-as-code,IaC)的概念。顾名思义,IaC是一个通过在代码中描述来管理基础结构的过程。这意味着,例如,不使用GUI和单使用虚拟机来部署虚拟机,替代使用代码(或者使用这台机器编写的代码),描述使用 IaC 工具执行它启动按钮。比使用一个简单的更费事?一是属性的并提供。会带来更多庸人的工作量,长久但的好处是毋庸置疑的。
假设您需要部署十个虚拟机、三个存储帐户、一个负载均衡器和一个虚拟网络。然后,您需要在该网络上配置路由并格式化磁盘。用户界面中的“只需一次点击”变成了用户界面中数小时的点击和填写表单。现在,想象一下接近结束时出了问题,你需要从头开始。使用 IaC 模型,您可以编写代码来描述所有的基础设施组件,然后将部署留给 Terraform 和 Ansible。如果有什么东西在最后出现问题,你只需要修改几行代码就可以解决这个问题,然后再次运行 Terraform 和 Ansible。
另一个优点是能够使用源代码版本控制系统(如 Git)来存储代码。这样就可以方便地查看基础结构中的所有更改,并使其对所有团队成员可用。
二 Terraform和Ansible
那么,为什么我们既需要 Terraform 又需要 Ansible 呢?好吧,它们各自服务于不同的目的并且相辅相成。Terraform 被设计用于提供不同的基础设施组件。是一个配置管理和应用程序部署工具。这意味着您将首先使用 Terraform 创建一个虚拟机,然后使用 Ansible 在该虚拟机上安装必要的应用程序。但是默认情况下,这两者是独立的工具。为了使它们一起工作,您需要将 terraform 管理的节点与 ansy 控制节点集成。让我们来看看怎么做。
三 Ansible 控制节点与 Terraform 托管实例
当你使用Ansiblle时,你从你的机器(或者安装了安塞波的任何其他机器)上执行剧本。剧本是描述需要在所需机器上完成的操作的清单文件。例如,添加一个新用户,安装 NGINX 服务器,并配置其根文件夹。然后,您还需要创建一个库存,该库存是一个文件,其中包含 Ansible 应该配置的主机列表。Ansible 读取库存文件并通过 SSH 连接到所需的机器,以便安装和配置剧本中指定的任何内容。
Terraform 的工作原理类似。您在计算机上安装 Terraform 并编写 Terraform 清单。当您运行 terraform apply 命令时,它会根据您的清单在云中的某个地方创建基础结构。由于 Terraform 主要用于创建新资源,因此它的清单文件定义了虚拟机的类型以及应该部署多少虚拟机。在 Terraform 完成配置之后,它将所配置的资源的详细信息(例如,已创建虚拟机的 IP 地址)保存回状态文件中。
因此,为了使这两者协同工作,我们需要以某种方式将 Terraform 创建的基础设施信息传递到 Ansible,反之亦然。更具体地说,我们有两个选择: 要么使用 Terraform 的输出作为 Ansible 库存的输入,要么指示 Terraform 执行 Ansible。
四 通过Terraform执行Ansible
让我们从第二个选择开始。要实现这一点,我们可以使用 Terraform 的本地执行者和远程执行者。它们允许您从 Terraform 执行任何命令,可以在运行 Terraform 的计算机上执行,也可以从 Terraform 提供的实例中执行。我们在这里要做的是让 Terraform 创建机器,然后对这些实例运行安塞剧本。为了做到这一点,你需要在 Terraform 中的实例配置部分添加以下代码:
provisioner "local-exec" {command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -u {var.user} -i '${self.ipv4_address},' --private-key ${var.ssh_private_key} playbook.yml"}
这里的关键组件是 ${ self.ipv4 _ address }变量。提供计算机之后,Terraform 知道它的 IP 地址。我们需要为 Ansible 传递一个 IP 地址。因此,我们使用内置的 Terraform 变量作为 Ansible 的输入。
五 通过Ansible Provisioner对于Terraform
遵循同样的思想,你也可以使用这个非官方的可供应地形。它基本上和我们刚才解释的一样: 执行 Terraform 的 Ansible,但是以一种更本地化的方式执行 Terraform。但是,请记住,它并不涵盖所有的用例。
六 使用 Terraform 输出作为 Ansible Inventory
另一个选择是分别运行 Terraform 和 Ansible,但是将数据从一个导入到另一个。Terraform 将有关所供应资源的所有信息保存到 Terraform 状态文件中。我们可以在那里找到 terraform 提供的实例的 IP 地址,并将它们导入到安塞库存文件中。默认情况下,Terraform 将状态文件本地保存为 JSON 文件,这使得解析它并提取必要的 IP 地址变得非常容易。你也可以使用 Terraform Inventory 这样的项目来自动完成:
$ terraform-inventory -inventory terraform.tfstate
[all]
10.10.1.2
10.10.1.3
[vm.0]
10.10.1.2
[vm.1]
10.10.1.3
准备好清单文件后,您可以简单地执行 Ansible playbook 来配置节点。
七 大规模管理基础设施
正如在本文开头所提到的,对于部署虚拟机这样简单的任务来说,IaC 似乎是一个不必要的复杂因素。不过话又说回来,虽然部署一个虚拟机可能会从 web UI 更快,但部署和配置几十个虚拟机肯定不会更快。基础设施越大,IaC 带来的好处就越多。Terraform 和 Ansible 可以大大减少向集群添加新机器所花费的宝贵工程时间。但是,如果没有 Terraform 和 Ansible 的集成,这些也可能是相当耗时的任务。如今,基础设施管理可以像软件配置一样被处理。这意味着使用软件版本控制工具和 CI/CD 管道。你肯定不想在错误的机器上运行一个Ansible Playbook。精心设计的 CI/CD 管道将确保这种情况不会发生。
总结
基础设施配置自动化在许多方面都有所帮助。它允许您在基础结构中保存更改的历史记录(如果使用 Git 存储清单)。从长远来看,它节省了大量时间(创建一个由许多组件组成的全新集群可以像复制粘贴一段代码和更改少数变量的值一样简单)。当然,它可以帮助您避免团队成员几个月前通过 UI 部署了一些资源而不记得使用了什么配置的情况。如果您想了解更多有关 Terraform、 Ansible 和 CI/CD 的信息,可以考虑在 Scale 课程中使用这个部署和自动化基础设施。
参考链接
- 点赞
- 收藏
- 关注作者
评论(0)