A list should be fine, and looking at how queuesList is populated, I don't
see any obvious that would not be json serializable.

But to diagnose/debug further, really need the stdout output from invoking
the module directly. ie:

# cd to your ansible src checkout
$ cd ~/src/ansible
$ source hacking/env-setup
$ hacking/test-module -m /path/to/your/new_module.py -a 'src=
/home/ec2-user/ansible/routerconfig.xml'

Looks like your module is writing to stdout from somewhere other than
module.exit_json(), likely via print() in the module code.

The module output has to be _just_ valid json on stdout (the data that
exit_json() writes to stdout). Anything else will cause
failures.

ie, the module stdout is:

"{'cache-size': '5000', 'flowcontrol-start-queuesize': '-1', 'name': 'q1',
'cleanup-interval': '-1', 'persistence-mode': 'non_persistent'}
{'cache-size': '5000', 'flowcontrol-start-queuesize': '-1', 'name': 'q2',
'cleanup-interval': '-1', 'persistence-mode': 'non_persistent'}
{'cache-size': '5000', 'flowcontrol-start-queuesize': '-1', 'name': 'q3',
'cleanup-interval': '-1', 'persistence-mode': 'non_persistent'}
{'name': 'test'}

{"invocation": {"module_args": {"src":
"/home/ec2-user/ansible/routerconfig.xml"}}, "failed": false, "changed":
true, "queueslist": [{"q1": {"cache-size": "5000",
"flowcontrol-start-queuesize": "-1", "propertyCount": 5,
"cleanup-interval": "-1", "persistence-mode": "non_persistent"}}, {"q2":
{"cache-size": "5000", "flowcontrol-start-queuesize": "-1",
"propertyCount": 5, "cleanup-interval": "-1", "persistence-mode":
"non_persistent"}}, {"q3": {"cache-size": "5000",
"flowcontrol-start-queuesize": "-1", "propertyCount": 5,
"cleanup-interval": "-1", "persistence-mode": "non_persistent"}}, {"test":
{"propertyCount": 1}}]}

That first blob looks like debug output to stdout, which is confusing the
module runner. rm it, or write debug info to stderr to avoid the problem.

On Wed, Aug 9, 2017 at 2:52 PM, Adam Shantz <a.mon...@gmail.com> wrote:

> Thanks.  I changed my module & the result is below.  I guess since
> queuesList is technically a list of dicts, it can't be automatically
> serialized?  If I change it from a list to a dict, then I assume things
> should be easier to handle automatically?  I guess I need to do more
> research on how to serialize things.
>
> localhost | FAILED! => {
>     "changed": false,
>     "failed": true,
>     "module_stderr": "",
>     "module_stdout": "{'cache-size': '5000',
> 'flowcontrol-start-queuesize': '-1', 'name': 'q1', 'cleanup-interval':
> '-1', 'persistence-mode': 'non_persistent'}\n{'cache-size': '5000',
> 'flowcontrol-start-queuesize': '-1', 'name': 'q2', 'cleanup-interval':
> '-1', 'persistence-mode': 'non_persistent'}\n{'cache-size': '5000',
> 'flowcontrol-start-queuesize': '-1', 'name': 'q3', 'cleanup-interval':
> '-1', 'persistence-mode': 'non_persistent'}\n{'name':
> 'test'}\n\n{\"invocation\": {\"module_args\": {\"src\":
> \"/home/ec2-user/ansible/routerconfig.xml\"}}, \"failed\": false,
> \"changed\": true, \"queueslist\": [{\"q1\": {\"cache-size\": \"5000\",
> \"flowcontrol-start-queuesize\": \"-1\", \"propertyCount\": 5,
> \"cleanup-interval\": \"-1\", \"persistence-mode\": \"non_persistent\"}},
> {\"q2\": {\"cache-size\": \"5000\", \"flowcontrol-start-queuesize\":
> \"-1\", \"propertyCount\": 5, \"cleanup-interval\": \"-1\",
> \"persistence-mode\": \"non_persistent\"}}, {\"q3\": {\"cache-size\":
> \"5000\", \"flowcontrol-start-queuesize\": \"-1\", \"propertyCount\": 5,
> \"cleanup-interval\": \"-1\", \"persistence-mode\": \"non_persistent\"}},
> {\"test\": {\"propertyCount\": 1}}]}\n",
>     "msg": "MODULE FAILURE",
>     "rc": 0
> }
>
> On Wednesday, August 9, 2017 at 2:13:17 PM UTC-4, Adrian Likins wrote:
>>
>> comments inl
>>
>>
>> On Wed, Aug 9, 2017 at 1:40 PM, Adam Shantz <a.mo...@gmail.com> wrote:
>>
>>> Hi Adrian -
>>>
>>> I think you're right about the quoting.  Here's the ouput without any
>>> modifications to my module:
>>>
>>> ansible -v localhost -m new_module -a 'src=/home/ec2-user/ansible/ro
>>> uterconfig.xml'
>>> Using /etc/ansible/ansible.cfg as config file
>>>  [WARNING]: Could not match supplied host pattern, ignoring: all
>>>
>>>  [WARNING]: provided hosts list is empty, only localhost is available
>>>
>>> localhost | FAILED! => {
>>>     "changed": false,
>>>     "failed": true,
>>>     "module_stderr": "",
>>>     "module_stdout": "{'cache-size': '5000',
>>> 'flowcontrol-start-queuesize': '-1', 'name': 'q1', 'cleanup-interval':
>>> '-1', 'persistence-mode': 'non_persistent'}\n{'cache-size': '5000',
>>> 'flowcontrol-start-queuesize': '-1', 'name': 'q2', 'cleanup-interval':
>>> '-1', 'persistence-mode': 'non_persistent'}\n{'cache-size': '5000',
>>> 'flowcontrol-start-queuesize': '-1', 'name': 'q3', 'cleanup-interval':
>>> '-1', 'persistence-mode': 'non_persistent'}\n{'name':
>>> 'test'}\n\n{\"invocation\": {\"module_args\": {\"src\":
>>> \"/home/ec2-user/ansible/routerconfig.xml\"}}, \"failed\": false,
>>> \"changed\": true}\n",
>>>     "msg": "MODULE FAILURE",
>>>     "rc": 0
>>> }
>>>
>>>
>>> When I add:
>>>     module.exit_json(changed=True, failed=False, {'queueslist':
>>> queuesList})
>>>
>>
>>
>>> <..>
>>>   File "<unknown>", line 162
>>> SyntaxError: non-keyword arg after keyword arg (<unknown>, line 162)
>>>
>>>
>> Ah, sorry I should have said:
>>
>>    module.exit_json(changed=True, failed=False, queueslist=queuesList)
>>
>> The adds 'queueslist' item to the return data dict with a value of the
>> queuesList object.
>>
>> The module will try to serialize the keyword args as a dict, add it to
>> the rest of the return
>> object, and print the JSON to stdout. ansible will wrap that up in but
>> the module by
>> itself will do that (ie, as invoked by 'test-module')
>>
>> The module output should look something roughly like:
>>
>>
>> {
>>     "invocation": {
>>         "module_args": {
>>             "src": "/home/ec2-user/ansible/routerconfig.xml"
>>         }
>>     },
>>     "failed": false,
>>     "changed": true,
>>     "queueslist": ["whatever_a_queuesList_serializes_to_item1",
>>                          "another_item_in_queueslist"]
>> }
>>
>>
>>
>> If I change that line to be:
>>>     module.exit_json(changed=True, failed=False, {'queueslist': output})
>>>
>> SyntaxError: non-keyword arg after keyword arg (<unknown>, line 163)
>>
>>
>> Same issue as above (ie, my bad example)
>>
>> Sorry if I'm being dense here.  I'm sure it's something I'm doing wrong,
>>> but I don't know how to tell what it is.
>>>
>>
>> The next issue will be if queuesList is json serializable or not. If you
>> get an error about that, you will likely need to
>> build a simpler object (like a dict) from queuesList to serialize.
>>
> --
> You received this message because you are subscribed to the Google Groups
> "Ansible Development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to ansible-devel+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ansible-devel+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to