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

396 views
Skip to first unread message

tariver 16

unread,
Feb 9, 2023, 7:01:27 AM2/9/23
to Ansible Project
Greeting!
Asked it on stackoverflow, 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?

Rowe, Walter P. (Fed)

unread,
Feb 9, 2023, 8:00:41 AM2/9/23
to ansible...@googlegroups.com
#!/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
--
Walter Rowe, Division Chief
Infrastructure Services, OISM
Mobile: 202.355.4123

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/18d93d65-bd16-45d1-a813-9be828ffed68n%40googlegroups.com.

tariver 16

unread,
Feb 9, 2023, 8:57:02 AM2/9/23
to Ansible Project
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:

Rowe, Walter P. (Fed)

unread,
Feb 9, 2023, 9:06:24 AM2/9/23
to ansible...@googlegroups.com
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
--
Walter Rowe, Division Chief
Infrastructure Services, OISM
Mobile: 202.355.4123

tariver 16

unread,
Mar 2, 2023, 11:22:45 AM3/2/23
to Ansible Project
I've opened an issue at Ansible GitHub and got explained how argv parameter works.

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),
> 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):
Reply all
Reply to author
Forward
0 new messages