如何在 helmfile 中获取值

How to get values in helmfile

bases:
  - common.yaml


releases:
  - name: controller
    values:
      - values/controller-values.yaml
    hooks:
    - events: [ "presync" ]
    ....
    - events: [ "postsync" ]
    .....

common.yaml

environments:
  default:
    values:
      - values/common-values.yaml

共同价值观

a:b

当我将它添加到 common.values 时,我想将钩子的值移动到文件中,但我想将它添加到不同的文件而不是公共文件,所以我尝试添加 base

bases:
  - common.yaml
  - hooks.yaml

releases:
  - name: controller
    values:
      - values/controller-values.yaml
    hooks:
{{ toYaml .Values.hooks | indent 6 }}

hooks.yaml

environments:
  default:
    values:
      - values/hooks-values.yaml

挂钩-values.yaml

hooks:
  - events: [ "presync" ]
    ....
  - events: [ "postsync" ]
    .....
    

但是我得到一个错误 解析:模板:stringTemplate:21:21:在 <.Values.hooks> 处执行“stringTemplate”:地图没有键“hooks”的条目

我也试过改成o

hooks:
  - values/hooks-values.yaml

我得到了一个错误 第 22 行:无法将 !!str values/... 解组为 event.Hook

我认为第一个问题是在 bases: 下同时指定 common.yamlhooks.yaml 时,它们没有正确合并。由于它们提供相同的密钥,因此很可能稍后包含在 bases: 下的那个会覆盖另一个。

要解决这个问题,您可以在 helmfile 中使用 bases 中的单个条目:

bases:
  - common.yaml

然后将您的值文件添加到 common.yaml:

environments:
  default:
    values:
      - values/common-values.yaml
      - values/hooks-values.yaml

我不认为这是最佳做法,但它应该有效:)

第二个问题是bases被特殊对待,i.e. helmfile.yaml is rendered before base layering is processed, therefore your values (coming from bases) are not available at a point where you can reference them directly in the helmfile. If you embedded environments directly in the helmfile, it would be fine. But if you want to keep using bases, there seems to be couple of workarounds, and the simplest seemed to be adding --- after bases as explained in the next comment on the same thread.

因此,您的 helmfile 的工作版本可能是:

bases:
  - common.yaml

---

releases:
  - name: controller
    chart: stable/nginx
    version: 1.24.1
    values:
      - values/controller-values.yaml
    hooks:
      {{ toYaml .Values.hooks | nindent 6 }}

PS:chart: stable/nginx只是随机选择的,能够helmfile build