roboll / helmfile

Deploy Kubernetes Helm Charts
MIT License
4.04k stars 566 forks source link

Reference other variables in values.yaml.gotmpl #2078

Open mseiwald opened 2 years ago

mseiwald commented 2 years ago

Hi,

I would like to achieve something like the below.

values.yaml.gotmpl

customer: xxxxx
domain: {{ .Values.customer }}.example.com

This obviously does not work. Is there another way to reference a previous variable in values.yaml.gotmpl that I'm missing?

Thanks!

MurzNN commented 2 years ago

Try to use the recommendation from this document: https://github.com/roboll/helmfile/blob/master/docs/writing-helmfile.md#layering-state-template-files - something like this:

customer: xxxxx
---
domain: {{ .Values.customer }}.example.com
pathob commented 2 years ago

Hi @mumoshu, Hi @MurzNN

I would like to add my question here, I hope that's fine.

Is this also possible with environment values? Can I use Go templating and the state layering there? What I'm trying to do is something like:

org:
  keyvault:
    kv1: org-kv1.vault.azure.net
---
org:
  database:
    postgres96:
      host: ref+azurekeyvault://{{ .Values.org.keyvault.kv1 }}/azure-postgresql-96-host
      user: ref+azurekeyvault://{{ .Values.org.keyvault.kv1 }}/azure-postgresql-96-user
      ...
    postgres11:
      host: ref+azurekeyvault://{{ .Values.org.keyvault.kv1 }}/azure-postgresql-11-host
      user: ref+azurekeyvault://{{ .Values.org.keyvault.kv1 }}/azure-postgresql-11-user
      ...

But it does not work. I get something like:

err: failed to read helmfile.yaml: failed to load environment values file "environments/dev.yaml.gotmpl": failed to render [environments/dev.yaml.gotmpl], because of template: stringTemplate:17:42: executing "stringTemplate" at <.Values.org.keyvault.kv1>: map has no entry for key "org"

Any help would be very appreciated. Thank you!

Ro-Fo commented 2 years ago

Hi, Currently I have the same problem like @pathob

helmfile.yaml

releases:
- name: myservice
  namespace: test
  chart: chart/parent
  values:
  - values.yaml.gotmpl

values.yaml.gotmpl

customer: xxxxx
---
domain: {{ .Values.customer }}.example.com

this leads to the following errors @MurzNN

helmfile write-values
> ... in ./helmfile.yaml: failed to render values files "values.yaml.gotmpl": failed to render [values.yaml.gotmpl], because of template: stringTemplate:3:18: 
executing "stringTemplate" at <.Values.customer>: map has no entry for key "customer"

Thanks for your support.

mumoshu commented 2 years ago

@pathob @Ro-Fo Hey! As far as I remember, I don't think --- was supported in values file templates. It's supported in helmfile.yaml templates so all I can say is that you'd better handle such "layering" in helmfile yamls, not values templates.

You could also try combining dict, merge, readFile, and fromYaml to merge objects, and finally outputting yaml by piping the result to toYaml in your values template.

mathe-matician commented 6 months ago

Same issue here. I'm trying to migrate an existing chart over to helmfile. The original chart used named templates and did a bunch of stuff that can be simplified by templating out a values file w/ helmfile.

So I thought I'd be able to do something like this:

# helmfile
releases:
- name: mychart
  namespace: test
  chart: mychart
  values:
  - values.yaml
  - custom-thing.gotmpl
# values.yaml
trueThing: true
# custom-thing.gotmpl
{{- if .Values.trueThing }}
do it
{{- else }}
don't do it
{{- end }}

How can I achieve this?