《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 AccountsACTIVE ACCOUNT* admin-for-all@pkslow.iam.gserviceaccount.comTo set the active account, run: $ gcloud config set account `ACCOUNT`$ gcloud config list[core]account = admin-for-all@pkslow.iam.gserviceaccount.comdisable_usage_reporting = Trueproject = pkslowYour active configuration is: [default]
应用gcloud创立Pub/Sub
SDK设置好后,就能够应用了,咱们应用它来创立Pub/Sub试试。创立主题和订阅:
$ gcloud pubsub topics create pkslow-testCreated topic [projects/pkslow/topics/pkslow-test].$ gcloud pubsub subscriptions create pkslow-sub --topic=pkslow-testCreated subscription [projects/pkslow/subscriptions/pkslow-sub].
查看是否创立胜利:
$ gcloud pubsub topics list---name: projects/pkslow/topics/pkslow-test$ gcloud pubsub subscriptions list---ackDeadlineSeconds: 10expirationPolicy: ttl: 2678400smessageRetentionDuration: 604800sname: projects/pkslow/subscriptions/pkslow-subpushConfig: {}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: 20enableMessageOrdering: trueexpirationPolicy: ttl: 300000.500slabels: foo: barmessageRetentionDuration: 1200sname: projects/pkslow/subscriptions/pkslow-pocpushConfig: {}retainAckedMessages: trueretryPolicy: maximumBackoff: 600s minimumBackoff: 10stopic: 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-terraformCreating 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}" }}