34

Use helm install can set value when install a chart like:

helm install --set favoriteDrink=slurm ./mychart

Now want to set value like:

helm install --set aws.subnets="subnet-123456, subnet-654321" ./mychart

But failed:

Error: failed parsing --set data: key " subnet-654321" has no value

It seems that helm's --set know comma , and check the next string as a key. So can't use in this case when set such string?


Tested this way

helm install charts/mychart \
    --set aws.subnets={subnet-123456,subnet-654321}

Got error:

Error: This command needs 1 argument: chart name

This way works

helm install charts/mychart \
    --set aws.subnets="subnet-123456\,subnet-654321"

Reference

https://helm.sh/docs/intro/using_helm/#the-format-and-limitations-of---set

Zach
  • 694
  • 10
  • 20
online
  • 4,919
  • 10
  • 32
  • 47

4 Answers4

19

According to https://github.com/kubernetes/helm/issues/1987#issuecomment-280497496, you set multiple values using curly braces, for example:

--set foo={a,b,c}

So, in your case it would be like this

--set aws.subnets={subnet-123456,subnet-654321}
Javier Salmeron
  • 8,365
  • 2
  • 28
  • 23
  • 1
    Thank you for your answer. That doesn't work for me. I posted the result to the question. And also added the right way. – online Jan 18 '18 at 09:01
15

The CLI format and limitations can vary depending on what would be expected in a YAML version. For example, if the YAML manifest requires fields to be populated with a list of values the YAML would look like this:

field:
  - value1
  - value2
  - value3 

This would be expressed in the helm CLI like so

--set field[0]=value1 --set field[1]=value2 --set field[2]=value3

The documentation also refers to --set field={value1,value2,value3} working. In some cases that results in Error: This command needs 1 argument: chart name which is why I provide the above suggestion

There are also limitations to what characters may be used per the documentation:

You can use a backslash to escape the characters; --set name="value1\,value2" will become:

name: "value1,value2"
Marc
  • 4,820
  • 3
  • 38
  • 36
  • Unfortunately this does not work for me in helm 2.13.1: `helm install deploy/traefik/chart --set externalIps[0]="a" --set externalIps[1]="b" --debug --dry-run` gives back `zsh: no matches found: externalIps[0]=a` – David Fernandez Dec 03 '19 at 17:44
  • What about if your list items aren't a single value but a set of values, e.g. an ingress' paths list has a path, and a backend with a serviceName and servicePort. How can I do this and pass a full table of key-values, or just set one value and keep the rest? – Kajsa May 21 '20 at 14:42
  • @DavidFernandez You have to escape the square brackets to prevent your shell (zsh in your case) from interpreting them: `helm install deploy/traefik/chart --set 'externalIps[0]="a"' --set 'externalIps[1]="b"' --debug --dry-run` – ᴠɪɴᴄᴇɴᴛ Jun 07 '22 at 08:42
9

With this change being merged, Helm now supports using multiple --set command with helm install command.

Taking from the link mentioned above:

Manually tested, and looks awesome!

⇒  helm install --dry-run --debug docs/examples/alpine \
  --set foo=bar \
  --set bar=baz,baz=lurman \
  --set foo=banana

SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/k8s.io/helm/docs/examples/alpine
NAME:   masked-monkey
REVISION: 1
RELEASED: Thu Jan 12 17:09:07 2017
CHART: alpine-0.1.0
USER-SUPPLIED VALUES:
bar: baz
baz: lurman
foo: banana

COMPUTED VALUES:
Name: my-alpine
bar: baz
baz: lurman
foo: banana
...

As expected, the last --set overrode the first --set.

P.S: Upgrade your Helm version in case this doesn't work for you. It worked perfectly for me with Helm-v3.0.1.

Magus
  • 2,905
  • 28
  • 36
Amit Yadav
  • 4,422
  • 5
  • 34
  • 79
3

Regarding this comment How to set multiple values with helm? I used quotes and this worked:

--set aws.subnets="{subnet-123456,subnet-654321}"
acca
  • 61
  • 2
  • This does not work for me, I am getting a strange `spec: [a b c]` when I do `helm install deploy/traefik/chart --set externalIps="{a,b,c}" --debug --dry-run` – David Fernandez Dec 03 '19 at 17:42