Terraform 使用 - 从最简单例子开始

https://yanbin.blog/terraform-get-started-with-first-sample/

Terraform 是一个 IT 基础架构自动化编排工具,它的口号是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码。具体的说就是可以用代码来管理维护 IT 资源,比如针对 AWS,我们可以用它创建,修改,删除 S3 Bucket, Lambda, EC2 实例,Kinesis, VPC 等各种资源。并且在真正运行之前可以看到执行计划(即干运行-dryrun)。由于状态保存到文件中,因此能够离线方式查看资源情况 -- 当然,前提是不要在 Terraform 之外对资源进行修改。

Terraform 配置的状态除了能够保存在本地文件中,也可以保存到 Consul, S3, azure, http, swift 等处。

Terraform 是一个高度可扩展的工具,通过 Provider 来支持新的基础架构,AWS 不过为目前官方内建 68 个 Providers 中的一个。其他能用 Terraform 的地方有 Alicloud(阿里云, 实名制备案才能用), Google Cloud, Heroku, Kubernetes, Microsoft Azure, MySQL, RabbitMQ, Docker 等等。愿意的话可以写自己的 Provider, 如搞个 Kafka 的话,用来管理 Topic 等的创建,维护工作。

Terraform 之前我们对 AWS 的操作用的是 awscli, 或 Serverless。awscli 什么都能做,但它是无状态的,必须明确用不同的命令来创建,修改和删除。Serverless 不是用来管理基础架构的,用它创建  Lambda 时创建资源都是很麻烦的事。AWS 提供的 CloudFormation 才是与 Terraform 较类似的工具,但是看到用法就头疼。

下面从最简单例子开始,看看怎么用 Terraform 创建,删改,修改 S3 Bucket。本地系统为 Mac OS。

1. Terraform 安装

brew install terraform

安装后 shell 命令就是 terraform, 常用的是 terraform init, terraform plan, terraform apply

2. 创建配置文件

像 git 一样,每个 Terraform 项目需要自己单独的目录空间,所以我们创建一个 terraform-learning 目录

mkdir terraform-learning
cd terraform-learning

该目录下的所有  *.tf 文件都会被 Terraform 加载,在初始化 Terraform 工作空间之前必须至少要有一个 *.tf 文件。我们这里建立文件 main.tf, 内容如下

Terraform 配置的语法是该公司 HashiCorp 独创的 HCL(HashiCorp configuration language), 它可以兼容 JSON 格式。

上面 tf 文件在 Vim 中的语法加亮是安装的 hashivim/vim-terraform 插件。

我们写好了 *.tf 文件后可以调用 terraform fmt 对配置文件进行格式化,它比较喜欢被 Java 弃用的等号对齐的格式。

3. 配置文件介绍

从正式跨入 terraform 命令正题之前先来大概的介绍一下上面那个 main.tf 文件。

1) provider "aws" 部分,它指定选用什么 provider, 以及验证信息。aws 既允许指定 access_key 和 secret_key

provider "aws" {
    region           = "us-east-1"
    access_key  = "your-access-key-here"
    secret_key   = "your-secret-key-here"
}

也能够指定证书文件中的 profile

provider "aws" {
    region                                  = "us-east-1"
    shared_credentials_file  = "~/.aws/credentials"   //不指定的话,默认值是 "~/.aws/credentials"
    profile                                  = "yanbin"                        //不指定的话,默认值是 "default"
}

如果是使用 shared_credentials_file 中的 profile, 请确定您以预先生成好的 credentials 文件及有效的 profile。

更多关于 AWS Provider 的配置请参考 https://www.terraform.io/docs/providers/aws/index.html

2) resource "aws_s3_bucket" "s3_bucket" 部分

这只是我们今天举的一个小例子,点击链接 aws_s3_bucket 查看 S3 Bucket 所有的配置项。Terraform 能够管理的所有 AWS 资源也能从前面那个链接中看到。

如果 bucket yanbin-test-bucket 不存在的话,运行 terraform apply 将会创建它,否则试图更新该 bucket。此例子只指定了 bucket 的 acl 和 tag 信息。terraform destroy 用来删除已存在的  bucket。

注意:terraform 配置文件中只指定要管理的资源对象,并不关心操作资源的行为--创建,修改,删除操作。操作行为与 Terraform 的状态有关系,无则创建,有则修改,更名会拆分为除旧立新两个操作,terraform destroy 用于显式删除资源。后面实例操作时会讲到。

注:resource "aws_s3_bucket" "s3_bucket" { 中,resource 后第一个是 type, 即资源名,第二个参是 name。其实 "s3_bucket" 在这里没什么用,只是一个描述或助记符而已。(2017-08-28): 更正一下,在作为变量引用的时候就要用到它,例如在后面要为 Lambda 创建一个 S3 Event 的 Trigger, 就要写成 event_source_arn = "${aws_s3_bucket.s3_bucket.arn}", 引用时不需要知道实际的名称。

4. 初始化工作目录

在初始化 Terraform 工作目录之前, 其他命令如 apply, plan 多是不可用的,提示需要初始化工作目录,命令是

terraform init

它要做的事情像是 git init 加上 npm install,执行完了 terraform init 之后会在当前目录中生成 .terraform 目录,并依照 *.tf 文件中的配置下载相应的插件。

5. 执行 Terraform 管理命令

有了前面的准备之后,终于可以开始运行 Terraform 的管理命令了。Terraform 在正式执行之前提供了预览执行计划的机会,让我们清楚的了解将要做什么

terraform plan

由此计划还能知道关于 aws_s3_bucket 有些什么配置项,比如配置中可以加上 acceleration_status = "Enabled"

terraform apply

这样便在 AWS 上创建了一个 S3 bucket "yanbin-test-bucket", 同时会在当前目录中生成一个状态文件 terraform.tfstate, 它是一个标准的 JSON 文件。这个文件对 Terraform 来说很重要,它会影响 terraform plan 的决策,虽然不会影响到实际的执行效果。我们可以把它存到远端,如 S3 或 Consul。terraform state [list|mv|pull|push|rm|show] 用来操作状态文件。

此时什么也不改,再次执行 terraform plan, 会显示没什么要做的

aws_s3_bucket.s3_bucket: Refreshing state... (ID: yanbin-test-bucket)
No changes. Infrastructure is up-to-date.

如果对 main.tf 作点小改,改个 tag 属性,再次 terraform plan

~ aws_s3_bucket.s3_bucket
tags.Name: "Created by Terraform" => "sCreated by Terraform"

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

为什么说 terraform plan 是基于状态文件 terraform.tfstate 作出的呢?我们可以删除这个状态文件,然后执行 terraform plan 看看

+ aws_s3_bucket.s3_bucket
    .....
    bucket: "yanbin-test-bucket"
    ......
    tags.Environment: "QA"
    ......

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

Terraform 由于缺乏 terraform.tfstate 对比,所以认为是要添加一个 bucket, 但是实际执行 terraform apply 时,连接到远端 AWS, 发现该 bucket 已存在就只是进行更新。terraform apply 总能给出正确的操作结果。同理如果状态文件中说有那个 bucket, terraform plan 会说是更新,但 AWS 没有那个  bucket,实际执行 terraform apply 也会进行添加的。

资源更名

如果把 main.tf 中的

bucket = "yanbin-test-bucket"

改成

bucket = "yanbin-test-bucket-rename"

即欲为 bucket 更名,用 terraform plan 看下计划

实际上 terraform apply 也是先删除旧的,再创建新的。Terraform 像 git 一样用不同颜色和  +/- 号来显示变动操作

最后是 terraform destroy 命令,把 *.tf 文件中配置的所有资源从 AWS 上清理掉。

关于 Terraform 工作目录中文件命名

Terraform 运行时会读取工作目录中所有的 *.tf, *.tfvars 文件,所以我们不必把所有的东西都写在单个文件中去,应按职责分列在不同的文件中,例如:

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

以此篇最简单的入门出发,以后可以深入了解 Lambda, Lambda 触发器,及 API Gateway, EC2 实例怎么用 Terraform 来管理,也知晓了资源的可用属性应该到哪里去查。

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

[转]Terraform 使用 - 从最简单例子开始相关推荐

  1. webpack入门之简单例子跑起来

    webpack入门之简单例子跑起来 webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载 ...

  2. 图片上传(加水印、缩略图、远程保存)的简单例子

    图片上传(加水印.缩略图.远程保存)的简单例子(应用于51aspx.com) 该源码下载地址:http://51aspx.com/CV/ImageUpload 今天看到xiongeee发的文章使用使用 ...

  3. java hashtable import,Hashtable的一个简单例子

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以下是关于Hashtable的简单例子,谁知道别的遍历Hashtable的方法,请回复! package no1; import java.util.En ...

  4. SAP MM采购定价过程的一个简单例子

    SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...

  5. .net中使用反射的简单例子

    说明:由于工作原因,本人使用反射的机会不是很多,所以没有必要为了炫耀技术而使用这种技术,不过今天有人问到这方面的问题,所以做了一个简单例子,供初学者参考,代码如下: using System; usi ...

  6. linux下Makefile中包含有shared library动态链接库文件时候的简单例子

    如果不知道什么是makefile,可以首先看我的另一篇博客: linux下Makefile的简单例子及解释 http://www.cnblogs.com/lihaozy/archive/2012/08 ...

  7. java 国际化例子_JavaSE 国际化 简单例子

    ①在src下添加两个文件: base_zh_CN.properties Test=\u8fd9\u662f\u4e2d\u6587 base_en_US.properties Test=english ...

  8. 6翻了C语言,《嗨翻C语言》随书练习六 6章 二叉树简单例子

    二叉树简单例子/* <嗨翻C语言>随书练习 6章    2016-12-06 xiousheng@126.com  二叉树例子,警务罪犯判断档案系统,哈哈 书中可以专家系统例子 */ #i ...

  9. QT 信号与槽 最简单例子

    QT  信号与槽 最简单例子 main.cpp 和 my_head.h源码: [cpp] view plaincopy #ifndef MY_HEAD_H #define MY_HEAD_H #inc ...

最新文章

  1. 现代内存编号解读(转)
  2. Kubernetes 日志收集的原理,看这一篇就够了
  3. eeglab中文教程系列(9)-绘制ERP图像
  4. 蓝光模式引爆欧洲杯 神马搜索陪你度过激情夏日
  5. python paramiko模块中设置执行命令超时值
  6. 如何安装rpm包?掌握rpm包管理工具就够了
  7. 信息系统项目管理师考试答题卡样式【下载PDF】
  8. es 全量同步mysql_什么时候该用MySQL,什么时候该用ES呢?
  9. spark广播变量的使用(转)
  10. feign rest_与Feign客户轻松进行REST通信
  11. 2021年美妆短视频及直播营销报告
  12. WHMCS v8.0 bate1开心版源码
  13. 800变频器故障代码_变频器通用故障码意义汇总讲解
  14. SQLServer如何取得随机获取的数据库记录
  15. BestCoder Round #90 Kblack loves flag
  16. 计算机原理的教学,计算机组成原理教学方法探析
  17. 计算机仿真实验之一 霍尔效应测磁场,物理实验教程
  18. 【初探篇】Nginx 虚拟主机与域名解析
  19. 卐 4-3D图形的数学
  20. 字符串字符数组 PTA 7-10 古风排版

热门文章

  1. 有哪些行业或生意是电商无法取代的?
  2. MyBatis的搭建流程(idea+maven)
  3. windows上cppcheck检查不出任何错误解决
  4. pycharm添加python_Pycharm 复制代码出现空格的解决方式
  5. 使用游标正确提取SQL Server数据并将其放置在Reporting Services矩阵中
  6. SQL Server中唯一索引和唯一约束之间的区别
  7. 像MIUI一样做Zabbix二次开发(5)——那些坑和优化方向
  8. 痛苦的vsftpd配置
  9. flash物理引擎应用:你的第一个Fisix应用程序
  10. 事实证明了 平台识别算法适应性还是很强的