在Linux中使用Terraform
本文为您介绍在Linux中,如何快速使用Terraform创建阿里云资源。
使用Terraform进行基础设施即代码(IaC)管理,包含以下几个主要步骤。
安装Terraform。确保您的系统能够识别并执行Terraform命令。
配置Terraform。使用统一的方式管理Terraform身份认证信息。
编写Terraform配置文件。配置文件是Terraform的核心,用于描述资源的创建、配置和依赖关系,如创建VPC、ECS、OSS等。
初始化与创建资源。将基础设施设计变为现实的关键步骤。
查看和管理资源。在部署后,您也能轻松地管理和维护您的基础设施环境,确保其符合最新的需求和设计。
资源销毁。当不再需要所创建的资源时,可以销毁相应目录下已创建资源。
1. 安装Terraform
Terraform是一款基础设施即代码(IaC)工具,通过执行Terraform命令来创建、管理和版本控制云资源。只有在完成安装后,才能执行Terraform命令,从而实现基础设施部署的自动化。具体安装步骤,请参见Terraform 安装。
2. 配置Terraform
Terraform身份认证是指在通过Terraform操作阿里云基础设施之前,对阿里云Terraform Provider进行身份验证。只有在身份认证成功后,才能与阿里云API进行通信,并创建和管理阿里云的基础设施资源。阿里云Terraform Provider提供多种身份认证方式,有关更多身份认证信息,请参见相关文档Terraform 身份认证。
本文以在环境变量中使用RAM用户AccessKey配置身份认证为例:
export ALICLOUD_ACCESS_KEY="LTAIUrZCw3********"
export ALICLOUD_SECRET_KEY="zfwwWAMWIAiooj14GQ2*************"
export ALICLOUD_REGION="cn-beijing"
3. 编写Terraform配置文件
配置文件是Terraform的核心,用于定义在云端或本地部署的基础设施资源,如RAM、ECS、OSS等。
创建一个新的文件夹,例如命名为ram,并在该文件夹下创建一个Terraform配置文件,例如配置文件名称为main.tf。
# 创建执行目录并进入到执行目录 mkdir ram && cd ram # 创建配置文件并编辑 touch main.tf && vim main.tf
为每个Terraform项目创建独立执行目录可以确保资源组织清晰,避免状态文件混淆,便于版本控制和团队协作,同时有利于实现环境隔离和模块化管理,提高配置管理的可维护性和安全性。
编写Terraform配置文件。本文以创建一个RAM用户,并为该用户赋予管理ECS的权限,为您介绍如何编写配置文件。
所需要的资源如下:
重要建议RAM用户避免同时支持登录控制台操作和使用AccessKey操作,以确保每个RAM用户的职责明确,防止混用。
Resource
说明
创建RAM用户
允许RAM用户登录控制台操作
为RAM用户创建一个AccessKey
创建一个权限策略
为RAM用户增加权限
复制以下示例到main.tf中,然后按
Esc
键退出插入模式,输入:wq
按回车保存文件。variable "user_name" { default = "terraform_user_test" } variable "user_password" { default = "!Test@123456" } variable "user_display_name" { default = "TestAccount" } variable "user_mobile" { default = "86-18688888888" } variable "user_email" { default = "example@example.com" } resource "alicloud_ram_user" "user" { name = var.user_name display_name = var.user_display_name mobile = var.user_mobile email = var.user_email comments = "Terraform create" force = true } resource "alicloud_ram_login_profile" "profile" { user_name = alicloud_ram_user.user.name password = var.user_password } resource "alicloud_ram_access_key" "ak" { user_name = alicloud_ram_user.user.name secret_file = "accesskey.txt" } resource "alicloud_ram_policy" "policy" { policy_name = "tf-example-policy" policy_document = <<EOF { "Statement": [ { "Action": "ecs:*", "Effect": "Allow", "Resource":"*" } ], "Version": "1" } EOF description = "this is a policy test" } resource "alicloud_ram_user_policy_attachment" "attach" { policy_name = alicloud_ram_policy.policy.policy_name policy_type = alicloud_ram_policy.policy.type user_name = alicloud_ram_user.user.name }
4. 初始化与创建资源
Terraform配置文件编写完成后,需要先初始化工作目录,然后再创建资源。
4.1 Terraform初始化
在当前终端中运行terraform init
命令进行初始化。terraform init
命令是使用任何Terraform配置文件之前必须执行的第一个命令,主要目的是初始化一个Terraform工作目录,包括下载必要的阿里云提供商插件以及各种其他记录文件。
当您因网络延迟等原因导致terraform init超时,无法正常下载Provider等情况时,可通过配置阿里云镜像站解决,具体操作步骤,请参见Terraform Init 加速方案配置。
4.2 创建资源
运行
terraform plan
创建一个执行计划,并详细展示了在执行terraform apply
时将创建、修改或销毁的所有资源信息。运行
terraform apply
时,将根据terraform plan
生成的执行计划来创建资源。在创建过程中,需要按照提示输入yes,以继续创建资源。关于变量如何传值,请参见Variable 介绍中的变量设置方式。
5. 查看和管理资源
在部署后,您也能轻松地管理和维护您的基础设施环境,确保其符合最新的需求和设计。
5.1 查看资源
通过
terraform show
命令查看资源的详细信息。通过
terraform state list
命令列出所有已创建的资源。通过
terraform state show <资源类型>.<资源名称>
查看某个资源的详细信息。通过阿里云控制台查看已创建资源信息。
5.2 管理资源
Terraform在完成资源的创建和修改后,会将资源的状态和属性信息保存在terraform.tfstate文件中。我们可以使用terraform state
相关命令对state进行管理。更多信息,请参见Terraform State 介绍。
5.3 资源变更
修改配置文件(如main.tf)中需要变更的资源定义,例如您希望收缩RAM用户的权限,只允许用户具有云服务器ECS查询权限。
运行命令
vim main.tf
,然后按i键进入编辑状态。复制以下代码,并将其替换到main.tf文件中对应的alicloud_ram_policy部分。
resource "alicloud_ram_policy" "policy" { policy_name = "tf-example-policy" policy_document = <<EOF { "Statement": [ { "Action": [ "ecs:Get*", "ecs:List*", "ecs:Describe*" ], "Effect": "Allow", "Resource":"*" } ], "Version": "1" } EOF description = "this is a policy test" }
按下Esc,输入:wq保存。
运行
terraform plan
命令预览所做的变更。如果变更符合预期,运行
terraform apply
命令,以将这些变更应用于您的基础设施。运行此命令时,Terraform会要求您确认是否确实要进行这些变更,输入yes
并回车后,变更会被应用。
6. 资源销毁
当不再需要所创建的资源时,可以通过terraform destroy
命令销毁所有已创建的资源。
针对创建的权限策略进行资源销毁时,当权限策略存在多个版本时,Terraform destroy无法直接销毁资源。您可以在alicloud_ram_policy中添加force
参数,并将其值设置为true
,以表示强制删除所有版本的权限。若该权限被其他RAM用户或RAM角色引用,会自动解除关联关系后执行删除,请谨慎使用force属性。
完整示例
为了便于您快速体验 Terraform,本文提供了完整的 Terraform 代码,您可以一键复制后直接运行。
variable "user_name" {
default = "terraform_user_test"
}
variable "user_password" {
default = "!Test@123456"
}
variable "user_display_name" {
default = "TestAccount"
}
variable "user_mobile" {
default = "86-18688888888"
}
variable "user_email" {
default = "example@example.com"
}
resource "alicloud_ram_user" "user" {
name = var.user_name
display_name = var.user_display_name
mobile = var.user_mobile
email = var.user_email
comments = "Terraform create"
force = true
}
resource "alicloud_ram_login_profile" "profile" {
user_name = alicloud_ram_user.user.name
password = var.user_password
}
resource "alicloud_ram_access_key" "ak" {
user_name = alicloud_ram_user.user.name
secret_file = "accesskey.txt"
}
resource "alicloud_ram_policy" "policy" {
policy_name = "tf-example-policy"
policy_document = <<EOF
{
"Statement": [
{
"Action": "ecs:*",
"Effect": "Allow",
"Resource":"*"
}
],
"Version": "1"
}
EOF
description = "this is a policy test"
}
resource "alicloud_ram_user_policy_attachment" "attach" {
policy_name = alicloud_ram_policy.policy.policy_name
policy_type = alicloud_ram_policy.policy.type
user_name = alicloud_ram_user.user.name
}