# How can I pass variables to command module's argv parameter in Ansible?

**URL:** <https://forum.ansible.com/t/how-can-i-pass-variables-to-command-modules-argv-parameter-in-ansible/37638>\
**Category:** Ansible Project\
**Created:** [February 9, 2023, 12:01pm UTC](https://forum.ansible.com/t/how-can-i-pass-variables-to-command-modules-argv-parameter-in-ansible/37638 "2023-02-09T12:01:27Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![tariver\_16](https://avatars.discourse-cdn.com/v4/letter/t/3d9bf3/32.png) [@tariver\_16](https://forum.ansible.com/u/tariver_16)\
**Post date:** [February 9, 2023, 12:01pm UTC](https://forum.ansible.com/t/how-can-i-pass-variables-to-command-modules-argv-parameter-in-ansible/37638/1 "2023-02-09T12:01:27Z")

</div>

Greeting!

Asked it on [stackoverflow](https://stackoverflow.com/questions/75388765/how-can-i-pass-variables-to-command-modules-argv-parameter-in-ansible), but didn’t get an answer, so I’m trying my luck here.

A bit condensed version:  
I’m trying to write a role that creates a Redis cluster. At some point I must execute redis-cli binary with some parameters:

/usr/bin/redis-cli --user admin --pass mypass --cluster create 10.226.2.194:6379 10.226.2.196:6379 10.226.2.195:6379 --cluster-replicas 1 --cluster-yes

I pass all the required parameters as extra variables when I call the playbook with a shell script:

#!/bin/sh ansible-playbook /etc/ansible/playbook-redis.yml -vv   
–extra-vars=‘redis\_admin\_user=admin redis\_admin\_password=mypass’   
–extra-vars=‘redis\_cluster\_members=“10.226.2.194:6379 10.226.2.196:6379 10.226.2.195:6379” redis\_cluster\_replicas=1’

At first I tried the following:

- name: Create Redis cluster

ansible.builtin.command:

argv:

- /usr/bin/redis-cli

- “–user {{ redis\_admin\_user }}”

- “–pass {{ redis\_admin\_password }}”

- “–cluster create {{ redis\_cluster\_members }}”

- “–cluster-replicas {{ redis\_cluster\_replicas }}”

- –cluster-yes

And got error “Unrecognized option or bad number of args for: ‘–user admin’” which is a redis-cli error.

After some experimenting I found out that if I pass the variables in a separate line some of them work. So this task works and returns info about server.

- name: Get server info

ansible.builtin.command:

argv:

- /usr/bin/redis-cli

- –user

- “{{ redis\_admin\_user }}”

- –pass

- “{{ redis\_admin\_password }}”

- info

So the username and password are recognized be redis-cli, but, unfortunately not the “redis\_cluster\_members”. The following task:

- name: Create Redis cluster

ansible.builtin.command:

argv:

- /usr/bin/redis-cli

- –user

- “{{ redis\_admin\_user }}”

- –pass

- “{{ redis\_admin\_password }}”

- –cluster create

- “{{ redis\_cluster\_members }}”

- –cluster-replicas

- “{{ redis\_cluster\_replicas }}”

- –cluster-yes

returns error “Unrecognized option or bad number of args for: ‘–cluster create’”

I wonder if I’m missing some syntax error or misread the documentation and trying to use argv not the way it’s supposed to be used?

---

<div class="post-metadata">

**Author:** ![Walter\_Rowe](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/walter_rowe/32/4506_2.png) [@Walter\_Rowe](https://forum.ansible.com/u/Walter_Rowe)\
**Post date:** [February 9, 2023, 1:00pm UTC](https://forum.ansible.com/t/how-can-i-pass-variables-to-command-modules-argv-parameter-in-ansible/37638/2 "2023-02-09T13:00:19Z")

</div>

> #!/bin/sh ansible-playbook /etc/ansible/playbook-redis.yml -vv   
> –extra-vars\*\*=**‘redis\_admin\_user=admin redis\_admin\_password=mypass’   
> –extra-vars**=\*\*‘redis\_cluster\_members=“10.226.2.194:6379 10.226.2.196:6379 10.226.2.195:6379” redis\_cluster\_replicas=1’

Leave off the = and use a space for --extra\_vars.

-e EXTRA\_VARS, --extra-vars EXTRA\_VARS

set additional variables as key=value or YAML/JSON, if filename prepend with @

Walter

---

<div class="post-metadata">

**Author:** ![tariver\_16](https://avatars.discourse-cdn.com/v4/letter/t/3d9bf3/32.png) [@tariver\_16](https://forum.ansible.com/u/tariver_16)\
**Post date:** [February 9, 2023, 1:57pm UTC](https://forum.ansible.com/t/how-can-i-pass-variables-to-command-modules-argv-parameter-in-ansible/37638/3 "2023-02-09T13:57:02Z")

</div>

Thank you for your reply

Changed the shell script to the following:

#!/bin/sh  
ansible-playbook /etc/ansible/playbook-redis.yml -vv   
–extra-vars “redis\_admin\_user=admin redis\_admin\_password=mypass”   
–extra-vars “redis\_cluster\_members=‘10.226.2.194:6379 10.226.2.196:6379 10.226.2.195:6379’”   
–extra-vars “redis\_cluster\_replicas=1”

Got the same error “Unrecognized option or bad number of args for: ‘–cluster create’”

четверг, 9 февраля 2023 г. в 16:00:41 UTC+3, [walte...@nist.gov](mailto:walte...@nist.gov):

---

<div class="post-metadata">

**Author:** ![Walter\_Rowe](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/walter_rowe/32/4506_2.png) [@Walter\_Rowe](https://forum.ansible.com/u/Walter_Rowe)\
**Post date:** [February 9, 2023, 2:06pm UTC](https://forum.ansible.com/t/how-can-i-pass-variables-to-command-modules-argv-parameter-in-ansible/37638/4 "2023-02-09T14:06:00Z")

</div>

I had a problem similar to this once. Your redis command might be getting your cluster members as a single string vs separate ip:port args.

Walter

---

<div class="post-metadata">

**Author:** ![tariver\_16](https://avatars.discourse-cdn.com/v4/letter/t/3d9bf3/32.png) [@tariver\_16](https://forum.ansible.com/u/tariver_16)\
**Post date:** [March 2, 2023, 4:22pm UTC](https://forum.ansible.com/t/how-can-i-pass-variables-to-command-modules-argv-parameter-in-ansible/37638/5 "2023-03-02T16:22:45Z")

</div>

I’ve opened an issue at Ansible GitHub and got explained how argv parameter works.  
[https://github.com/ansible/ansible/issues/79967](https://github.com/ansible/ansible/issues/79967)

Summary:  
This happens because of how module and redis-cli utility work with arguments.

When passing arguments this modules delimits them with single quotation marks, so

- name: Create Redis cluster  
ansible.builtin.command:  
argv:
- /usr/bin/redis-cli
- “–user {{ redis\_admin\_user }}”
- “–pass {{ redis\_admin\_password }}”
- “–cluster create {{ redis\_cluster\_members }}”
- “–cluster-replicas {{ redis\_cluster\_replicas }}”
- –cluster-yes

is passed as (mind the quotation marks)

/usr/bin/redis-cli ‘–user admin’ ‘–pass mypass’ ‘–cluster create 10.226.2.194:6379 10.226.2.196:6379 10.226.2.195:6379’ ‘–cluster-replicas 1’ ‘–cluster-yes’

If you enter this command directly into command line you’ll get the same error - “Unrecognized option or bad number of args for: ‘–user admin’”.

This is because, quoting redis-cli documentation ([https://redis.io/docs/ui/cli/#string-quoting-and-escaping](https://redis.io/docs/ui/cli/#string-quoting-and-escaping)),

> When redis-cli parses a command, whitespace characters automatically delimit the arguments.

So the correct way to pass this command will be (mind the quotation marks)

/usr/bin/redis-cli ‘–user’ ‘admin’ ‘–pass’ ‘mypass’ ‘–cluster’ 'create ’ ‘10.226.2.194:6379’ ‘10.226.2.196:6379’ ‘10.226.2.195:6379’ ‘–cluster-replicas’ ‘1’ ‘–cluster-yes’

So I did a workaround constructing the command as a variable in vars/main.yml and then passing it to the module (I’m going to post it on stackoverflow).

четверг, 9 февраля 2023 г. в 17:06:24 UTC+3, Rowe, Walter P. (Fed):
