在Linux中使用Terraform

更新时间:

本文为您介绍在Linux中,如何快速使用Terraform创建阿里云资源。

使用Terraform进行基础设施即代码(IaC)管理,包含以下几个主要步骤。

  1. 安装Terraform。确保您的系统能够识别并执行Terraform命令。

  2. 配置Terraform。使用统一的方式管理Terraform身份认证信息。

  3. 编写Terraform配置文件。配置文件是Terraform的核心,用于描述资源的创建、配置和依赖关系,如创建VPC、ECS、OSS等。

  4. 初始化与创建资源。将基础设施设计变为现实的关键步骤。

  5. 查看和管理资源。在部署后,您也能轻松地管理和维护您的基础设施环境,确保其符合最新的需求和设计。

  6. 资源销毁。当不再需要所创建的资源时,可以销毁相应目录下已创建资源。

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等。

  1. 创建一个新的文件夹,例如命名为ram,并在该文件夹下创建一个Terraform配置文件,例如配置文件名称为main.tf

    # 创建执行目录并进入到执行目录
    mkdir ram && cd ram
    # 创建配置文件并编辑
    touch main.tf && vim main.tf
    

    为每个Terraform项目创建独立执行目录可以确保资源组织清晰,避免状态文件混淆,便于版本控制和团队协作,同时有利于实现环境隔离和模块化管理,提高配置管理的可维护性和安全性。

  2. 编写Terraform配置文件。本文以创建一个RAM用户,并为该用户赋予管理ECS的权限,为您介绍如何编写配置文件。

    所需要的资源如下:

    重要

    建议RAM用户避免同时支持登录控制台操作和使用AccessKey操作,以确保每个RAM用户的职责明确,防止混用。

    Resource

    说明

    alicloud_ram_user

    创建RAM用户

    alicloud_ram_login_profile

    允许RAM用户登录控制台操作

    alicloud_ram_access_key

    为RAM用户创建一个AccessKey

    alicloud_ram_policy

    创建一个权限策略

    alicloud_ram_user_policy_attachment

    为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 创建资源

  1. 运行terraform plan创建一个执行计划,并详细展示了在执行terraform apply时将创建、修改或销毁的所有资源信息。

    image

  2. 运行terraform apply时,将根据terraform plan生成的执行计划来创建资源。在创建过程中,需要按照提示输入yes,以继续创建资源。关于变量如何传值,请参见Variable 介绍中的变量设置方式。image

5. 查看和管理资源

在部署后,您也能轻松地管理和维护您的基础设施环境,确保其符合最新的需求和设计。

5.1 查看资源

  1. 通过terraform show命令查看资源的详细信息。

    image

  2. 通过terraform state list命令列出所有已创建的资源。

    image

  3. 通过terraform state show <资源类型>.<资源名称>查看某个资源的详细信息。

    image

  4. 通过阿里云控制台查看已创建资源信息。

5.2 管理资源

Terraform在完成资源的创建和修改后,会将资源的状态和属性信息保存在terraform.tfstate文件中。我们可以使用terraform state相关命令对state进行管理。更多信息,请参见Terraform State 介绍

5.3 资源变更

  1. 修改配置文件(如main.tf)中需要变更的资源定义,例如您希望收缩RAM用户的权限,只允许用户具有云服务器ECS查询权限。

    1. 运行命令vim main.tf,然后按i键进入编辑状态。

    2. 复制以下代码,并将其替换到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"
      }
    3. 按下Esc,输入:wq保存。

  2. 运行terraform plan命令预览所做的变更。

    image

  3. 如果变更符合预期,运行terraform apply命令,以将这些变更应用于您的基础设施。运行此命令时,Terraform会要求您确认是否确实要进行这些变更,输入 yes 并回车后,变更会被应用。image

6. 资源销毁

当不再需要所创建的资源时,可以通过terraform destroy命令销毁所有已创建的资源。

重要

针对创建的权限策略进行资源销毁时,当权限策略存在多个版本时,Terraform destroy无法直接销毁资源。您可以在alicloud_ram_policy中添加force参数,并将其值设置为true,以表示强制删除所有版本的权限。若该权限被其他RAM用户或RAM角色引用,会自动解除关联关系后执行删除,请谨慎使用force属性。

image

完整示例

为了便于您快速体验 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
}

相关文档