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