首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将变量从shell脚本传递到部署yaml的问题

将变量从shell脚本传递到部署yaml的问题
EN

Stack Overflow用户
提问于 2022-09-09 17:44:47
回答 1查看 43关注 0票数 0

在shell脚本中,我希望为一个变量分配在部署中的值中使用什么。对于我的生活,我不知道如何使它工作。

为了设置要使用我的变量的值,我的helm部署脚本文件有以下内容:

代码语言:javascript
复制
   --set AuthConfValue=$AUTH_CONF_VALUE

为了使用变量,我在deployment.yaml文件中使用了以下内容:

代码语言:javascript
复制
   - name: KONG_SETTING

   value: "{ {{ .Values.AuthConfValue }} }"

如果我在shell脚本中分配变量,如下所示:

代码语言:javascript
复制
   AUTH_CONF_VALUE="ernie"

它将工作,并且部署中的值将如下所示:

代码语言:javascript
复制
   value: '{ ernie }'

现在,如果我尝试像这样赋值变量:

代码语言:javascript
复制
   AUTH_CONF_VALUE="\\\"ernie\\\":\\\"123\\\""

然后,当舵机部署运行时,我将得到错误error converting YAML to JSON: yaml: line 118: did not find expected key

我希望这将给我在部署中的以下价值:

代码语言:javascript
复制
   value: "{ "ernie":"123" }"

如果我将该值硬编码到deployment.yaml中,则如下所示:

代码语言:javascript
复制
   - name: KONG_SETTING

   value: "{ \"ernie\": \"123\" }"

然后运行helm部署,它将工作,并在部署中填充以下值-

代码语言:javascript
复制
   value: "{ "ernie":"123" }"

有人能告诉我我是否/如何能做到这一点吗?

EN

回答 1

Stack Overflow用户

发布于 2022-09-10 00:26:07

Helm --set option还使用反斜杠转义。因此,在您的示例中,主机外壳中的$AUTH_CONF_VALUE变量在每个引号之前包含一个反斜杠,这是由--set使用的,因此.Values.AuthConfValue根本不包含反斜杠,因此您将得到无效的YAML。

如果您希望尽可能接近现有的表单,那么让我们构造一个没有反斜杠的字符串(希望没有逗号或括号,因为这些字符串对--set也有特殊意义)

代码语言:javascript
复制
AUTH_CONF_VALUE='"ernie":"123"'
helm install --set AuthConfValue="$AUTH_CONF_VALUE" .

当Helm扩展一个模板时,它对可能使用它的上下文一无所知。就你而言,你知道

  1. .Values.AuthConfValue是JSON对象
  2. 的主体,如果您用大括号{ ... }包围它,那么它应该是一个有效的JSON对象
  3. ,您需要将它转换为正确转义的YAML字符串

Helm包含一个文档很少的toJson函数,它接受任意对象并将其转换为JSON;任何有效的JSON也都是有效的YAML。所以最接近你的方法可能看起来

代码语言:javascript
复制
- name: KONG_SETTING
  value: {{ printf "{%s}" .Values.AuthConfValue | toJson }}

如果您愿意更多地修改您的部署过程,则可以减少转义,增加确定性。在上面的序列中,我们有一个恰好是JSON对象的字符串;如果我们有一个实际的对象怎么办?想象一下这样的设置

代码语言:javascript
复制
# kong-auth.yaml
authConf:
  ernie: "123"

您可以在安装时使用helm install -f选项提供此文件。由于有效的JSON是有效的YAML,所以您也可以在这里提供一个JSON文件,而无需更改任何内容。

代码语言:javascript
复制
helm install -f kong-auth.yaml .

现在,对于这个设置,.Values.authConf是一个对象;唯一需要进行的转义是标准的YAML/JSON转义(例如引用"123",所以它是一个字符串,而不是数字)。现在我们可以使用toJson两次,一次用于获取{"ernie":"123"} JSON对象字符串,另一次用于将该字符串转义为值"{\"ernie\":\"123\"}"

代码语言:javascript
复制
- name: KONG_SETTING
  value: {{ .Values.authConf | toJson | toJson }}

设置它需要修改您的部署脚本,但是避免引用和逃避关注点要安全得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73665806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档