2017-09-05 182 views
0

我一直在测试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 
    : 
    : 

已经阅读各种类型的瓦尔(字符串,列表,地图),我不知道如果我要问,甚至有可能,但它将允许的集中(全球)来源所有环境都可以从中获得的数据。

我想知道以前是否有人考虑/调查过这种方法,或者是否有更简单的方法可能会丢失。

任何想法或意见,将不胜感激。

干杯

+0

我想我应该在这个问题背后解释更多 - 想要考虑使用散列(有些时候,一些如何)的原因与您在木偶中使用hiera的方式类似:要有一个通用的键盘系统,可能被覆盖的值对降低了散列值。合并将允许使用变量重复的单一数据源最小化。 –

回答

1

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等)的模型。

相关问题