Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码。Terraform 几乎可以支持所有市面上能见到的云服务。具体的说就是可以用代码来管理维护 IT 资源,把之前需要手动操作的一部分任务通过程序来自动化的完成,这样的做的结果非常明显:高效、不易出错。
Terraform 提供了对资源和提供者的灵活抽象。该模型允许表示从物理硬件、虚拟机和容器到电子邮件和 DNS 提供者的所有内容。由于这种灵活性,Terraform 可以用来解决许多不同的问题。这意味着有许多现有的工具与Terraform 的功能重叠。但是需要注意的是,Terraform 与其他系统并不相互排斥。它可以用于管理小到单个应用程序或达到整个数据中心的不同对象。
Terraform 使用配置文件描述管理的组件(小到单个应用程序,达到整个数据中心)。Terraform 生成一个执行计划,描述它将做什么来达到所需的状态,然后执行它来构建所描述的基础结构。随着配置的变化,Terraform 能够确定发生了什么变化,并创建可应用的增量执行计划。
是不是还是很懵逼的感觉,其实一句大白话可以解释他的用处------就是咱们遵循Terraform的代码规范,替代咱们人工在AWS控制台吭哧吭哧的操作各个服务,最大的好处是,对于不熟悉AWS各个服务操作的用户,咱们可以给他写个Terraform脚本,只要执行这个脚本就可以按照客户的要求构建AWS各个服务了,是不是觉得很神奇,废话不多说,直接上代码,感受一下。
Terraform以单个二进制文件的形式分布。通过解压缩并将其移动到包含在系统路径中的目录中来安装Terraform.
Terraform的官方网站是https://www.terraform.io , 在这个网站中,可以轻松的找到的下载地址, https://www.terraform.io/downloads.html
https://releases.hashicorp.com/terraform/0.12.6/terraform_0.12.6_openbsd_amd64.zip
我安装的是Terraform0.126,这个版本对需要集成python 3.6以上.
注:我装的是Linux版的环境,其他环境可以由自己测试。
一:首先检查一下你的python环境
默认的环境是2.7.8,这个版本太低,需要升级到3.6.8,
1、wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz 下载python
2、tar zxvf Python-3.6.3.tgz 解压
3、cd Python-3.6.3
4、./configure --prefix=/usr/local/python3.6 5、指定安装路径
6、make 编译
7、make install 安装
按照步骤应该没什么问题,在命令行输入python看看版本。
可是依然显示python2.7。
我们需要改变这种默认。为新安装的python3建立软链接
mv /usr/bin/python /usr/bin/python.bak 删除原来指向python2的软链接
ln -s /usr/local/python3.6/bin/python3.6 /usr/bin/python
此时再检查一下python的版本
二:安装Terraform
解压Terraform文件后Terraform是个文件
配置Terraform 环境变量
(1)export PATH="$PATH:/path/to/dir"
(2)source ~/.profile
三:安装aws-cli
此时环境全部准备好了,下面就开始进入Terraform的世界了。
手把手教你如何使用Terraform操作AWS(二)
上文已经详细介绍了Terraform的运行环境了,接下来,咱们开始用Terraform试试手。
一:访问密钥和秘密访问密钥
AWS Access Key ID 和 AWS Secret Access Key 是您的 AWS 凭证。它们与 AWS Identity and Access Management (IAM) 用户或角色相关联,用于确定您拥有的权限。有关如何使用 IAM 服务创建用户的教程,请参阅 IAM 用户指南 中的创建您的第一个 IAM 管理员用户和组。
访问密钥包含访问密钥 ID 和秘密访问密钥,用于签署对 AWS 发出的编程请求。如果没有访问密钥,您可以使用AWS 管理控制台进行创建。作为最佳实践,请勿在不必要时使用 AWS 账户根用户 访问密钥执行任务。而是为自己创建一个具有访问密钥的新管理员 IAM 用户。
仅当创建访问密钥时,您才能查看或下载秘密访问密钥。以后您无法恢复它们。不过,您随时可以创建新的访问密钥。您还必须拥有执行所需 IAM 操作的权限。
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
键入该命令时,AWS CLI 会提示您输入四条信息(访问密钥、秘密访问密钥,AWS 区域和输出格式),并将它们存储在名为 default 的配置文件(一个设置集合)中。每当您运行的 AWS CLI 命令未明确指定要使用的配置文件时,就会使用该配置文件。
(1).每个 Terraform 项目需要自己单独的目录空间
mkdir terraform
cd terraform
(2).目录下的所有 *.tf 文件都会被 Terraform 加载,在初始化 Terraform 工作空间之前必须至少要有一个 *.tf 文件。我们这里建立文件 terraform.tf, 内容如下
Terraform 配置的语法是该公司 HashiCorp 独创的 HCL(HashiCorp configuration language), 它可以兼容 JSON 格式。
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 = "………" //不指定的话,默认值是 "default"
}
如果是使用 shared_credentials_file 中的 profile, 请确定您以预先生成好的 credentials 文件及有效的 profile。更多关于 AWS Provider 的配置请参考 https://www.terraform.io/docs/providers/aws/index.html
(3)resource "aws_s3_bucket" "s3_bucket" 部分
如果 bucket-test-bucket 不存在的话,运行 terraform apply 将会创建它,否则试图更新该 bucket。此例子只指定了 bucket 的 acl 和 tag 信息。terraform destroy 用来删除已存在的 bucket。
注意:terraform 配置文件中只指定要管理的资源对象,并不关心操作资源的行为--创建,修改,删除操作。操作行为与 Terraform 的状态有关系,无则创建,有则修改,更名会拆分为除旧立新两个操作,terraform destroy 用于显式删除资源。后面实例操作时会讲到。
注:resource "aws_s3_bucket" "s3_bucket" { 中,resource 后第一个是 type, 即资源名,第二个参是 name。在作为变量引用的时候就要用到它,例如在后面要为 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 "test-bucket", 同时会在当前目录中生成一个状态文件 terraform.tfstate, 它是一个标准的 JSON 文件。这个文件对 Terraform 来说很重要,它会影响 terraform plan 的决策,虽然不会影响到实际的执行效果。我们可以把它存到远端,如 S3 或 Consul。terraform state [list|mv|pull|push|rm|show] 用来操作状态文件。
手把手教你如何使用Terraform操作AWS(三)
本例子中要是用cloudwatch event 来触发lambda函数,给所有的ec2实例打标签。
以下是Lambad代码
接下来的事情全部要交给 Terraform 来完成了,在于怎么写那个 tf 文件,为方便起见我们创建一个 terraform.tf 文件。
第一部分:
(1)首先resource "aws_iam_role" "role" 第一个标签的功能,是创建IAM Role,要求这个用户有执行lamdba的权限。
(2)resource "aws_iam_policy" "policy",创建一个IAM策略,此策略可以操作所有的ec2的策略。
(3)resource "aws_iam_policy_attachment" "test-attach",将托管的IAM策略附加到用户、角色和/或组
(4)提供Lambda函数资源。Lambda允许您触发代码的执行,以响应AWS中的事件。
第二部分:
(5)提供CloudWatch事件规则资源。
schedule_expression调度表达式。例如,cron(0 20 * * ?或费率(5分钟)
(6)提供一个资源来创建CloudWatch事件权限,以支持当前帐户缺省事件总线中的跨帐户事件。
(7)之后执行terraform计划,我们知道这些脚本的将要操作哪些资源。
(8)上面创建的东西不想要了,想统统干掉,那就更简单了 terraform destroy 就行了。