使用 Cloudformation 和 Pystache 导出 IP 范围和网络掩码
Deriving IP Range and Netmask using Cloudformation and Pystache
所以,我有一个有趣的 - Cloudformation 允许使用 Mustache 模板(通过 Pystache)通过 AWS::CloudFormation::Init 构建配置文件(他们将这几段隐藏起来,但它在那里)。
这对我很有用,因为我需要写出一些网络详细信息来为 OpenVPN 服务器创建配置文件。到目前为止,还不错。
但这就是它变得棘手的地方 - AWS 喜欢 CIDR 表示法(我需要对 AWS 资源和此使用相同的参数)。但是 OpenVPN 喜欢使用旧的 IP 范围和网络掩码格式。我目前正在尝试找到一种转换它的好方法。我既可以使用 CloudFormation 函数,也可以尝试找到一种在 Mustache 中进行转换的方法。
我可以使用 Fn::Select 和 Fn::Split 的组合来获取 IP 范围来拉取 CIDR 的前半部分,但是目前推导网络掩码让我感到困惑。
目前的例子
"/etc/openvpn/server/configname.conf" : {
"source" : {"Fn::Sub" :
[ "https://${ConfigBucket}.s3.amazonaws.com/Path/To/configname.conf.mustache"
, { "ConfigBucket" : { "Fn::ImportValue" : "ConfigBucket-Export-Name" }} ]
},
"context" : {
"VpnCIDR" : { "Ref" : "VpnCIDRRange"},
"VpnIPRange" : { "Fn::Select" : [ "0", {"Fn::Split" : ["/", { "Ref" : "VpnCIDRRange"}]}]},
"AwsCIDR" : { "Fn::ImportValue" : { "Fn::Sub" : "${VPCName}-VPC-CIDR" } },
"AwsIPRange" : { "Fn::Select" : [ "0", {"Fn::Split" : ["/", { "Fn::ImportValue" : { "Fn::Sub" : "${VPCName}-VPC-CIDR" }}]}]}
}
}
好的,所以我最终使用一个简单的 CloudFormation 宏解决了这个问题,该宏采用 CIDR 范围和 returns 一个包含 CIDR、子网和网络掩码的 JSON 对象 - 例如,给定 192.168。 1.0/24,它将 return 以下 JSON 片段包含在 CloudFormation 模板中
{
'CIDR' : '192.168.1.0/24',
'subnet' : '192.168.1.0',
'netmask' : '255.255.255.0'
}
有问题的代码发布到这个要点:https://gist.github.com/AdamLuchjenbroers/3165ab18bb0ee9da95ad6bf514f415e0
它也可以采用堆栈导出的名称(这是必需的,因为显然 Fn::ImportValue 被评估 AFTER Fn::Transform)以启用交叉在堆栈之间交谈。
然后可以通过 CloudFormation::Init 文件部分中的上下文键传递,如下所示:
"/etc/openvpn/server/openvpn.conf" : {
"source": {
"Fn::Sub": [
"https://${BucketName}.s3.${Region}.amazonaws.com/Path/To/openvpn.conf.mustache",
{
"BucketName": "BucketNameGoesHere",
"Region": { "Ref": "AWS::Region" }
}
]
},
"context": {
"Vpn": {
"Fn::Transform": {
"Name": "NetworkInfo",
"Parameters": {
"CIDR": { "Ref": "VpnCIDRRange" }
}
}
},
"Aws": {
"Fn::Transform": {
"Name": "NetworkInfo",
"Parameters": {
"CIDR-export": { "Fn::Sub": "${VPCName}-VPC-CIDR" }
}
}
}
}
},
然后像这样在实际的胡子模板中引用:
push "route {{Aws.subnet}} {{Aws.netmask}}"
所以,我有一个有趣的 - Cloudformation 允许使用 Mustache 模板(通过 Pystache)通过 AWS::CloudFormation::Init 构建配置文件(他们将这几段隐藏起来,但它在那里)。
这对我很有用,因为我需要写出一些网络详细信息来为 OpenVPN 服务器创建配置文件。到目前为止,还不错。
但这就是它变得棘手的地方 - AWS 喜欢 CIDR 表示法(我需要对 AWS 资源和此使用相同的参数)。但是 OpenVPN 喜欢使用旧的 IP 范围和网络掩码格式。我目前正在尝试找到一种转换它的好方法。我既可以使用 CloudFormation 函数,也可以尝试找到一种在 Mustache 中进行转换的方法。
我可以使用 Fn::Select 和 Fn::Split 的组合来获取 IP 范围来拉取 CIDR 的前半部分,但是目前推导网络掩码让我感到困惑。
目前的例子
"/etc/openvpn/server/configname.conf" : {
"source" : {"Fn::Sub" :
[ "https://${ConfigBucket}.s3.amazonaws.com/Path/To/configname.conf.mustache"
, { "ConfigBucket" : { "Fn::ImportValue" : "ConfigBucket-Export-Name" }} ]
},
"context" : {
"VpnCIDR" : { "Ref" : "VpnCIDRRange"},
"VpnIPRange" : { "Fn::Select" : [ "0", {"Fn::Split" : ["/", { "Ref" : "VpnCIDRRange"}]}]},
"AwsCIDR" : { "Fn::ImportValue" : { "Fn::Sub" : "${VPCName}-VPC-CIDR" } },
"AwsIPRange" : { "Fn::Select" : [ "0", {"Fn::Split" : ["/", { "Fn::ImportValue" : { "Fn::Sub" : "${VPCName}-VPC-CIDR" }}]}]}
}
}
好的,所以我最终使用一个简单的 CloudFormation 宏解决了这个问题,该宏采用 CIDR 范围和 returns 一个包含 CIDR、子网和网络掩码的 JSON 对象 - 例如,给定 192.168。 1.0/24,它将 return 以下 JSON 片段包含在 CloudFormation 模板中
{
'CIDR' : '192.168.1.0/24',
'subnet' : '192.168.1.0',
'netmask' : '255.255.255.0'
}
有问题的代码发布到这个要点:https://gist.github.com/AdamLuchjenbroers/3165ab18bb0ee9da95ad6bf514f415e0
它也可以采用堆栈导出的名称(这是必需的,因为显然 Fn::ImportValue 被评估 AFTER Fn::Transform)以启用交叉在堆栈之间交谈。
然后可以通过 CloudFormation::Init 文件部分中的上下文键传递,如下所示:
"/etc/openvpn/server/openvpn.conf" : {
"source": {
"Fn::Sub": [
"https://${BucketName}.s3.${Region}.amazonaws.com/Path/To/openvpn.conf.mustache",
{
"BucketName": "BucketNameGoesHere",
"Region": { "Ref": "AWS::Region" }
}
]
},
"context": {
"Vpn": {
"Fn::Transform": {
"Name": "NetworkInfo",
"Parameters": {
"CIDR": { "Ref": "VpnCIDRRange" }
}
}
},
"Aws": {
"Fn::Transform": {
"Name": "NetworkInfo",
"Parameters": {
"CIDR-export": { "Fn::Sub": "${VPCName}-VPC-CIDR" }
}
}
}
}
},
然后像这样在实际的胡子模板中引用:
push "route {{Aws.subnet}} {{Aws.netmask}}"