背景
基础设施代码(IAC)允许你通过配置文件而不是通过图形界面来管理基础设施。Terraform使用可读性的声明性配置文件中定义资源和基础设施。Terraform将资源元数据存储在一个状态state文件中,可以使用该状态文件更新和删除这些资源,并保证资源部署一致性(幂等性)。Terraform是一个与云无关的工具,它可以跨多个云提供商共同使用。
需求
公司的数据分析SaaS服务部署在多个region,服务不同地域客户, 因此需要有多region环境基础设施的支持。此外,DevOps团队也确保基于开发/QA/生产等环境实现应用程序分离。
因此,本文我们将讨论如何使用terrform管理多个环境。
方案
当Terraform部署资源时,它将元数据存储在状态文件中以跟踪资源。因此,如果我们希望为多个环境(如DEV/QA/PROD)部署资源,我们还需要区分部署操作和状态文件。然而,通过terrform工作区Workspace和Reusable Modules (可重用模块)体系结构,我们可以实现单独的环境供应。
- Terraform Workspace——Terraform Workspace允许我们从单个配置文件源为所提供的后端中每个工作区管理单独的状态文件
- Reusable Modules ——在这种体系结构中,配置文件存储在单个目录中。通过共有模块,我们可以查找到对应目录并传递变量。
案例
公司使用Terraform在多个环境(INT,Staging, Prod)上部署Elastic Cloud,用作系统及客户日志存储分析等 。结合 Terraform Workspace 我们可以实现在不同环境中使用同个Terraform Module 来动态部署资源。例如,在INT环境中部署的 ES 节点使用更小的内存,分布在较少的Zone(以节省开支), 而在Prod环境中需要启用更多的节点,来提高ES性能以及大量数据存储。
具体实现
整体目录结构
-- terraform
| |-- envs
| | |-- us-production
| |-- staging
| |-- qa
| |-- dev
| |-- modules
| | |-- ec_deployment
| |-- ec_backup
| |-