Terraform简介

2020-08-15 23:16:53

本周,我探索了Terraform,这是我探索开发和操作主题的一部分。TerraForm是用于在多个提供商之间自动部署基础设施的工具。在这篇博客文章中,我将解释Terraform的基础知识,以及我是如何部署我的第一个配置文件的。

TerraForm允许您构建、更改和版本化基础设施。配置文件描述运行应用程序需要哪些组件。TerraForm生成一个执行计划,描述它将如何达到所需的状态,并执行该计划以构建所需的基础设施。随着配置的更改,Terraform能够确定更改的内容,并创建可以应用的增量执行计划。

TerraForm使用基础设施作为代码。这样做有几个好处。基础架构即代码允许自动部署、一致的环境、可重复的流程、可重用的组件和记录在案的体系结构。

基础设施即代码指的是使用软件配置基础设施。目标是实现一致和可预测的环境。基础设施看起来与配置文件指定的完全相同。基础架构作为代码应该存储在版本化的源代码存储库中。TerraForm是声明性的,因为它具有基于输入实现基础设施的预定义方式。TerraForm是幂等的,因为如果配置不更改并应用,环境中不会发生任何变化。TerraForm是推送模型,因为配置被推送到目标环境。

在本节中,我将通过Ned Belvaance的Terraform:入门课程中部署Terraform配置的示例进行介绍。TerraForm使基础设施自动化。基础设施的自动化和维护建立在几个领域之上。作为最初的例子,我们将重点关注一个领域,即使用Terraform提供资源。

TerraForm由几个组件组成。Terraform可执行文件是用GO编写的,可从Terraform网站下载。配置包含在Terraform文件中。TerraForm将目录中的Terraform文件合并到单个配置中。TerraForm使用插件与提供者交互,并提供来自这些提供者的资源。TerraForm有一个状态文件,其中包含配置的当前状态。更新环境时,Terraform会将新配置与Terraform状态文件进行比较。然后,TerraForm进行更改,使状态与所需的配置相匹配。

要使用AWS等提供商,我们需要凭据登录。TerraForm提供了在变量中存储信息的能力。凭据可以存储在变量中,而不是直接存储在配置文件中。凭据是提供程序的必需属性。使用凭据和区域定义提供程序。

变量";AWS_ACCESS_KEY";{}变量";AWS_SECRET_KEY";{}变量";AWS_REGION";{默认=";us-East-1";}Provider";AWS";{ACCESS_KEY=";var.ACCESS_KEY";SECRET_KEY=";var.SECRET_KEY";Region=";var.aws

我们可以获得有关AWS中存在的资源的信息。我们可以获取有关提供者的信息的数据源。将创建一台服务器来托管称为资源的Web和数据库组件。输出文件给出了Web服务器的公共IP地址。

数据";aws_ami";";alx";{Most_Recent=true Owners=[";Amazon";]筛选器{}}资源";AWS_INSTANCE";";EX";{ami=";data.aws_ami.alx.id";instance_type=";t2.micro";}输出";AWS_PUBLIC_IP"。{value=";aws_instance.ex.public_dns";}。

Terraform配置文件为.tf文件。配置文件是用HashiCorp配置语言(HCL)编写的,HCL是为HashiCorp产品创建的域特定语言。变量首先定义如下:

密钥名称指的是AWS中存在的密钥对,这样一旦创建了该实例,我们就可以通过ssh进入该实例。私钥的路径被指定为与AWS中的密钥对相对应。定义提供者,并将访问密钥、秘密密钥和区域馈送给提供者。

接下来,在配置文件中,我们指定要从提供程序中提取的数据。我们为EC2实例指定使用Amazon Linux,并希望获取与最新版本的Amazon Linux相对应的AMI(Amazon Machine Image)ID。

Data";aws_ami";";aws-linux";{Most_recent=true owner=[";Amazon";]filter{name=";amzn-ami-hvm*";]}filter{name=";root-device-type";value=[";ebs";]}filter{name=";amzn-ami-hvm*";}filter{name=";ebs";]}filter{name=";amzn-ami-hvm*";]}filter{name=";虚拟化类型";值=[";HVM";]}}。

下一部分是资源部分。定义的第一个资源是AWS默认vPC资源。这将使用该区域中的默认VPC。下一个定义的资源是AWS安全组。这允许我们连接到运行nginx的实例。这还会打开端口80以访问将在此实例上运行的Web服务器。AWS安全组引用默认vPC资源。有两个入口规则允许端口22和端口80从外部进入,一个出口规则允许从实例到Internet的流量。

资源";AWS_SECURITY_GROUP";";ALLOW_ssh";{name=";nginx_demo";description=";vpc_id=aws_default_vpc.default.id入口{from_port=22 to_port=22 protocol=";TCP";CIDR_BLOCKS=[";0.0.0.0/0&。]}入口{From_port=80 to_port=80 protocol=";TCP";CIDR_BLOCKS=[";0.0.0.0/0";]}出口{from_port=0 to_port=0 protocol=-1 CIDR_BLOCKS=[";0.0.0.0/0";]}}

然后定义AWS实例。资源类型为AWS_INSTANCE,命名为nginx。将从先前定义的数据源中拉出AMI。连接块允许我们通过ssh进入此资源。置备程序允许我们远程执行内联脚本。

Resource";aws_instance";";nginx";{ami=data.aws_ami.aws-linux.id instance_type=";t2.Micro";key_name=var.key_name vpc_security_group_ids=[AWS_security_group.allow_ssh.id]connection{type=";ssh";host=self.public_ip user=";ec.。PRIVATE_KEY=file(var.private_key_path)}置备程序";remote-exec";{inline=[";sudo yum install nginx-y";,";sudo service nginx start";]}}。

最后一个组件是输出。这指定了配置实例化后我们希望Terraform输出什么。输出值是创建的nginx实例的公共DNS属性。

通过.tfvars文件为变量赋值。在.tfvars文件中,为配置文件中的变量定义值。AWS访问密钥、AWS密钥、密钥名称和私钥路径定义如下:

一旦设置了配置文件和变量值,就可以在Terraform上部署配置。安装并将Terraform放入PATH变量后,使用“terraform”运行Terraform。如果在没有参数的情况下运行Terraform,它将给出一个潜在命令列表。

TerraForm部署遵循一个循环。第一步是安装AWS提供商插件。以下命令通过查看配置文件初始化配置并下载插件。

下一步是从.tfvars文件加载变量。我们需要指定存储计划的文件。TerraForm plan查看现有环境,查看您希望在配置文件中执行的操作,然后计算出需要执行哪些操作才能使实际情况与配置匹配。

这个计划告诉我们它到底要做什么。命令“Apply”用于从计划创建资源。

输出是连接到EC2实例的公共DNS。配置的当前状态存储在状态文件中。状态文件存储在本地。可以在浏览器中使用公共DNS来确认配置是否在Amazon AMI上运行。要在测试配置后销毁配置,我们运行以下命令:

TerraForm是一个自动化基础设施部署的工具。TerraForm使用基础设施作为代码,以实现可重复和一致的部署。TerraForm使用配置文件来定义基础设施部署中使用的Terraform组件。我想感谢Ned Belvaance关于多元视点的Terraform:入门课程,我用它作为这篇博客文章和Terraform的初步探索的基础。