关于java:Terraform-101-从入门到实践-Terraform在公有云GCP上的应用

33次阅读

共计 4554 个字符,预计需要花费 12 分钟才能阅读完成。

《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}"
  }
}

正文完
 0