我正在生成GCP部署管理器模板,它描述了大量相同的(100+)主机,它们都有相同的(大)用户数据。
在AW CloudFormation中,可以使用某种类型的数据重用,您可以在其中定义一段数据只是在很多地方引用,所以最小化模板的大小急剧增加。
在GCP中可能有这样的东西吗?我没找到那样的东西。
我该如何解决这个问题?
部署管理器支持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丑化成单行,并打包成与部署资源模式(https://cloud.google.com/deployment-manager/docs/reference/latest/deployments#resource)匹配的json对象。下面是创建两个具有相同描述的子网的工作示例:
{
"target": {
"config": {
"content": "imports: n- blah.jinjanresources: n- type: blah.jinjan name: testn properties:n description: blah blah blahn names:n - onen - two"
},
"imports": [
{
"name": "blah.jinja",
"content": "resources: n{% for name in properties.names %}n- type: compute.v1.subnetworkn name: test-{{name}}n properties:n region: europe-west6n ipCidrRange: 192.168.{{loop.index}}.0/24n description: {{properties.description}}n network: defaultn{% endfor %}"
}
]
},
"name": "too-many-blahs"
}