Terraform(基于云计算的基础设施即代码工具)- 简单概括其原理和实施部分

你在使用「Terraform」吗?

非常方便,对于构建云端时几乎不再需要进行GUI操作。不过,由于我还没有使用很长时间,所以整体情况仍然有些模糊。

为了初次接触 Terraform 的初学者,我会总结一些能够俯瞰服务概要的信息。

首先

Terraform 是 HashiCorp 开发的一种开放源代码 (OSS) 工具,可以实现基础设施即代码(Infrastructure as Code)的概念。
通过使用 HCL(HashiCorp配置语言)或者可选的 JSON 编写相关的基础设施定义信息,可以操作不同的云服务提供商。

2014年发布了v0.0.1版本,截至今日(2019/07/06),v0.12.3版本已经发布。

在开始使用 Terraform 之前,我使用自编脚本进行 AWS 的构建,但无法自动化环境的更改和删除,导致工作量非常大。此外,我也尝试过 AWS CloudFormation,但它并不直观易懂,很难真正地进行全面利用。

当我开始使用Terraform时,我发现构建、更新和删除都可以非常高效地完成,令我感到非常惊讶。此外,有很多相关文献可供参考,如果有足够的时间去研究,几乎可以解决所有问题。

然而,对于初学者来说,仍然存在一些感觉上难以理解的信息,对于引入和普及开发团队来说,似乎需要更详细的解释信息。

基於這樣的背景,我將集中整理我剛開始使用時所需的資訊,以滿足自己的需求。

写作

    • Terraform の位置付け

 

    • Terraform が AWS を操作する方法の概要

 

    • Terraform の簡単な実行方法

 

    Terraform が クラウド操作する大雑把な流れ

不写书

    • 実戦向きの ~.tf ファイルの書き方

terrafirn.tfstate の backend 設定

Terraform 概述

基本信息

将Terraform的基本信息总结如下表。

項目内容提供会社HashiCorpGitHubhashicorp/terraform利用形式ソフトウェア利用可能OSWindows, macOS, Linux, and moreLicnenseMozilla Public License v2.0初期リリース2014/7/28最新版2019/6/24実装言語Go公式サイトTerraform by HashiCorp

查看标签版本历史

通过查看GitHub上的标签信息,可以了解到各个版本的发布历史如下。

版本履历版本 日期
v0.12.3 11天前
v0.12.2 23天前
v0.12.1 2019年6月5日
v0.12.0 2019年5月23日
v0.12.0-dev20190520H16 2019年5月21日
v0.11.14 2019年5月17日
v0.12.0-rc1 2019年5月8日
v0.12.0-beta2 2019年4月19日
v0.11.13 2019年3月12日
v0.11.12 2019年3月9日
v0.12.0-beta1 2019年3月1日
v0.11.12-beta1 2019年1月28日
v0.11.11 2018年12月15日
v0.12.0-alpha4 2018年12月8日
v0.12.0-alpha3 2018年12月7日
v0.12.0-alpha2 2018年10月31日
v0.11.10 2018年10月23日
v0.12.0-alpha1 2018年10月20日
v0.11.9 2018年10月20日
v0.11.9-beta1 2018年10月16日
v0.11.8 2018年8月16日
v0.11.7 2018年4月11日
v0.11.6 2018年4月6日
v0.11.5 2018年3月22日
v0.11.4 2018年3月16日
v0.11.3 2018年2月1日
v0.11.2 2018年1月10日
v0.11.1 2017年12月1日
v0.11.0 2017年11月17日
v0.11.0-rc1 2017年11月10日
v0.11.0-beta1 2017年11月4日
v0.10.8 2017年10月26日
v0.10.7 2017年10月3日
v0.10.6 2017年9月19日
v0.10.5 2017年9月15日
v0.10.4 2017年9月7日
v0.10.3 2017年8月31日
v0.10.2 2017年8月17日
v0.10.1 2017年8月16日
v0.10.0 2017年8月3日
v0.10.0-rc1 2017年7月20日
v0.10.0-beta2 2017年7月7日
v0.9.11 2017年7月4日
v0.9.10 2017年6月30日
v0.9.9 2017年6月27日
v0.10.0-beta1 2017年6月23日
v0.9.8 2017年6月8日
v0.9.7 2017年6月7日
v0.9.6 2017年5月26日
v0.9.5 2017年5月11日
v0.9.4 2017年4月26日
v0.9.3 2017年4月13日
v0.9.2 2017年3月28日
v0.9.1 2017年3月18日
v0.9.0 2017年3月16日
v0.9.0-beta2 2017年3月3日
v0.8.8 2017年3月3日
v0.9.0-beta1 2017年2月16日
v0.8.7 2017年2月16日
v0.8.6 2017年2月8日
v0.8.5 2017年1月27日
v0.8.4 2017年1月12日
v0.8.3 2017年1月10日
v0.8.2 2016年12月22日
v0.8.1 2016年12月15日
v0.8.0 2016年12月14日
v0.8.0-rc3 2016年12月9日
v0.8.0-rc2 2016年12月3日
v0.7.13 2016年11月26日
v0.8.0-rc1 2016年11月24日
v0.7.12 2016年11月23日
v0.8.0-beta2 2016年11月17日
v0.7.11 2016年11月16日
v0.8.0-beta1 2016年11月12日
v0.7.10 2016年11月10日
v0.7.9 2016年11月5日
v0.7.8 2016年11月2日
0.7.7 2016年10月18日
v0.7.7 2016年10月18日
v0.7.6 2016年10月15日
v0.7.5 2016年10月7日
v0.7.4 2016年9月20日
v0.7.3 2016年9月5日
v0.7.2 2016年8月25日
v0.7.1 2016年8月20日
v0.7.0 2016年8月3日
v0.7.0-rc4 2016年7月30日
v0.7.0-rc3 2016年7月16日
v0.7.0-rc2 2016年6月13日
v0.7.0-rc1 2016年6月1日
v0.6.16 2016年5月10日
v0.6.15 2016年4月23日
v0.6.14 2016年3月22日
v0.6.13 2016年3月16日
v0.6.12 2016年2月25日
v0.6.11 2016年2月2日
v0.6.10 2016年1月28日
v0.6.9 2016年1月9日
v0.6.8 2015年12月3日
v0.6.7 2015年11月24日
v0.6.6 2015年10月24日
v0.6.5 2015年10月22日
v0.6.4 2015年10月16日
v0.6.3 2015年8月12日
v0.6.2 2015年8月7日
v0.6.1 2015年7月21日
v0.6.0 2015年7月1日
列表 2015年6月20日
v0.5.3 2015年6月2日
v0.5.1 2015年5月16日
v0.5.0 2015年5月8日
v0.4.2 2015年4月11日
v0.4.1 2015年4月10日
v0.4.0 2015年4月3日
v0.3.7 2015年2月20日
v0.3.6 2015年1月7日
v0.3.5 2014年12月10日
v0.3.1 2014年10月22日
v0.3.0 2014年10月15日
v0.2.2 2014年9月10日
v0.2.1 2014年9月1日
v0.2.0 2014年8月29日
v0.1.1 2014年8月6日
v0.1.0 2014年7月29日

将Terraform和Vagrant进行录入

让我们来比较一下被认为比Terraform使用者更多的Vagrant(由HashiCorp公司开发的工具),从而了解它们的特点。

流浪者机制的运作方式

在构建虚拟环境时,Vagrant经常被用来在个人电脑上实现。该系统如下图所示,它会根据虚拟化工具(VirtualBox,Vmware)、Box和Vagrantfile的信息在本地个人电脑上自动构建虚拟环境。

image.png

在Vagrant中,我们会在Vagrantfile中记录虚拟环境的构建信息,并通过执行vagrant命令来操作虚拟环境。

Terraform 的机制是什么?

Terraform与Vagrant一样,需要在本地PC上安装并使用。
与Vagrant不同的是,其主要构建对象是通过操作远程云服务来实现的。

image.png

在用 Vagrantfile 管理虚拟机的情况下,相应的文件在图中用 main.tf 表示。
通过在特定的工作目录中运行 terraform init 命令来配置环境并安排所需的元素,然后通过 terraform apply 命令操作目标云(Targets)。

要在本地PC上使用Terraform操作遠程雲端,需要使用為每個相應雲端提供的提供者工具。這樣做是為了使設定自動保存在main.tf等文件中,在執行terraform init時,它會自動將相應的提供者工具準備在.terraform/plugins/目錄下。

    Providers – Terraform by HashiCorp

terraform.tfstate是一个非常重要的文件,其中包含了最新应用于目标云的配置信息。如果没有特定的配置,该文件将会被创建在工作文件夹的特定子文件夹下,但通过进行Backend配置,可以将其保存在像AWS S3这样的存储空间中。

由于terraform.tfstate中包含了所有构建信息,如果它损坏,就无法正确处理在云上构建的目标资源。此外,当多人共同开发时,资源被存储在个人电脑上会导致效率非常低下。

因此,出于这些原因,一般情况下应该在AWS S3上创建特定的存储桶,并将terraform.tfstate文件配置在其中。

.
├── .terraform
│   ├── plugins
│   └── terraform.tfstate
└── main.tf

引进Terraform

我认为仅凭概念性信息是难以理解的,所以我将使用Terraform整理了一下如何操作AWS的方法。

所需之物

由于这次操作涉及到AWS,所以需要一个AWS账户。

    • AWSアカウント(クレデンシャル情報:アクセスキー・シークレットキー)

 

    • Terraform

 

    awscli

Terraform 安装

由于Terraform安装方法已经在许多网站上介绍过了,所以请参考下面的网站:

    • Terraform – CentOS 7 に Terraform をインストールして AWS へ接続 – Qiita

 

    • Terraformインストール(Windows版) – Qiita

 

    • Installation / インストール – Terraform for さくらのクラウド

 

    Download Terraform – Terraform by HashiCorp

我尝试在Windows、macOS、WSL和虚拟环境中安装,但基本上在主机操作系统上安装更为方便。(尽量避免使用虚拟环境和WSL,因为实际尝试时发现它们更加麻烦。)

尝试使用Terraform创建VPC。

让我们从介绍使用Terraform构建AWS VPC的步骤开始。
首先,我们需要创建一个用于操作的文件夹。

// Terraform の設定情報を配置するフォルダを作成・移動
mkdir terraform-dir && cd $_

接下来,我们将创建 main.tf。

# 変数の設定
variable "aws_access_key" {}
variable "aws_secret_key" {}

# Terraform のバージョン指定
terraform {
  required_version = "= 0.12.3"
}

# 変数を利用した provider の設定
provider "aws" {
    version = "= 2.18.0"
    access_key = "${var.aws_access_key}"
    secret_key = "${var.aws_secret_key}"
    region = "ap-northeast-1"
}

# VPC の作成
resource "aws_vpc" "vpc" {
  cidr_block           = "10.0.0.0/16"
  instance_tenancy     = "default"
  enable_dns_support   = "true"
  enable_dns_hostnames = "false"

  tags {
    Name = "vpc_sample"
  }
}

如果您想更深入理解main.tf文件的内容,请参考以下网站。

    • Terraform で変数を使う – Qiita

 

    • Resources – Configuration Language – Terraform by HashiCorp

 

    • Terraformのリソースの書き方(resource, data source, variable, output) – 後ろを向いて後退します

 

    • Provider: AWS – Terraform by HashiCorp

 

    Terraform Settings – Configuration Language – Terraform by HashiCorp

为了操作AWS,需要提供access_key和secret_key的信息,但是如果直接将它们写入代码中,会被包括在git管理中,存在泄漏信息的风险。
因此,本次我们将使用变量来定义变量,并从操作系统的环境变量中获取输入的方法。

在Terraform中,通过在TF_VAR_之后添加变量名来设置环境变量,这样在执行terraform命令时,环境变量会自动被读取。

// bash を使用する場合(OSが macOS, Linux の場合)

export TF_VAR_aws_access_key="AKIAXXXXXXXXXXXXXXXXXX"
export TF_VAR_aws_secret_key="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

echo $TF_VAR_aws_access_key
echo $TF_VAR_aws_secret_key
// Powershell を使用する場合(OS Windows の場合)

$env:TF_VAR_aws_access_key="AKIAXXXXXXXXXXXXXXXXXX"
$env:TF_VAR_aws_secret_key="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
$env:TF_VAR_public_key_path=".\.secret\public"

$env:TF_VAR_aws_access_key;
$env:TF_VAR_aws_secret_key;
$env:TF_VAR_public_key_path;
Get-ChildItem env:

如果已经完成了以上的设定,接下来可以使用以下命令进行初始化。

// 初期化
terraform init

如果初始化成功,请使用以下命令运行 “Dry Run”,如果没有问题,则实际执行远程云服务的构建操作。
由于示例只是创建VPC,所以不会花费太多时间,但是构建NAT或者RDS等操作可能需要持续数分钟。

// ドライ・ラン
$ terraform plan

// 適用
$ terraform apply

如果可以确认启动,请使用以下命令尝试删除。

// 削除確認
$ terraform plan -destroy

// 削除
$ terraform destroy

到目前为止的解释

我将解释在创建和删除VPC之前所做的步骤。

创建工作文件夹并创建 main.tf

在安装了Terraform的情况下,在主机操作系统的任意位置创建了一个工作文件夹,并在其中创建了main.tf文件。

image.png

设置环境变量

使用操作系统的命令,以 Terraform 可以作为变量提取的格式设置环境变量。

image.png

初始化作业文件夹

通过执行terraform init命令,可以初始化工作文件夹并加载所需的provider和module。

image.png

建设环境

使用Terraform apply来构建远程云环境。

image.png

销毁环境

使用 terraform destroy 命令来销毁已构建的云环境。

image.png

最后,

最后的结尾,

最终,

最终地,

总之,

我为了解决在开始接触Terraform时所遇到的类似以下疑问的问题,做了一个简略的信息汇总。

    • Terraform はどういうツール?

 

    • Terraform はどうやって動く?

 

    Terraform の実行に必要なファイルやコマンドは?

对于即将开始或稍作尝试的人来说,这可能会有一些参考价值。

下一步

我认为对于想学习更实用内容的人来说,以下书籍会非常有参考价值。
书中通过编码的方式逐步解释,后半部分还总结了一些适用的信息。

这个金额是1500日元,但是从内容来看,我觉得它值得花5000日元左右去购买。推荐。

image.png

第1章:引言
第2章:安装
第3章:Terraform基础
第4章:整体设计
第5章:权限管理
第6章:存储
第7章:网络
第8章:负载均衡和DNS
第9章:容器编排
第10章:批处理
第11章:密钥管理
第12章:配置管理
第13章:数据存储
第14章:部署流水线
第15章:无SSH操作
第16章:日志记录
第17章:结构化
第18章:Terraform最佳实践
第19章:AWS最佳实践
第20章:模块设计
第21章:拾取残篇
第22章:站在巨人的肩膀上

请参照

    • Terraform by HashiCorp

 

    • Terraform (software) – Wikipedia

 

    • hashicorp/terraform – GitHub

 

    • HashiCorpのツール「ATLAS」「VAGRANT」「PACKER」「TERRAFORM」

 

    • Terraformで始めるInfrastructure as Code – SlideShare

 

    Terraform v0.7が誘う「Infrastructure as Code」の世界 – さくらのナレッジ
广告
将在 10 秒后关闭
bannerAds