Passing to a module a list of values

Hello,

I’m currently trying to create a module to manage poudriere (which is a tool to manage package repository for FreeBSD).

When I use the pkgng module this way, the command pkgng is actually called once, and the “name” argument is a list of all values contained in the list provided :

  • name: sample pkgng
    pkgng: name=“{{item}}” state=present
    with_items: [ a, b, c]

But, when I call my poudriere module :

  • name: sample poudriere
    poudriere: name=“{{item}}” jail=jailname
    with_items: [ a, b, c]

the module is called three times, once per item value.

I assumed that to get the module called only once, all I had to do is to declare the “name” argument as of type ‘list’, but this is not working :
module = AnsibleModule(
argument_spec = dict(
name = dict(required=True, type=‘list’),
jail = dict(required=True),
),
supports_check_mode = True,
)

In my module, module.params[‘name’] is actually a list, but it contains a single value each time.

What am I missing ?

Thanks,
SD

Hi,

Some modules (I think the yum module is one example) have a code optimization which allows them to handle a list passed to them in one go, rather than in multiple invocations of the code.

I suggest you have a look at the code for the yum module http://docs.ansible.com/ansible/yum_module.html
I haven’t looked myself but there may also be an action plugin for yum to support this optimization.

Hope this helps,

Jon

If you are passing the list directly to name= it should 'just work',
if you are passing it through with_ ... your module needs to be
configured in squash_actions configuration. Be aware that we are
considering removing this 'magic'.

Hello !

It was the “squash_action” I was missing. Thanks a lot!

But passing a list directly to the name= is a good idea. I’ll try that.