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

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?

#!/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

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:

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

I’ve opened an issue at Ansible GitHub and got explained how argv parameter works.
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),

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):