google-cloud-platform - GCP 部署管理器数据重用
问题描述
我正在生成一个 GCP 部署管理器模板,它描述了大量相同的(100 多个)主机,它们都具有相同的(大)用户数据。
在 AW CloudFormation 中,可以使用某种数据重用,您可以在其中定义一段数据并在许多地方进行引用,从而大大减少模板大小。
在 GCP 中可以有这样的东西吗?我没能找到类似的东西。
我该如何解决这个问题?
解决方案
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"
}
推荐阅读
- linux - 将 Find 命令的输出附加到 Bash 脚本中的变量
- javascript - 使用 PHP ping 发送
- android-studio - Flutter 创建命令不成功
- c# - 我应该缓存和重用从 HttpClientFactory 创建的 HttpClient 吗?
- subquery - 作为 DB2 查询中的列的子选择
- php - PHP Cookie 检查在 Bootstrap 导航栏中不起作用
- node.js - Google Cloud PubSub 不确认消息
- java - java - 如何在没有Spring的情况下在Java中配置MongoDB以访问公共连接池?如何使用单例模式建立与 DB 的公共连接?
- python-3.x - 如何将同一目录中的文件名传递给 python 变量?
- regex - 正则表达式:获取我所有文档中使用的所有主题标签和提及