terraformer 饥荒(《Terraform 101 从入门到实践》 Terraform在公有云GCP上的应用)
《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}" } }创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!