使用Teraform来对Cloudflare Zerotrust配置管理
Table of Contents
前
在使用terraform的时候总会遇到一个问题,控制台好用但是无法进行方便的批量配置。Terraform 可以批量但是会存在覆盖远端配置的情况。 所以这里需要模拟在这个场景下的实践方案
- 需要在TF变更前同步到最新的远端配置
- 需要使用 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 有两种
- ZoneID 域名级别的资源,如限频策略,白名单
- 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