'messaging/rabbitmq_policy' fails to set up policy parameters requiring integer as the input

62 views
Skip to first unread message

Huaxing Sun

unread,
Feb 5, 2015, 3:29:41 AM2/5/15
to ansible...@googlegroups.com, huaxi...@sonymobile.com
I keep getting error with the following ansible command.
...
- name: create policy
  rabbitmq_policy:
    name={{ item.name }}
    vhost={{ item.vhost | default('/', false) }}
    pattern={{ item.pattern }}
    priority={{ item.priority }}
    tags={{ item.tags }}
  with_items: rabbitmq_policy_configuration
...
where 'rabbitmq_policy_configuration' is
rabbitmq_policy_configuration
-name: GLOBAL
  vhost
: /
  pattern
: .*
  priority
: 0
  tags
: ha-mode=all,ha-sync-mode=automatic,max-length=1000000,expires=1296000000

When the module processes this configuration, the value of 'tags' is converted strictly to a string.
But in fact, the values of 'max-length' and 'expires' must be ints for rabbitmqctl(assuming people understand what rabbitmqctl does) to work properly.

This is the error message
failed: [10.*.*.*] => (item={'priority': 0, 'vhost': '/', 'tags': 'ha-mode=all,ha-sync-mode=automatic,max-length=1000000,expires=1296000000', 'name': 'GLOBAL', 'pattern': '.*'}) => {"cmd": "/usr/sbin/rabbitmqctl -q -n rabbit set_policy -p / GLOBAL '.*' '{\"ha-sync-mode\": \"automatic\", \"expires\": \"1296000000\", \"ha-mode\": \"all\", \"max-length\": \"1000000\"}' --priority 0", "failed": true, "item": {"name": "GLOBAL", "pattern": ".*", "priority": 0, "tags": "ha-mode=all,ha-sync-mode=automatic,max-length=1000000,expires=1296000000", "vhost": "/"}, "rc": 2}
stderr: Error: Validation failed

<<"1296000000">> is not a valid queue expiry

msg: Error: Validation failed

According to ansible docs, 'tags' can be a dictionary so I tried with this
rabbitmq_policy_configuration:
- name: GLOBAL
  vhost
: /
  pattern
: .*
  priority
: 0
  tags
:
     ha
-mode: all
     ha
-sync-mode: automatic
     max
-length: 1000000
     expires
: 1296000000
But it did not prevail.
 
failed: [10.*.*.*] => (item={'priority': 0, 'vhost': '/', 'tags': {'ha-sync-mode': 'automatic', 'expires': 1296000000, 'ha-mode': 'all', 'max-length': 1000000}, 'name': 'GLOBAL', 'pattern': '.*'}) => {"failed": true, "item": {"name": "GLOBAL", "pattern": ".*", "priority": 0, "tags": {"expires": 1296000000, "ha-mode": "all", "ha-sync-mode": "automatic", "max-length": 1000000}, "vhost": "/"}}
msg
: this module requires key=value arguments (['name=GLOBAL', 'vhost=/', 'pattern=.*', 'priority=0', 'tags={ha-sync-mode:', 'automatic,', 'expires:', '1296000000,', 'ha-mode:', 'all,', 'max-length:', '1000000}'])


FATAL
: all hosts have already failed -- aborting


Could anyone please help pointing out what I have done wrong? I read the source of rabbitmq_policy on github and did not spot any type conversions of individual parameter values belong to the argument of 'tags'. I am starting to doubt there is a bug.

FYI these are the environment information
Ansible version: 1.7.2-1ppa~precise
PC environment: Ubuntu 12.04

James Cammarata

unread,
Feb 5, 2015, 4:13:38 AM2/5/15
to ansible...@googlegroups.com, huaxi...@sonymobile.com
Hi Huaxing,

This appears to be a simple formatting error. In your first example, you are mixing up the "complex argument" form (where everything is formatted as a dictionary in the YAML) but are specifying the tags as a comma separated list. You should be using the dictionary format for YAML for this instead:

  tags: 
    ha-modeall
    ha-sync-modeautomatic
    max-length1000000
    expires1296000000

And rather than using the k=v format for your task, you should be using the complex form:

- name: create policy
  rabbitmq_policy:
    name: "{{ item.name }}"
    vhost: "{{ item.vhost | default('/', false) }}"
    pattern: "{{ item.pattern }}"
    priority: "{{ item.priority }}"
    tags: "{{ item.tags }}"
  with_items: rabbitmq_policy_configuration

Let us know if this doesn't get you past the error.

Thanks!

--
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 post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/147323c3-d91e-4a89-83d9-9978866ac315%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Huaxing Sun

unread,
Feb 5, 2015, 4:56:06 AM2/5/15
to ansible...@googlegroups.com, huaxi...@sonymobile.com
James, thank you for the quick reply. Your advice fixed my problem. Complex form it is!!!
Reply all
Reply to author
Forward
0 new messages