首页 > 解决方案 > GCP 部署管理器数据重用

问题描述

我正在生成一个 GCP 部署管理器模板,它描述了大量相同的(100 多个)主机,它们都具有相同的(大)用户数据。

在 AW CloudFormation 中,可以使用某种数据重用,您可以在其中定义一段数据并在许多地方进行引用,从而大大减少模板大小。

在 GCP 中可以有这样的东西吗?我没能找到类似的东西。

我该如何解决这个问题?

标签: google-cloud-platform

解决方案


Deployment Manager 支持 jinja 模板,因此您正在寻找的是使用变量(可能还有一些循环):

<% set commonData="blah blah blah" %>

resources:
<% for i in range(100) %>
- type: mytype
  name: host-no-{{ loop.index }}
  properties:
    some-property: {{commonData}}
<% endfor %>

当您使用 gcloud cli 时,这是一种简单的机制,因为您可以调用它并直接提供 jinja 文件(--template 而不是--config):

gcloud deployment-manager deployments create my-deployment --template template.jinja

当您通过 API 创建部署并且无法利用 cli 实用程序拉取和打包模板时,事情会变得更加复杂。

通常,使用 DM 的“正确方法”是拥有一些带有变量、逻辑、循环的模板(jinja 或 py),并使用静态 yaml 文件(config)中的一组参数(属性)调用它们。DM API 的工作方式相同——你需要给它一个 yaml 文件(配置)和可选的所有模板(作为导入)。所以上面的例子可能会变成这样:

config.yaml
-----------------------------
imports:
- template.jinja

resources:
- type: template.jinja
  name: my-template
  properties:
    commonData: blah blah blah

.

template.jinja
-----------------------------
resources:
<% for i in range(100) %>
- type: mytype
  name: host-no-{{ loop.index }}
  properties:
    some-property: {{ properties.commonData }}
<% endfor %>

现在剩下的就是将yaml uglify 成单行并打包成一个与部署资源模式匹配的json 对象(https://cloud.google.com/deployment-manager/docs/reference/latest/deployments#resource)。下面是创建两个具有通用描述的子网的工作示例:

{
  "target": {
    "config": {
      "content": "imports: \n- blah.jinja\nresources: \n- type: blah.jinja\n name: test\n properties:\n description: blah blah blah\n names:\n - one\n - two"
    },
    "imports": [
      {
        "name": "blah.jinja",
        "content": "resources: \n{% for name in properties.names %}\n- type: compute.v1.subnetwork\n name: test-{{name}}\n properties:\n region: europe-west6\n ipCidrRange: 192.168.{{loop.index}}.0/24\n description: {{properties.description}}\n network: default\n{% endfor %}"
      }
    ]
  },
  "name": "too-many-blahs"
}

推荐阅读