代码之家  ›  专栏  ›  技术社区  ›  Adam Luchjenbroers

使用Cloudformation和Pystache导出IP范围和网络掩码

  •  0
  • Adam Luchjenbroers  · 技术社区  · 5 年前

    因此,我得到了一个有趣的单云信息,它允许使用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" }}]}]}
                }
              } 
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Adam Luchjenbroers    5 年前

    好的,我使用一个简单的CloudFormation宏来解决这个问题,该宏接受一个CIDR范围,并返回一个包含CIDR、子网和网络掩码的JSON对象——例如,给定192.168.1.0/24,它将返回以下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得到了计算) 之后 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}}"