terraform基础

介绍

技术 特性 适用场景 说明
terraform - 将基础架构部署到多个云
- 自动化管理基础架构
- 基础架构即代码
- 执行计划
- 资源图
- 自动化变更
- 降低开发成本
- 管理混合云
- 创建、修改、删除ECS、VPC、RDS、SLB等多种资源
- 官网
- Github
- 下载
- Learn
- Docs
- Getting Started with Kubernetes provider
- Builders
- 中文文档
Sentinel Simulator 开发测试 - 下载

基本概念

概念 场景 说明
Packer - 超快速的基础架构部署(几秒钟内)
- 多供应商的可移植性
- 提高软件稳定性
- 提高可测试性
- 下载
Terraform Cloud -
Module -
Policy -
Plan -
Provider -
Registry -
Sentinel -
Speculative Plan -
State -
State Version -
Variables -
Webhook -
Working Directory -
Workspace -

terraform

Mac 安装 terraform

1
$ brew install terraform

Linux 安装 terraform

1
2
3
4
5
6
7
8
9
$ cd /usr/local
$ wget https://releases.hashicorp.com/terraform/0.12.9/terraform_0.12.9_linux_amd64.zip
$ unzip terraform_0.12.9_linux_amd64.zip
$ vim /etc/profile
##### 增加如下内容 #####
export PATH="$PATH:/usr/local"
##### 内容结束 #####
$ source /etc/profile
$ terraform version

Terraform 工作目录中的文件命名

文件名 说明
provider.tf provider 配置
terraform.tfvars 配置 provider 要用到的变量
varable.tf 通用变量
resource.tf 资源定义
data.tf 包文件定义
output.tf 输出

terraform 基础命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 创建配置文件
$ mkdir terraform
$ cd terraform
$ touch provider.tf && touch terraform.tfvars && touch varable.tf && touch resource.tf && touch data.tf && touch output.tf
# 验证*.tf目录中是否没有其他文件,因为Terraform会加载所有文件。

# 初始化工作目录
$ terraform init
$ terraform init -input=false

# 创建执行计划
$ terraform plan
# 创建一个计划并将其保存到本地文件中tfplan
$ terraform plan -out=tfplan -input=false

# 检查当前状态
$ terraform show

# 应用执行计划
$ terraform apply
# 应用存储在文件中的计划tfplan
$ terraform apply -input=false tfplan
# 应用计划自动批准
$ terraform apply -input=false -auto-approve

# 释放资源
$ terraform destroy

# 多环境部署
$ terraform workspace select QA

在执行像 terraform plan 或 terraform apply 等命令的时候,可以按下 ctrl + c 让控制台输出详细的日志信息。

配置环境变量

配置bash

1
2
3
4
5
6
7
$ vim /etc/bashrc
##### 增加如下内容 #####
export ALICLOUD_ACCESS_KEY="LTAI4FgTbvob******"
export ALICLOUD_SECRET_KEY="ZOp5yN7EEgtEAfEoIs1********"
export ALICLOUD_REGION="cn-beijing"
##### 内容结束 #####
$ source /etc/bashrc

配置zsh

1
2
3
4
5
6
7
$ vim ~/.zshrc
##### 增加如下内容 #####
export ALICLOUD_ACCESS_KEY="LTAI4FgTbvob******"
export ALICLOUD_SECRET_KEY="ZOp5yN7EEgtEAfEoIs1********"
export ALICLOUD_REGION="cn-beijing"
##### 内容结束 #####
$ source ~/.zshrc

Packer

Mac 中安装 Packer

1
2
$ brew install packer
$ packer version

Windows 中安装 Packer

1
$ choco install packer

Packer 基础命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 从模板构建镜像
$ packer build

# 从旧版本的 packer 修复模板
$ packer fix

# 查看模板的组件
$ packer inspect

# 验证模板
$ packer validate

# 查看 packer 的版本
$ packer version

Sentinel Simulator

MacOS 中安装 Sentinel Simulator

1
2
3
$ wget https://releases.hashicorp.com/sentinel/0.11.0/sentinel_0.11.0_darwin_amd64.zip
$ unzip sentinel_0.11.0_darwin_amd64.zip
$ mv sentinel /usr/local/bin

Sentinel Simulator 基础命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看版本
$ sentinel version

# 在POLICY指定的路径上执行策略文件。
# 0:通过
# 1:失败
# 2:未定义(失败,但由于结果未定义)
# 3:运行时错误
# 9:与策略状态本身无关的错误
# -trace:使模拟器打印出完整的跟踪信息
$ sentinel apply
$ sentinel apply policy.sentinel

# 将所有指定的策略文件格式化为规范格式
$ sentinel fmt

# 针对Sentinel测试框架运行策略
$ sentinel test

provider

说明
terraform-provider-alicloud - 阿里云官方文档
- 阿里云官方模块

安装 terraform-provider-alicloud

1
2
3
4
5
6
7
8
9
$ mkdir -p $GOPATH/src/github.com/terraform-providers;
$ cd $GOPATH/src/github.com/terraform-providers
$ git clone https://github.com/terraform-providers/terraform-provider-alicloud.git
$ cd $GOPATH/src/github.com/terraform-providers/terraform-provider-alicloud
$ make build
# 测试提供程序
$ make test
# 验收测试(验收测试会创建真实的资源,并且通常会花钱运行)
$ make testacc

Builder

AliCloud ECS

参数 是否必填 说明
access_key Alicloud访问密钥。
image_name 用户自定义镜像的名称。
- [2,128]英文或中文字符。
- 必须以大写/小写字母或汉字开头,并且可以包含数字_或-。
- 不能以http://或开头https://。
instance_type 实例的类型。
参见 实例类型表
region Alicloud region。
secret_key Alicloud secret key。
source_image 创建自定义镜像的源镜像。
force_stop_instance 是否在设备重新启动时强制关机。默认值为false。
如果设置为false,则系统正常关闭。如果将其设置为 true,则系统将被强制关闭。
disable_stop_instance 如果此选项设置为true,则Packer不会为您停止实例,并且您需要确保在最终的Provisioner命令中停止实例。否则,Packer将在等待实例停止时超时。为您要自己停止实例的某些特定情况提供了此选项。例如,Sysprep一个可能会在其命令内关闭实例的窗口。默认值为false。
image_copy_names 目标镜像的名称。
- [2,128]英文或中文字符。
- 必须以大写/小写字母或汉字开头,并且可以包含数字_或-。
- 不能以http://或开头https://。
image_copy_regions 复制到目标regionIds。
image_encrypted 是否image_copy_regions指定要加密的目标图像,包括已复制的图像。如果将此选项设置为true,则将从在主区域中配置的实例中创建一个临时映像,并在同一区域中生成一个加密的副本。默认情况下,Packer会将加密设置保持为源映像中的设置。
image_description 镜像描述。
system_disk_mapping 系统磁盘的映像磁盘映射。
disk_category 系统磁盘的类别。可选值是:
- cloud -通用云盘
- cloud_efficiency -效率云盘
- cloud_ssd -云固态硬盘
对于逐步淘汰的实例类型和未经I / O优化的实例,默认值为cloud。否则,默认值为cloud_efficiency。
disk_description 磁盘描述。默认为空白。
disk_name 磁盘名称。默认为空白。
disk_size 系统磁盘的大小,以GiB为单位。
- 值范围:[20,500]。
- 默认值:max {40,ImageSize}。
image_disk_mappings 将一个或多个数据磁盘添加到映像。
disk_delete_with_instance 磁盘是否与实例一起释放。
- True表示释放实例时,该磁盘将随之释放
False表示释放实例时,将保留该磁盘。
disk_snapshot_id 使用快照创建数据磁盘指定此参数后,将忽略大小。创建的磁盘的实际大小是指定快照的大小。
disk_encrypted 是否加密数据磁盘。如果将此选项设置为true,则将加密数据磁盘,并且还将加密目标映像中的相应快照。默认情况下,如果这是一个额外的数据磁盘,则Packer不会加密该数据磁盘。否则,Packer会将加密设置保持为源映像中的设置。 有关更多详细信息,请参阅ECS磁盘加密简介。
image_ignore_data_disks 如果此值为true,则创建的映像将不包含任何数据磁盘快照。此选项在不考虑具有实例类型的默认数据磁盘的任何情况下将很有用。默认值为false。
wait_snapshot_ready_timeout 创建快照的超时时间。如果未设置此选项或将其设置为0,则默认超时为3600秒。对于那些包含大量数据的磁盘,可能需要更高的超时值。
image_force_delete 如果该值为true,则当将包含复制的目标图像名称与现有图像重复使用时,它将删除现有图像,然后创建目标图像,否则创建将失败。默认值为false。检查 image_name和image_copy_names选择目标图像的名称。如果 命令中提供了-force选项build,则可以省略此选项并将其设为true。
image_force_delete_snapshots 如果此值为true,则在删除重复的现有镜像时,这些镜像的源快照也将被删除。如果 命令中提供了-force选项build,则可以省略此选项并将其设为true。
image_share_account 要共享镜像的要添加的Aliyun帐户的ID。帐户数为1到10。如果帐户数大于10,则忽略此参数。
image_version 镜像的版本号,长度限制为1到40个英文字符。
instance_name 实例的显示名称。
internet_charge_type Internet收费类型,可以是 PayByTraffic或PayByBandwidth。默认值为PayByBandwidth。对于中国以外的地区,目前仅支持PayByTraffic,您必须手动进行设置。
internet_max_bandwidth_out 公共网络的最大传出带宽,以Mbps(兆比特/秒)为单位。取值范围:
- PayByBandwidth:[0,100]。如果未指定此参数,API会自动将其设置为0 Mbps。
- PayByTraffic:[1,100]。如果未指定此参数,则返回错误。
io_optimized ECS实例是否经过I / O优化。如果未提供此选项,则值将由产品API根据instance_type使用的值确定。
security_group_id 安全组名称。默认值为空白。
security_token STS访问令牌,可以通过模板或通过导出为环境变量(例如)进行设置 export SecurityToken=value。
skip_region_validation 如果该值为true,则默认值为false,可以跳过区域验证。
temporary_key_pair_name 要生成的临时密钥对的名称。默认情况下,Packer生成的名称类似于 packer_,其中是一个36个字符的唯一标识符。
TLSHandshakeTimeout 发生“ net / http:TLS握手超时”问题时,将此环境变量设置为更大的值,例如 export TLSHandshakeTimeout=30,它将TLS握手超时值设置为30s。
user_data 启动实例时要应用的用户数据。请注意,由于模板是JSON,因此在转义字符时需要小心。通常,使用起来更方便user_data_file。Packer不会在关闭必须在预配器中处理的实例之前自动等待用户脚本完成。
user_data_file 启动实例时将用于用户数据的文件的路径。
vpc_cidr_block 值选项:192.168.0.0/16和 172.16.0.0/16。未指定时,默认值为172.16.0.0/16。
vpc_id 系统分配的VPC ID。
vpc_name VPC名称。默认值为空白。
vswitch_id 要使用的VSwitch的ID。
zone_id 磁盘所属区域的ID。
ssh_private_ip 如果该值为true,则打包程序将连接到通过私有ip创建的ECS,而不是分配公共ip或EIP。默认值为false。
tags 应用于目标图像和相关快照的标签。

VirtualBox

构建器 说明
virtualbox-iso 从ISO文件开始,创建全新的VirtualBox VM,安装操作系统,在操作系统内配置软件,然后导出该计算机以创建映像。这是最适合从头开始的人的。
virtualbox-ovf 此构建器导入现有的OVF / OVA文件,在该VM上运行配置程序,然后导出该计算机以创建映像。如果您要使用现有的VirtualBox VM导出作为源,则最好。另外一个好处是,您可以将此构建器的工件反馈回自身以在计算机上进行迭代。
virtualbox-vm 该构建器使用现有VM在该VM之上运行定义的预配器,并有选择地创建快照以保存从预配器应用的更改。此外,构建器还可以导出该机器以创建映像。构建器能够将已定义的快照作为起点进行附加,可以通过变量静态或动态地对其进行定义。

阿里云权限

登陆 RAM控制台

用户 权限
terraform - AliyunECSFullAccess
- AliyunSLBFullAccess
- AliyunVPCFullAccess
- AliyunEIPFullAccess
- AliyunNATGatewayFullAccess

常见问题

Error installing provider "alicloud"

错误描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "alicloud" (terraform-providers/alicloud) 1.56.0...

Error installing provider "alicloud": unexpected EOF.

Terraform analyses the configuration and state and automatically downloads
plugins for the providers used. However, when attempting to download this
plugin an unexpected error occurred.

This may be caused if for some reason Terraform is unable to reach the
plugin repository. The repository may be unreachable if access is blocked
by a firewall.

If automatic installation is not possible or desirable in your environment,
you may alternatively manually install plugins by downloading a suitable
distribution package and placing the plugin's executable file in the
following directory:
terraform.d/plugins/darwin_amd64


Error: unexpected EOF

解决办法

Registry service unreachable

错误描述

1
2
3
4
5
6
7
8
9
10
11
12
13
$ terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...

Registry service unreachable.

This may indicate a network issue, or an issue with the requested Terraform Registry.


Error: registry service is unreachable, check https://status.hashicorp.com/ for status updates

解决办法

Error verifying checksum for provider "alicloud"

问题描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...

Error verifying checksum for provider "alicloud"
The checksum for provider distribution from the Terraform Registry
did not match the source. This may mean that the distributed files
were changed after this version was released to the Registry.


Error: unable to verify checksum

解决办法

参考

开源

文章

坚持原创技术分享,您的支持将鼓励我继续创作!
0%