Terraform参考
Terraform是一个开源的基础设施即代码工具,允许开发人员通过声明式的语言来定义和管理基础设施的配置,提供了一种简洁的方式来创建、修改或删除ECS资源,减少手动操作的繁琐和错误,提高基础设施的可管理性和可维护性。本文为您介绍如何安装与配置Terraform、使用Terraform创建ECS实例。
Terraform基本功能
Terraform是IT基础架构自动化编排工具,可以用代码来管理维护IT资源。更多信息,请参见Terraform产品介绍。
Terraform的命令行接口CLI(Command Line Interface)提供一种简单机制,用于将配置文件部署到阿里云或其他任意支持的云上,并对其进行版本控制。它编写了描述云资源拓扑的配置文件中的基础结构,例如虚拟机、存储账户和网络接口。
Terraform通过Provider支持新的基础架构,让您在阿里云上能够轻松使用简单模板语言来定义、预览和部署云基础结构。
Terraform可以创建、修改和删除多种阿里云产品的相关资源。
关于阿里云与Terraform集成的更多信息,请参见Alibaba Cloud Provider。
Terraform安装
CloudShell
阿里云Cloud Shell是一款帮助您运维的免费产品,预装了Terraform的组件,您可直接在Cloud Shell中运行Terraform的命令。
首先,确保您有一个合法的、有相关权限的阿里云账号。
其次,打开浏览器,访问Cloud Shell的地址https://shell.aliyun.com。
登录成功后,执行如下指令
terraform
您将看到,Terraform组件已经内置在CloudShell中,并且可以直接使用。
更多Cloud Shell使用方式,请参见使用云命令行。
手动安装
使用预编译包
登录Terraform官网,找到对应操作系统的zip包,并下载。
在下载完成后,请将程序包解压到/usr/local/bin。其余文件在复制完成后均可删除,这并不会影响Terraform正常运行。
最后,请确保Terraform目录在PATH变量中已完成定义,不同操作系统会有所不同。
Windows
进入控制面板 -> 系统 -> 系统设置 -> 环境变量。
在系统变量中向下滚动,直到找到 PATH。
单击编辑并进行相应更改。
请务必在前一个末尾添加分号,因为这是分隔符,即 c:\path;c:\path2
启动新控制台以使设置生效。
更多信息参见:在Windows系统定义全局路径。
Mac或Linux
打印您的PATH配置
echo $PATH
将Terraform二进制文件移动到列出的位置之一。此命令假定二进制文件当前位于您的Downloads文件夹中并且您的PATH
包含/usr/local/bin
,但如果您的位置不同,您可以自定义命令中的目录。
mv ~/Downloads/terraform /usr/local/bin/
更多信息参见:
使用源
如果您期望从源代码编译二进制文件,可以克隆HashiCorp Terraform代码库
git clone https://github.com/hashicorp/terraform.git
您将会看到如下进度提示信息,并等待其执行完成。
执行完成后,您执行命令的目录下会新增一个terraform名称的目录。通过cd指令进入该目录。
cd terraform
然后,执行install 指令,这将会编译目录并将编译后的包移动到$GOPATH/bin/terraform目录中
go install
当您看到如下提示信息,则说明正在编译中。等待完成后即可进行下一步操作。
注意:如果提示zsh: command not found: go,则您需要先安装go的环境。
最终,确保terraform目录在PATH中定义并可用。 PATH定义取决于您所使用的操作系统。
Mac或Linux
打印您的PATH配置
echo $PATH
将 Terraform 二进制文件移动到列出的位置之一。此命令假定二进制文件当前位于您的Downloads文件夹中并且您的PATH
包含/usr/local/bin
,但如果您的位置不同,您可以自定义命令中的目录。
mv ~/Downloads/terraform /usr/local/bin/
更多信息参见:
Windows
进入控制面板 -> 系统 -> 系统设置 -> 环境变量。
在系统变量中向下滚动,直到找到 PATH。
单击编辑并进行相应更改。
请务必在前一个末尾添加分号,如:c:\path;c:\path2
启动新控制台以使设置生效。
更多信息参见:在Windows系统定义全局路径。
macOS Homebrew
Homebrew 是一款在Mac系统上经常使用的包安装工具。借助Homebrew可以通过简单的指令安装Terraform。
第一步,安装HashiCorp的tap,用来定义包在Homebrew的位置。
brew tap hashicorp/tap
第二步,执行安装指令,安装Terraform
brew install hashicorp/tap/terraform
安装指令将索引最新的版本并进行安装,如果在安装一段时间后希望更新到最新版本。可以通过重新执行upgrade指令进行。
更新最新版本的Terraform,首先需要更新Homebrew。
brew update
然后,运行upgrade指令更新到最新版本。
brew upgrade hashicorp/tap/terraform
Linux
Alibaba Cloud Liunx
yum install -y dnf-plugin-releasever-adapter
yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
yum install terraform
Windows Chocolatey
Chocolatey是一款在Mac系统上经常使用的包安装工具。借助Chocolatey可以通过简单的指令安装Terraform。
choco install terraform
Terraform 身份认证
基于环境变量配置身份认证是将访问凭证保存在特定的环境变量中,当执行Terraform命令时,如果配置模板中没有显式声明访问凭证,那么将尝试从如下的环境变量中获取。具体环境变量的设置方式如下:
Windows
在桌面右键单击此电脑,选择
。在系统变量/用户变量中,单击新建,创建以下环境变量。
变量名
变量描述
变量值
ALICLOUD_ACCESS_KEY
Access Key Id
示例:LTAIUrZCw3********
ALICLOUD_SECRET_KEY
Access Key Secret
示例:zfwwWAMWIAiooj14GQ2*************
ALICLOUD_SECURITY_TOKEN(可选)
如果是 STS 的访问凭证,此处需要配置Security Token
示例:sts.fr2nlrnlwnelr3*******
Linux
使用export命令配置的临时环境变量仅对当前会话有效,当会话退出之后所设置的环境变量将会丢失。如需长期保留环境变量,可将export命令配置到操作系统的启动配置文件中。
# Access Key Id
$ export ALICLOUD_ACCESS_KEY="<你的 Access Key ID>"
# Access Key Secret
$ export ALICLOUD_SECRET_KEY="<你的 Access Key Secret>"
# 如果是 STS 的访问凭证,此处需要配置 security_token
$ export ALICLOUD_SECURITY_TOKEN="<你的访问 Token>"
设置了环境变量之后,provider块可以不在配置模板中显式声明或者只声明地域信息:
provider "alicloud" {
region = "cn-hangzhou"
}
当然,region也是支持通过环境变量 ALICLOUD_REGION
进行配置的。如果 region 没有显式声明也没有配置环境变量,cn-beijing 将是其默认配置值。
支持的资源列表
Resource:资源,指新创建的资源,用于定义基础设施组件,例如一个ECS实例、一个虚拟机、一个网络安全组等。
使用Terraform创建并管理ECS
下文以创建ECS为例,介绍如何使用Terraform创建并管理ECS资源。
创建一个工作目录,并在该工作目录中创建名为main.tf的配置文件。以下代码将创建一个ECS实例,以及创建ECS实例所需的VPC、安全组与交换机资源。将以下代码复制到main.tf中。
# 定义一个变量region,默认值为"cn-beijing",用于指定阿里云区域 variable "region"{ default = "cn-beijing" } # 配置阿里云provider,使用变量region中定义的区域 provider "alicloud"{ region = var.region } # 定义一个字符串类型的变量instance_type,默认值为"ecs.e-c1m1.large",用于指定ECS实例类型 variable "instance_type" { type = string default = "ecs.e-c1m1.large" } # 使用数据源查询可用区信息,通过指定的实例类型、资源创建类型(如VSwitch)以及磁盘种类来过滤结果 data "alicloud_zones" "default" { available_instance_type = var.instance_type available_resource_creation = "VSwitch" available_disk_category = "cloud_essd" } # 定义一个变量vpc_cidr_block,默认值为"172.16.0.0/16",用于指定VPC的CIDR块 variable "vpc_cidr_block" { default = "172.16.0.0/16" } # 定义一个变量vsw_cidr_block,默认值为"172.16.0.0/24",用于指定VSwitch的CIDR块 variable "vsw_cidr_block" { default = "172.16.0.0/24" } # 生成一个介于10000到99999之间的随机整数,用于确保某些资源名称的唯一性 resource "random_integer" "default" { min = 10000 max = 99999 } # 创建名为vpc-test的VPC,并使用随机整数确保名称唯一性 resource "alicloud_vpc" "vpc" { vpc_name = "vpc-test_${random_integer.default.result}" cidr_block = var.vpc_cidr_block } # 创建安全组,名称包含随机整数以保证唯一性,并关联至上述VPC resource "alicloud_security_group" "group" { security_group_name = "test_${random_integer.default.result}" # 替换了这里的字段名 vpc_id = alicloud_vpc.vpc.id } # 创建一条允许所有TCP流量进入的安全组规则,与之前创建的安全组关联 resource "alicloud_security_group_rule" "allow_all_tcp" { type = "ingress" ip_protocol = "tcp" nic_type = "intranet" # 修改了这里,将nic_type改为'intranet' policy = "accept" port_range = "1/65535" priority = 1 security_group_id = alicloud_security_group.group.id cidr_ip = "0.0.0.0/0" } # 创建VSwitch,名称中包含随机整数以确保唯一性,并与VPC、可用区关联 resource "alicloud_vswitch" "vswitch" { vpc_id = alicloud_vpc.vpc.id cidr_block = var.vsw_cidr_block zone_id = data.alicloud_zones.default.zones[0].id vswitch_name = "vswitch-test-${random_integer.default.result}" } # 创建ECS实例,设置多个参数如可用区、安全组、实例类型等,并使用随机整数保证实例名称的唯一性 resource "alicloud_instance" "instance" { availability_zone = data.alicloud_zones.default.zones[0].id security_groups = [alicloud_security_group.group.id] instance_type = var.instance_type system_disk_category = "cloud_essd" system_disk_name = "test_foo_system_disk_${random_integer.default.result}" system_disk_description = "test_foo_system_disk_description" image_id = "aliyun_2_1903_x64_20G_alibase_20240628.vhd" instance_name = "test_ecs_${random_integer.default.result}" vswitch_id = alicloud_vswitch.vswitch.id internet_max_bandwidth_out = 10 password = "Terraform@Example" # 用户根据自己实际情况修改 }
执行如下命令,初始化Terraform运行环境。
terraform init
返回信息如下,则Terraform初始化成功。
Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
执行如下命令,开始执行代码。
terraform apply
在执行过程中,根据提示输入
yes
并按下Enter键,等待命令执行完成,若出现以下信息,则表示代码执行成功。You can apply this plan to save these new output values to the Terraform state, without changing any real infrastructure. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
结果验证
执行terraform show命令
您可以在工作目录中,使用以下命令查询Terraform已创建资源的详细信息:
terraform show
登录控制台查看
登录云服务器管理控制台,进入 页面,左上角选择地区,此例中选择华北2(北京),查看已创建的ECS实例。
相关文档
更多实践教程,请参见Terraform的教程。
更多Terraform的常用命令,请参见Terraform常用命令。
当您遇到由于网络延迟等原因造成的 terraform init 超时,导致无法正常下载 Provider 等情况时,请参见Terraform Init 加速方案配置。
ROS提供了Terraform托管服务,因此您可以直接在ROS控制台部署Terraform模板。详细操作,请参见创建Terraform类型资源栈。