使用Teraform来对Cloudflare Zerotrust配置管理

#Terraform #Cloudflare

Table of Contents

在使用terraform的时候总会遇到一个问题,控制台好用但是无法进行方便的批量配置。Terraform 可以批量但是会存在覆盖远端配置的情况。 所以这里需要模拟在这个场景下的实践方案

  1. 需要在TF变更前同步到最新的远端配置
  2. 需要使用 TF来进行配置管理。

主要依赖工具:

前置配置

因为 Cf- terraforming 和 terraform 都是使用API来完成资源控制的所以这里需要先在 Cloudflare 上面获取api token/api key

CF-terraforming 的key持久化

~/.cf-terraforming.yaml 中配置相关的key

 email: "[email protected]"
 key: "xoookjjd"

这样不需要每次都重新的设置CF 相关的环境变量

Terraform 的环境变量配置

在使用Terraform的时候,需要在在环境变量中获取Cloudflare 的key。

export CLOUDFLARE_EMAIL=xxx@xxxcn
export CLOUDFLARE_API_TOKEN=1fHud91jd
export CLOUDFLARE_ACCOUNT_ID=8a3***

导入资源

为了实现 控制台和本地资源的双向同步,需要先使用cf-tf 来吧控制台的配置导出成本地的TF文件。

获取相关资源ID

由于这里变更的是 cloudflare_access 所以需要获取相关的 accountid 8a3***

这里需要注意的是 Cloudflare 的设计逻辑,ID 有两种

  1. ZoneID 域名级别的资源,如限频策略,白名单
  2. AccountID 全局的账户级别资源,如Zerotrust

使用 generate 命令来把控制台的配置反向配置成为本地的 TF 文件,文件中记录的就是我们现有配置在 terraform 中的模样

cf-terraforming generate -a 8a3***  --resource-type "cloudflare_access_application"   > cloudflare_access_application.tf

在有了TF 文件之后,需要更新本地的状态。使用下面的语句生成 import 的命令。会生成批量的 import 命令

cf-terraforming import --resource-type "cloudflare_access_application"  -a 8a3***

得到命令之后,在终端执行。至此我们完成把 Cloudflare 的配置转化为本地的TF文件,而且本地的资源状态与cf控制台一致

后面我们就可以开始配置管理。

配置管理

使用Teerraform 进行批量配置管理

有了TF 配置文件后,我们设置provider。

terraform {
  required_providers {
    cloudflare = {
      source = "cloudflare/cloudflare"
      version = "4.27.0"
    }
  }
}
provider "cloudflare" {
}

然后我们使用 tf文件来创建一个 split tunnel 的资源。以提供给warp客户端实现中国大陆的资源的访问分流。

resource "cloudflare_split_tunnel" "china_split_tunnel_exclude_ryan" {
  account_id = "8a3d922dd*********b970e2" # ID for Ryan
  policy_id  = "84EE989D-6B5B-409D-809B-90D019B5A95A"
  mode       = "exclude"
  tunnels {address = "10.0.0.0/8"}
  tunnels {address = "100.64.0.0/10"}
  tunnels {address = "169.254.0.0/16"}
  tunnels {address = "172.16.0.0/12"}
  tunnels {address = "192.0.0.0/24"}
  tunnels {address = "192.168.0.0/16"}
}

之后使用 Terraform 命令来对上面的嘴唇文件进行应用

terraform plan
terraform apply