terraform可以使用可变散列或映射或映射在.tf文件中创建数据条目吗?
我一直在测试terraform(v.0.10),为企业在AWS中配置EC2实例,安全组,RDS实例等。terraform可以使用可变散列或映射或映射在.tf文件中创建数据条目吗?
我使用一个模块的方法,这样可以将这些“来源”为我的每一个环境:
apps:
main.tf
app.tf
vars.tf
sec_groups:
main.tf
sec_group.tf
vars.tf
:
:
对于每一个我的环境中(非督促,督促)我采购这些模块,并将terraform状态存储在远程s3存储桶中 - 每个环境一个存储桶。
我为每个环境提供像subnet_cidrs,VPC名称等等的必要变量,并创建环境:VPC具有相关的子网,其中包含相关的EC2实例......都很好!
当我使用各自的规则来添加安全组(我在各种类型的EC2实例和环境中有许多安全组)时,我的挑战就来了。
虽然我可以在合适的sec_group.tf文件中创建规则库并添加出口/入口规则(每个规则都有它们的from_port,to_port,protocol,cidr_blocks ..)我想知道是否可以基于(json)数据散列?
我的想法是,这种全球数据层次结构可以用来保存规则,并且可以处理它们来为每个环境收集相关规则,并且只应用那些与'terraform apply'正在运行的当前环境相关的规则,那里有2或200条规则。事情是这样的:
non-prod-env:
ssh:
from_port: 22
to_port: 22
protocol: "tcp"
cidr_blocks:
- 10.1.1.1
- 10.2.2.2
:
:
smtp:
from_port: 25
to_port: 25
protocol: "tcp"
cidr_blocks:
- 100.1.1.1
- 100.2.2.2
:
:
prod-env:
ssh:
from_port: 22
to_port: 22
protocol: "tcp"
cidr_blocks:
- 11.1.1.1
- 11.2.2.2
:
:
已经阅读各种类型的瓦尔(字符串,列表,地图),我不知道如果我要问,甚至有可能,但它将允许的集中(全球)来源所有环境都可以从中获得的数据。
我想知道以前是否有人考虑/调查过这种方法,或者是否有更简单的方法可能会丢失。
任何想法或意见,将不胜感激。
干杯
Terraform不支持嵌套的地图,但(terraform#2114),但你也许可以用External Data Source从全局的JSON文件中读取。
这是一个完整的选项,但我已经确定逻辑操作超出了HCL设计的目的,而更复杂的业务流程应该放入定制提供程序中。 HCL计划应该明确其所做的事情,而不是从外部资源中获取。以下是我解决ACL和安全组规则:
ACL:
其中变量network_ssh_access
是这个VPC
variable network_ssh_access {
type = "list"
default = []
}
resource "aws_network_acl" "main" {
vpc_id = "${aws_vpc.main.id}"
}
resource "aws_network_acl_rule" "network_ssh_access" {
count = "${length(var.network_ssh_access)}"
network_acl_id = "${aws_network_acl.main.id}"
rule_number = "${200 + count.index}"
egress = false
protocol = "tcp"
rule_action = "allow"
cidr_block = "${element(var.network_ssh_access, count.index)}"
from_port = 22
to_port = 22
}
安全组允许的CIDR块的列表: 其中变量appname_ssh_access
是应用程序允许的被称为“appname”的cidr块列表
variable appname_ssh_access {
type = "list"
default = []
}
resource "aws_security_group" "appname" {
name = "appname"
}
resource "aws_security_group_rule" "allow_all" {
count = "${length(var.appname_ssh_access)}"
type = "ingress"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = "${element(var.network_ssh_access, count.index)}"
security_group_id = "${aws_security_group.appname.id"
}
然后,您将复制t他的其他端口和协议(邮件,http,https等)的模型。
我想我应该在这个问题背后解释更多 - 想要考虑使用散列(有些时候,一些如何)的原因与您在木偶中使用hiera的方式类似:要有一个通用的键盘系统,可能被覆盖的值对降低了散列值。合并将允许使用变量重复的单一数据源最小化。 –