如何通过Terragrunt配置依赖关联多Oracle Cloud账户下的Docker Server与Docker服务模块
看起来你现在是用Terragrunt管理多个Oracle Cloud免费账户的Docker服务器,还要把各种Docker服务(比如你提到的InfluxDB)精准关联到指定账户下的服务器上对吧?我给你梳理下具体的配置思路和实操步骤,完全贴合你现有的目录结构来改:
核心思路
咱们的核心需求是让每个Docker服务模块能灵活指定要关联哪个Oracle Cloud账户下的Docker Server,不能把依赖路径写死,得做动态关联,同时保证多账户的配置隔离不串线。
第一步:给每个Docker服务指定要绑定的账户
在每个Docker服务的目录(比如docker_services/influxdb)的terragrunt.hcl里,先明确指定这个服务要部署到哪个账户的服务器上,同时动态配置依赖:
# 先引入上级的common配置 include "root" { path = find_in_parent_folders() } locals { # 这里直接指定就行,比如要部署到account_1的服务器就写account_1,换账户改这个值就行 target_docker_account = "account_1" } # 动态关联对应账户的Docker Server依赖 dependency "docker_server" { config_path = "../../docker_servers/${local.target_docker_account}" } # 把依赖拿到的VM公网IP传给docker_service模块 inputs = { # 这里要和你docker_service模块的变量名对应上 vm_public_ip = dependency.docker_server.outputs.vm_public_ip # 其他服务需要的参数比如镜像版本、端口映射也可以放这 docker_image = "influxdb:2.7" port_mappings = "8086:8086" }
第二步:确保Docker Server模块输出正确的IP
在你的modules/docker_server目录下,一定要加一个outputs.tf文件,把VM的公网IP输出出来,这样Terragrunt的依赖才能拿到这个值:
output "vm_public_ip" { type = string description = "公网IP,供Docker服务模块通过SSH连接" value = oci_core_instance.docker_server.public_ip_address }
(这里的oci_core_instance.docker_server要和你docker_server模块里的资源名对应,按需调整即可)
第三步:保证多Oracle Cloud账户的配置隔离
每个账户的docker_servers/account_x/terragrunt.hcl里,要指定该账户专属的OCI凭证,避免多个账户用同一个配置串线,比如:
include "root" { path = find_in_parent_folders() } inputs = { # 指定这个账户的OCI配置文件,如果你用环境变量的话也可以在这里设置 oci_config_profile = "account_1_profile" # 其他该账户专属的参数,比如compartment ID、VM规格等 }
这样每个账户的Docker Server部署时,会用自己的OCI凭证创建资源,不会和其他账户混在一起。
第四步:验证配置
当你要部署InfluxDB服务时,直接进入docker_services/influxdb目录,运行terragrunt apply就行:
- Terragrunt会自动检查你指定的
account_1下的Docker Server是否已经部署 - 如果没部署,会提示你先去部署对应的Docker Server;如果已经部署,会自动拉取它的公网IP,传给docker_service模块
- docker_service模块拿到IP后,就可以通过SSH连接到对应VM部署容器了
额外小贴士
- 要是你有多个服务要关联同一个账户,可以把
target_docker_account变量提到docker_services/common.hcl里,子模块直接引用,不用每个服务都写一遍 - 记得给每个账户的Docker Server配置单独的
docker_server.yaml,里面放该账户的专属参数,比如VM的镜像ID、子网ID等
备注:内容来源于stack exchange,提问作者Ares

