Terraform 基础 定义阿里云资源 VPC安全组

Posted 富士康质检员张全蛋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Terraform 基础 定义阿里云资源 VPC安全组相关的知识,希望对你有一定的参考价值。

provider里面提供了资源,接下来就开始定义阿里云的资源了。我们将阿里云的插件也就是provider安装好了,接下来就是调用里面的资源。

在terraform里面最重要的就是资源,资源主要来自provider里面,每个资源里面都有很多属性。

什么是资源呢,比如网络,vpc,安全组,ecs实例以及DNS的域名记录,这些都是资源。

可以理解每个产品都是资源。

既然是要往配置文件里面写资源,那么它也是有它的格式的。

它的关键字是resource,后面就是资源的类型,后面就是自己定义资源的名称,资源的名称是自己定义的,因为我可能创建2个vpc,vpc的名称肯定不能让它一致, 

vpc是阿里云的专有网络,你可以理解为这个就是网段,创建多个vpc,vpc之间是有隔离的逻辑的。比如可以创建测试环境的vpc,也可以创建生产环境的,它其实就是一个网段。

要申请阿里云的资源就需要知道在代码里面怎么写这些资源。如果不了解这些,强烈建议去阿里云的控制台上看看是如何使用的。

可以看到里面有region信息,专有网络的名称,地址段。

除了专有网络之外,这里还有交换机,填写名称和可用区,网段的建议,如下所示。

只要属性上面的界面,然后使用代码的方式来实践。现在就要去tf的配置文件里面写我们申请哪些资源。 

VPC


Example Usage

Basic Usage(声明一个专有网络,专有网络名称和其网段)

resource "alicloud_vpc" "vpc" 
  vpc_name   = "tf_test_foo"
  cidr_block = "172.16.0.0/12"
  • cidr_block - (Optional) The CIDR block for the VPC. The cidr_block is Optional and default value is 172.16.0.0/12 after v1.119.0+.
  • vpc_name - (Optional, Available in v1.119.0+) The name of the VPC. Defaults to null.

你要写资源就需要打开文档了,搜索VPC。

第一个就是关键字+资源类型+自定义资源的名称(这个名称就是对应阿里云控制台创建vpc名称那一栏)网段自己去分配。

注意这里交换机和vpc是一起创建的,你得确定交换机属于哪个vpc里面,属于哪个专有网络。

这里会有绑定的关系。下面就是资源的属性

交换机要关联vpc,怎么关联呢?通过vpc_id这个属性,怎么拿到这个资源的id呢?就需要资源参数的引用,也就是在一个资源里面引用另外一个资源属性或者参数。

这就需要资源类型(alicloud_vpc).name(定义的资源名称 vpc).属性(比如引用实例化之后的id)

在vpc里面没有定义id,因为需要创建完之后才有id,这里引用的是实例化之后的id,如果在路由器里面要使用vpc_name,那么直接可以这样写vpc_id     = alicloud_vpc.vpc.vpc_name

有些参数是创建完之后才可以拿到的。

output "vswitch_id" 
  value = alicloud_vswitch.vsw.id


output "vpc_id" 
  value = alicloud_vpc.vpc.id


Changes to Outputs:
  + vpc_id     = (known after apply)
  + vswitch_id = (known after apply)

ECS安全组


类似于虚拟的防火墙,一般不开安全组,不开端口,那么访问不了。所以需要在安全组里面添加一些规则让ECS去关联。

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

注意安全组也需要关联VPC,所以在创建安全组的代码里面也会引用VPC ID的信息。

最后安全组无非就是开通端口这些(安全组下面有很多的规则,所以安全组和规则是两个资源)

Terraform Registry

安全组组成:安全组+规则   组里面包含一组规则

resource "alicloud_security_group" "group" 
  name   = "new-group"
  vpc_id = alicloud_vpc.vpc.id
  security_group_type = "normal"

 vpc_id = alicloud_vpc.vpc.id 要关联vpc,这是还是要引用其id。

  • security_group_type - (Optional, ForceNew, Available in 1.58.0+) The type of the security group. Valid values: normal: basic security group. enterprise: advanced security group For more information.

 可以看到一个是普通类型,一个是企业类型,这里设置为普通的。

 最后就是创建安全组规则。

这里有个出入方向,得选一个是出方向还是入方向,然后授权是允许还是拒绝。

  • priority - (Optional, ForceNew) Authorization policy priority, with parameter values: 1-100, default value: 1.(优先级怎么设置) 
  • ip_protocol - (Required, ForceNew) The protocol. Can be tcpudpicmpgre or all.( 协议是什么等等这些参数。)
  • port_range - (ForceNew) The range of port numbers relevant to the IP protocol. Default to "-1/-1". When the protocol is tcp or udp, each side port number range from 1 to 65535 and '-1/-1' will be invalid. For example, 1/200 means that the range of the port numbers is 1-200. Other protocols' 'port_range' can only be "-1/-1", and other values will be invalid.(这里开放端口,如果开放一个端口就是80/80,如果是范围就是1-65535
  • security_group_id - (Required, ForceNew) The security group to apply this rule to.( 这个就需要引入安全组的id,security_group_id = alicloud_security_group.group.id,资源类型+名称+资源的属性,这样就可以引用,并且关联上。)
  • nic_type - (Optional, ForceNew) Network type, can be either internet or intranet, the default value is internet.(nic_type          = "intranet" 这个是选择外网还是内网,选择内网)
resource "alicloud_security_group_rule" "allow_all_tcp" 
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "internet"
  policy            = "accept"
  port_range        = "1/65535"
  priority          = 1
  security_group_id = alicloud_security_group.default.id
  cidr_ip           = "0.0.0.0/0"


resource "alicloud_security_group_rule" "allow_80_tcp" 
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "80/80"
  priority          = 1
  security_group_id = alicloud_security_group.group.id
  cidr_ip           = "0.0.0.0/0"

总结


其实你对照控制台上面的字段,就可以看到非常简单,都代码化了。上面全部就是定义阿里云的资源。

依赖关系(交换机依赖于vpc,安全组依赖于vpc,安全组规则依赖于安全组)

Terraform 管理阿里云 VPC

创建阿里云 RAM 子用户,并进行授权

注意,需要将我们生成的 ​​AccessKey​​ 保存至本地

Terraform

Terraform

配置环境变量

​alicloud_authentication​

定义的环境变量必须以 ​​TF_VAR​​ 开头,这样就被 terraform 在读取环境变量时就认为是他自己的环境变量

虽然也可以写在配置文件中明文保存,但是强烈不建议这样用,一旦配置文件泄露,便有非常大的风险。

# 第一种方式,需要去掉 main.tf 中的变量,直接全空即可,此变量是官方默认提供变量,不需要加 TF_VAR
export ALICLOUD_ACCESS_KEY="LTA**************<strong>"
export ALICLOUD_SECRET_KEY="Hp</strong>**************"
export ALICLOUD_REGION="cn-beijing"
# 第二种方式,下边定义阿里云 provider 用的是第二种
export TF_VAR_access_key="LTA**************<strong>"
export TF_VAR_secret_key="Hp</strong>**************"
export TF_VAR_region="cn-beijing"

定义阿里云 provider

​alicloud_docs​

version.tf 定义 terraform 版本信息

# versions.tf 
// 定义 terraform 的 版本信息
terraform
required_version = ">= 1.1.0"
required_providers
alicloud =
source = "aliyun/alicloud"
version = "1.162.0"


variables.tf 定义相关变量

# variables.tf 
// 定义的变量会从环境变量中取值
// 分别对应 ALICLOUD_ACCESS_KEY, ALICLOUD_SECRET_KEY, ALICLOUD_REGION
variable "access_key"
type = string


variable "secret_key"
type = string


variable "region"
type = string

main.tf 定义阿里云登录信息

# main.tf 
// 阿里云登录信息,采用的是环境变量
provider "alicloud"
# Configuration options
access_key = var.access_key
secret_key = var.secret_key
region = var.region

alicloud_vpc.tf 定义 vpc 相关配置

# alicloud_vpc.tf 
// 创建 VPC 专有网络
resource "alicloud_vpc" "vpc"
vpc_name = "tf_test_foo"
cidr_block = "172.96.0.0/12"


// 创建 Vswitch 交换机
resource "alicloud_vswitch" "vsw"
vpc_id = alicloud_vpc.vpc.id
cidr_block = "172.96.0.0/21"
zone_id = "cn-beijing-b"

alicloud_security_group.tf 定义安全组相关配置

# alicloud_security_group.tf 
// 创建 安全组 group
resource "alicloud_security_group" "group"
name = "demo-group"
vpc_id = alicloud_vpc.vpc.id
security_group_type = "normal"


// 定义安全组规则,放开 22 端口
resource "alicloud_security_group_rule" "allow_22_tcp"
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "22/22"
priority = 1
security_group_id = alicloud_security_group.group.id
cidr_ip = "0.0.0.0/0"
# 相关文件的目录结构
.
├── alicloud_security_group.tf
├── alicloud_vpc.tf
├── main.tf
├── variables.tf
└── versions.tf

0 directories, 5 files

fmt 格式化代码

用于格式化代码,增强其可读性

terraform fmt

init 初始化

下载 provider 的相关插件,此命令需要连接 terraform 仓库

terraform init

Terraform

init 的操作会把相关包下载到本地,此步骤时间略长

Terraform

validate 校验

校验配置项中是否有报错的地方

terraform validate -json
# 输出如下结果

"format_version": "1.0",
"valid": true,
"error_count": 0,
"warning_count": 0,
"diagnostics": []

plan 预览

打印所有资源的期望状态

将期望资源的状态与当前工作目录的状态进行对比

打印当前状态与期望状态的差异,并不会实际实行

~# terraform plan


Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# alicloud_security_group.group will be created
+ resource "alicloud_security_group" "group"
+ id = (known after apply)
+ inner_access = (known after apply)
+ inner_access_policy = (known after apply)
+ name = "demo-group"
+ security_group_type = "normal"
+ vpc_id = (known after apply)


# alicloud_security_group_rule.allow_22_tcp will be created
+ resource "alicloud_security_group_rule" "allow_22_tcp"
+ cidr_ip = "0.0.0.0/0"
+ id = (known after apply)
+ ip_protocol = "tcp"
+ nic_type = "internet"
+ policy = "accept"
+ port_range = "22/22"
+ prefix_list_id = (known after apply)
+ priority = 1
+ security_group_id = (known after apply)
+ type = "ingress"


# alicloud_vpc.vpc will be created
+ resource "alicloud_vpc" "vpc"
+ cidr_block = "172.96.0.0/12"
+ id = (known after apply)
+ ipv6_cidr_block = (known after apply)
+ name = (known after apply)
+ resource_group_id = (known after apply)
+ route_table_id = (known after apply)
+ router_id = (known after apply)
+ router_table_id = (known after apply)
+ status = (known after apply)
+ vpc_name = "tf_test_foo"


# alicloud_vswitch.vsw will be created
+ resource "alicloud_vswitch" "vsw"
+ availability_zone = (known after apply)
+ cidr_block = "172.96.0.0/21"
+ id = (known after apply)
+ name = (known after apply)
+ status = (known after apply)
+ vpc_id = (known after apply)
+ vswitch_name = (known after apply)
+ zone_id = "cn-beijing-b"


Plan: 4 to add, 0 to change, 0 to destroy.

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didnt use the -out option to save this plan, so Terraform cant guarantee to take exactly these actions if you run "terraform
apply" now.

apply 创建资源

terraform apply

登录阿里云后进行验证

vpc 验证

Terraform

vswitch 验证

Terraform

安全组验证

Terraform

Terraform

show 查看资源申请情况

~# terraform show
# alicloud_security_group.group:
resource "alicloud_security_group" "group"
id = "sg-2zee17d94vu8k5kx99fz"
inner_access = true
inner_access_policy = "Accept"
name = "demo-group"
security_group_type = "normal"
tags =
vpc_id = "vpc-2zee4goyffxj46uz5j869"


# alicloud_security_group_rule.allow_22_tcp:
resource "alicloud_security_group_rule" "allow_22_tcp"
cidr_ip = "0.0.0.0/0"
id = "sg-2zee17d94vu8k5kx99fz:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "22/22"
priority = 1
security_group_id = "sg-2zee17d94vu8k5kx99fz"
type = "ingress"


# alicloud_vpc.vpc:
resource "alicloud_vpc" "vpc"
cidr_block = "172.96.0.0/12"
id = "vpc-2zee4goyffxj46uz5j869"
name = "tf_test_foo"
resource_group_id = "rg-acfmybfthr6yliq"
route_table_id = "vtb-2zeksbc0su4tecdy7j5er"
router_id = "vrt-2ze1lmeuaf424yol3twki"
router_table_id = "vtb-2zeksbc0su4tecdy7j5er"
secondary_cidr_blocks = []
status = "Available"
user_cidrs = []
vpc_name = "tf_test_foo"


# alicloud_vswitch.vsw:
resource "alicloud_vswitch" "vsw"
availability_zone = "cn-beijing-b"
cidr_block = "172.96.0.0/21"
id = "vsw-2zeqb015cd9hogrp6fa4a"
status

以上是关于Terraform 基础 定义阿里云资源 VPC安全组的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 学习总结—— 基于阿里云平台上的 Terraform 实战

Terraform 学习总结—— 基于阿里云平台上的 Terraform 实战

terraform 阿里云基本使用

阿里云建站基础(vpc)

给阿里云 VPC 中的 Ubuntu ECS 配置自定义 DNS 服务器

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结