DevOps工具链系列Tools(1)--Terraform

从本篇开始我们开始探讨的是Devops相关工具链的具体知识体系 :

在我们整个的Devops工具链里面,我们需要重点掌握以下几种工具:
1.Jenkins:持续集成工具
2.Ansible:持续部署工具
3.SonarQbe:代码检查工具
4.Terraform:基础设施管理工具
5.GitHub:代码管理工具
6.Prometheus:监控工具
7.Kubernetes:容器编排工具
8.Docker:容器
这些工具贯穿于整个Devops系统的各个环节,我们需要对其有深刻的理解才能更好的搭建一套高可用的Devops工具链。
工欲善其事,必先利其器。在所有的工作开始之前,我们需要一个比较完整的Infra层面的支撑,我们可以使用基于云平台的VM,或者是本地的物理机。在这里,我们还是依旧拿AWS作为基础平台来搭建整个的知识体系,所以对于工具链我们首先来熟悉一下 IT 基础架构自动化编排工具——Terraform 。

Terraform 基本概念:

Terraform 是一个 IT 基础架构自动化编排工具,它的口号是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码。Terraform 几乎可以支持所有市面上能见到的云服务,比如AWS ,阿里云,Azure,Google Cloud Platform ,Oracle Cloud Platform等,还有些私有的云比如OpenSatck等等。
下面我们根据步骤来一步步使用Terraform:

1.安装TerraForm:

首先我们必须在机器上安装terraform,下载地址:
terraform
Terraform打包为zip存档。下载Terraform后,解压缩包。Terraform作为单个二进制文件运行terraform。可以安全地删除包中的任何其他文件,Terraform仍然可以运行。

curl https://releases.hashicorp.com/terraform/0.11.13/terraform_0.11.13_linux_amd64.zip -o terraform.zip
1.download terraform

2.解压terraform
查看terraform版本:terraform --version
3.terraform安装成功
2.Terraform 基本命令:
1.mkdir:创建一个干净的工作目录,为后续操作做准备,该目录就像git的仓库

2.example.tf:需要创建一个.tf文件,指定provider等信息,工作目录下需要有至少一个tf文件,否则后续命令无法进行,在本文的例子中,我们默认为example.tf

3.terraform init:类似于git init,对当前目录做初始化,下载tf中的provider,并为后续的操作准备必要的环境条件

4.terraform plan:预览执行计划,不是必须的,但是强烈建议,主要是展示此次操作的具体内容。

5.terraform apply:真正执行编排计划

6.terraform show:显示当前状态。

7.terraform destroy:销毁云服务,将tf中的云服务清理干净,此操作跟AWS中CloudFormation的销毁操作类似,会回收所有的按照此tf文件创建出来的那内容
3.基础环境搭建:

安装Terraform后,让我们直接进入它并开始创建一些基础架构:
用于描述Terraform中基础结构的文件集简称为Terraform 配置,这边大家可以先了解下,下面会一个个讲解:


4.terraform配置文件
  • example.tf
    第一个配置来启动单个AWS EC2实例:
    首先必须强调一下的是,对于每个terraform配置组来说,provider是必须的,在这里,为了演示方便,我们使用的是dafault的VPC:
provider "aws" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region     = "${var.region}"
}
resource "aws_instance" "gtxy_ec2_1" {
  ami           = "ami-053617c9d818c1189"
  instance_type = "t2.micro"
  provisioner "local-exec" {
    command = "echo ${aws_instance.gtxy_ec2_1.public_ip} > ip_address.txt"
  }
}
resource "aws_eip" "ip" {
  instance = "${aws_instance.gtxy_ec2_1.id}"
}
provider:IaaS层提供商,例如AWS,Auzre等
resource:IaaS层资源类型,我们这里定义的是一个AWS Instance
    - aws_instance :instance 类型
    - gtxy_ec2_1 :instance 名称
  • variables.tf
    有些参数我们不想通过硬编码的方式写入到tf中,我们就会采用变量方式来搞定这种场景,一般我们会把所有的变量都单独拿到一个tf文件里去声明,例如variables.tf,虽然不是必须要命名成variables.tf,但是我们约定俗成这么做。
variable "access_key" {}
variable "secret_key" {}
variable "region" {
  default = "cn-north-1"
}

很好理解,脚本里region我们给了默认值cn-north-1,但是其他两个值均未给出,所以我们需要动态赋值。在其他tf中引用方式如下:

方式一:命令参数设置
$ terraform apply -var 'access_key=foo' -var 'secret_key=bar'
方式二:默认参数文件
Terraform默认会加载terraform.tfvars的文件为初始化参数的文件,文件内容是键值对的方式:
access_key = "foo"
secret_key = "bar"
方式三:命令制定参数文件
如果不按照方式二的命名规则,而是自己自定义文件名,可以采用方式一和方式二结合的方式指定参数文件:
$ terraform apply -var-file="secret.tfvars" -var-file="production.tfvars"
  • backend.tf
    将Terraform的state文件维护在云端或远程服务器,这样既可以保证高可用性,也可以方便多名编排人员共同维护
    5.backend配置文件
    这样在执行terraform init时就会在本地和remote端各维护一份状态文件
  • ip_address.txt
    当resource创建完毕后可以将EIP写到ip_address.txt文件中
    6.将EIP写到本地
  • outputs.tf
    控制台输出,也方便后续资源使用该资源:
    7.控制台输出ip
  • 小技巧
    我们可以将整个的堆栈以图形化的方式展现:
yum install graphviz
terraform graph | dot -Tsvg > graph.svg
image.png
8.terraform构建栈
4.小结:

Terraform在Iaas基础维护方面的侧重点,只是对云平台实例级别的管理,如果要对实例内部进行更复杂的编排需要配合Ansible组件。下一章我们会详细介绍下Ansible相关内容~

你可能感兴趣的:(DevOps工具链系列Tools(1)--Terraform)