《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。


Terraform支持的公有云有很多,如AWS、Azure、Google、Alibaba等。将Terraform应用于公有云,才最能发挥其强大的功能。

初始化GCP项目

创建一个新项目

首先我们需要初始化一个GCP项目。GCP给开发者提供了免费试用的服务,我们可以在不花钱的情况下学习GCP的功能。

要使用GCP,我们需要创建一个项目,它所有的资源都是在项目之下管理的:

创建Service Account

在实际开发中,我们不能使用自己的账号在做操作,最好的方式是创建一个服务账号(Service Account),这应该也是所有云平台都推荐的方式。创建位置如下:

输入账号名字:

选择角色,为了方便,我直接选择Owner,会拥有所有权限,但实际应用肯定不能这样,要做好隔离:

创建密钥文件

对于Service Account,不是通过用户名密码来授权的,而是通过密钥文件,创建如下:

选择新建一个密钥,并格式为json。创建后,会自动下载key文件。

设置gcloud SDK

Key文件拿到后,我们可以设置环境变量:GOOGLE_APPLICATION_CREDENTIALS

$ export GOOGLE_APPLICATION_CREDENTIALS=/Users/larry/Software/google-cloud-sdk/pkslow-admin-for-all.json

激活Service Account:

$ gcloud auth activate-service-account admin-for-all@pkslow.iam.gserviceaccount.com --key-file=${GOOGLE_APPLICATION_CREDENTIALS}

设置SDK的项目ID:

$ gcloud config set project pkslow

检查一下设置是否正确:

$ gcloud auth list
Credentialed Accounts
ACTIVE ACCOUNT
* admin-for-all@pkslow.iam.gserviceaccount.com To set the active account, run:
$ gcloud config set account `ACCOUNT` $ gcloud config list
[core]
account = admin-for-all@pkslow.iam.gserviceaccount.com
disable_usage_reporting = True
project = pkslow Your active configuration is: [default]

使用gcloud创建Pub/Sub

SDK设置好后,就可以使用了,我们使用它来创建Pub/Sub试试。创建主题和订阅:

$ gcloud pubsub topics create pkslow-test
Created topic [projects/pkslow/topics/pkslow-test]. $ gcloud pubsub subscriptions create pkslow-sub --topic=pkslow-test
Created subscription [projects/pkslow/subscriptions/pkslow-sub].

检查是否创建成功:

$ gcloud pubsub topics list
---
name: projects/pkslow/topics/pkslow-test $ gcloud pubsub subscriptions list
---
ackDeadlineSeconds: 10
expirationPolicy:
ttl: 2678400s
messageRetentionDuration: 604800s
name: projects/pkslow/subscriptions/pkslow-sub
pushConfig: {}
topic: projects/pkslow/topics/pkslow-test

在浏览器查看,发现已经成功创建了:


Terraform创建Pub/Sub

下载Terraform插件

我们需要安装GCP的Terraform插件来管理GCP资源:

# 设置插件目录
$ export TERRAFORM_PLUGIN=/Users/larry/Software/terraform/plugins
# 创建目录
$ mkdir -p ${TERRAFORM_PLUGIN}/registry.terraform.io/hashicorp/google/4.0.0/darwin_amd64
$ cd ${TERRAFORM_PLUGIN}/registry.terraform.io/hashicorp/google/4.0.0/darwin_amd64
# 下载
$ wget https://releases.hashicorp.com/terraform-provider-google/4.0.0/terraform-provider-google_4.0.0_darwin_amd64.zip
# 解压
$ unzip terraform-provider-google_4.0.0_darwin_amd64.zip

准备Terraform代码

需要提供Terraform代码理管理Pub/Sub,更多细节请参考: Terrafrom GCP.

版本文件version.tf:

terraform {
required_version = "= 1.0.11"
required_providers { google = {
source = "hashicorp/google"
version = "= 4.0.0"
}
}
}

主文件main.tf:

provider "google" {
project = "pkslow"
} resource "google_pubsub_topic" "pkslow-poc" {
name = "pkslow-poc"
} resource "google_pubsub_subscription" "pkslow-poc" {
name = "pkslow-poc"
topic = google_pubsub_topic.pkslow-poc.name labels = {
foo = "bar"
} # 20 minutes
message_retention_duration = "1200s"
retain_acked_messages = true ack_deadline_seconds = 20 expiration_policy {
ttl = "300000.5s"
}
retry_policy {
minimum_backoff = "10s"
} enable_message_ordering = true
}

初始化和变更

指定插件目录初始化:

$ terraform init -plugin-dir=${TERRAFORM_PLUGIN}

使变更生效,就会在GCP上创建对应的资源:

$ terraform apply -auto-approve

如果没有发生错误,则意味着创建成功,我们检查一下:

$ gcloud pubsub topics list
---
name: projects/pkslow/topics/pkslow-poc $ gcloud pubsub subscriptions list
---
ackDeadlineSeconds: 20
enableMessageOrdering: true
expirationPolicy:
ttl: 300000.500s
labels:
foo: bar
messageRetentionDuration: 1200s
name: projects/pkslow/subscriptions/pkslow-poc
pushConfig: {}
retainAckedMessages: true
retryPolicy:
maximumBackoff: 600s
minimumBackoff: 10s
topic: projects/pkslow/topics/pkslow-poc

注意:我们并没有提供任何密码或密钥,那Terraform怎么可以直接操作我的GCP资源呢?因为它会根据环境变量GOOGLE_APPLICATION_CREDENTIALS来获取。

发送和接收消息

我们通过gcloud来发送消息到Pub/Sub上:

$ gcloud pubsub topics publish pkslow-poc --message="www.pkslow.com"
messageIds:
- '3491736520339885' $ gcloud pubsub topics publish pkslow-poc --message="Larry Deng"
messageIds:
- '3491738650256958' $ gcloud pubsub topics publish pkslow-poc --message="Hi, pkslower"
messageIds:
- '3491739306095970'

从Pub/Sub拉取消息:

$ gcloud pubsub subscriptions pull pkslow-poc --auto-ack

我们还能在GCP界面上监控对应的队列,十分方便:


通过Google Cloud Storage(GCS)管理Terraform的状态State

管理Terraform状态文件的最佳方式是通过云端的统一的存储,如谷歌云就用GCS。

首先要创建一个Bucket:

$ gsutil mb -p pkslow -l us-west1 -b on gs://pkslow-terraform
Creating gs://pkslow-terraform/... $ gsutil ls gs://
gs://pkslow-terraform/

然后在Terraform文件中配置对应的信息:

terraform {
backend "gcs" {
bucket = "pkslow-terraform"
prefix = "state/gcp/pubsub"
}
}

初始化后,就会在Bucket上创建对应的目录:

$ terraform init -plugin-dir=${TERRAFORM_PLUGIN}

变更生效:

$ terraform apply -auto-approve

我们在浏览器查看一下,发现已经成功状态了对应的状态文件:

通过远程的云端,不仅可以存入状态文件,也可以从状态文件读取数据,如一些输出变量。比如模块A创建了一个VM,而我们可能通过这种方式获取它的IP,以便在其它模块使用。大致的配置如下:

data "terraform_remote_state" "foo" {
backend = "gcs"
config = {
bucket = "terraform-state"
prefix = "prod"
}
} resource "template_file" "bar" {
template = "${greeting}" vars {
greeting = "${data.terraform_remote_state.foo.greeting}"
}
}

《Terraform 101 从入门到实践》 Terraform在公有云GCP上的应用的更多相关文章

  1. 《Terraform 101 从入门到实践》 第一章 Terraform初相识

    <Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 初闻不知Terraform, ...

  2. 《Terraform 101 从入门到实践》 第二章 Providers插件管理

    <Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 不怕出身低,行行出状元. 插 ...

  3. 《Terraform 101 从入门到实践》 第三章 Modules模块化

    <Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 模块的概念 模块化是Terr ...

  4. 《Terraform 101 从入门到实践》 第四章 States状态管理

    <Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 军书十二卷,卷卷有爷名. 为 ...

  5. Azure Terraform(十二)利用 Terraform 将文件上传到 Azure Blob Storage

    一,引言 本篇文章中,我门将学习如何利用 Terraform 将 文件以及文件夹上传到 Azure Blob Storage,这个对于我们来说很方便,可以将一些不重要的内容也存储在源代码管理工具中! ...

  6. 《Github入门与实践》读书笔记 蟲咋先生的追求之旅(上)

    <Github入门与实践>作者: [日] 大塚弘记 译者:支鹏浩/刘斌   简介 本书从Git的基本知识和操作方法入手,详细介绍了GitHub的各种功能,GitHub与其他工具或服务的协作 ...

  7. Python编程从入门到实践笔记——异常和存储数据

    Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...

  8. Python编程从入门到实践笔记——文件

    Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...

  9. Python编程从入门到实践笔记——类

    Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...

  10. Python编程从入门到实践笔记——函数

    Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...

随机推荐

  1. 在 Tomcat 10.x 上部署 SpringMVC 5.x

    在Tomcat10.x 上部署 SpringMVC 5.x的时候,项目一直无法访问 运行截图 原因 Tomcat10基于Jakarta EE 9,其中api的包名已经从javax更改到jakarat ...

  2. 使用SunnyUI的datagridview常用代码(个人常用)

    1.窗体加载时初始化grid private void LayOut() { dgv.Font = new System.Drawing.Font("微软雅黑", 9F); dgv ...

  3. netty系列之:在netty中使用proxy protocol

    目录 简介 netty对proxy protocol协议的支持 HAProxyMessage的编码解码器 netty中proxy protocol的代码示例 总结 简介 我们知道proxy proto ...

  4. vue项目中,alert使用

    methods:{ sendData() { ··· // 中间省略的代码 alert(`发送成功,连接失败的号码有:${failList}`) // failList里存的是后台返回的数据 } }

  5. 「Docker学习系列教程」9-Docker容器数据卷介绍

    通过前面8篇文章的学习,我们已经学会了docker的安装.docker常用的命令已经docker镜像修改后提交的远程镜像仓库及提交到公司的私服仓库中.接下来,我们再来学学Docker另外一个重要的东西 ...

  6. 关于如何在C#中调用C++的DLL,以及如何在C++中调用C#的DLL

    一.关于如何在C#中调用C++的DLL,以及如何在C++中调用C#的DLL 注:clr指公共语言运行库 CLR是一门非常恶搞的语言,就好像是在C++里面写C#的文件一样,也就是一种所谓的"托 ...

  7. Django 连接各数据库配置汇总(sqlite3,MySql,Oracle)

    在django中,默认配置的数据库是 sqlite3 # Database # https://docs.djangoproject.com/en/2.0/ref/settings/#database ...

  8. 安装node.js与webpack创建vue2项目

    本文为博主原创,转载请注明出处: 1.安装node.js 下载地址:http://nodejs.cn/download/ (可查看历史版本) node.js 中文网:http://nodejs.cn/ ...

  9. 2022弱口令实验室招新赛CTF赛道WriteUp

    Misc 签到 下载附件,得到一张二维码. 扫码,然后根据提示"linux"操作系统,直接cat /flag,得到flag. EasyMisc 下载得到EasyMisc附件,压缩包 ...

  10. [python] ​python-pinyin库

    python-pinyin库是一个汉字拼音转换工具,其主要功能有: 根据词组智能匹配最正确的拼音. 支持多音字. 简单的繁体支持, 注音支持. 支持多种不同拼音风格. 安装命令为:pip instal ...