passing non-string variable to module

I’m trying to figure out how to pass a non-string variable to a module

https://gist.github.com/uncreative/adfe926267d0ee5b3de3

Has anyone figured it out?

turns inty_var and floaty_var within parametered module into strings:

  • name: thingy with vars

parametered_module.py:
thingy:
stringy_var: “{{ item[‘stringy’] }}”
inty_var: “{{ item[‘inty’] }}”
floaty_var: “{{ item[‘floaty’] }}”
with_items:

  • {‘stringy’: ‘asdf’, ‘inty’: 3, ‘floaty’: 123.21}

Thanks for your help!

Quick note - modules shouldn’t end in “.py”, either when saved or called.

But what you have is fine, you can also do.

  • name: thingy with vars

parametered_module.py:
thingy:
stringy_var: “{{ item.stringy }}”
inty_var: “{{ item.inty }}”
floaty_var: “{{ item.floaty }}”
with_items:

  • {‘stringy’: ‘asdf’, ‘inty’: 3, ‘floaty’: 123.21}

You may also wish to do:

  • name: thingy with vars
    parameterized_module:
    thingy: “{{ item }}”
    with_items:

And just name your hash variables stringy_var vs stringy, etc.

You can also pass variables into with_items, and define your hash elsewhere like:

with_items: my_items

My problem is that when I look at thing[‘inty_var’] in the module it’s a string. that is :


  - name: hard coded thingy
    parametered_module.py:
      thingy:
        stringy_var: 'asdf'
        inty_var: 3
        floaty_var: 123.21
 

Is correctly interpreted by parametered_module as an int. But when I do this:


  - name: thingy with vars
    parametered_module.py:
      thingy:
        stringy_var: "{{ item['stringy'] }}"
        inty_var: "{{ item['inty'] }}"
        floaty_var: "{{ item['floaty'] }}"
    with_items:
    - {'stringy': 'asdf', 'inty': 3, 'floaty': 123.21}

It sees thingy[‘inty_var’] as ‘3’ and the module assumes it’s a string. Is there a way to force inty_var to an int within ansible?

I also tried: inty_var: “{{ item[‘inty’] | int }}” but that is still a string by the time it gets to parametered_module

Thanks for your help!

At least in any current versions of Ansible, if you are passing structured args, like so:

module_name:
foo: “{{ x }}”

It will send JSON and keep types.

Otherwise, you can cast automatically in the module by using the variable “type=” options in the argument_spec of the module, for instance, to declare something should always be treated as an int.

Which you should be doing anyway, as that makes the playbooks cleaner by not having to cast anything in the playbook.

I can’t do this “correctly” inside the module since it’s meant to be a flexible variable.
My problem with

module_name:
foo: “{{ x }}”
is that I would like to use variables within foo
so I have

module_name:
foo:

somevar: “{{ myvar }}”

and this definitely turns myvar into a string.

I guess I can do some parsing of the value within my module and let you do things like

module_name:
foo:

somevar: “int: {{ myvar }}”

but I was hoping there might be a cleaner way.

If you file a github ticket, we can do some digging about variable type preservation.

Though I still recommend in the argument_spec a “type=“int”” or casting in your particular module, it makes everything easier on the caller.