Q:

Ansible dynamic inventory in JSON format isn't getting parsed

I have tried to write a dynamic inventory script in python, which goes as follows:
[root@satellite code]# python3 dynamic_inventory.py --list > hosts
[root@satellite code]# cat hosts
{"k8s-master": ["k8s-master.example.com"], "k8s-worker": ["worker-1.example.com", "worker-2.example.com"], "satellite": ["satellite.example.com"], "all": ["satellite.example.com", "worker-2.example.com", "k8s-master.example.com", "worker-1.example.com"], "Centos7": ["k8s-master.example.com", "worker-1.example.com", "worker-2.example.com", "satellite.example.com"]}

Now, when I try to use the inventory, I get the following errors:
[root@satellite code]# ansible-playbook -i hosts sample.yaml
[WARNING]: Skipping 'Centos7' as this is not a valid group definition
[WARNING]: Skipping 'k8s-worker' as this is not a valid group definition
[WARNING]: Skipping 'satellite' as this is not a valid group definition
[WARNING]: Skipping 'k8s-master' as this is not a valid group definition
[WARNING]: Skipping 'all' as this is not a valid group definition
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [all] *************************************************************************************************************************************************************
skipping: no hosts matched

PLAY RECAP *************************************************************************************************************************************************************

Tried this too:
[root@satellite code]# ansible-playbook -i dynamic_inventory.py sample.yaml
[WARNING]:  * Failed to parse /root/code/dynamic_inventory.py with ini plugin: /root/code/dynamic_inventory.py:1: Expected key=value host variable assignment, got: os
[WARNING]: Unable to parse /root/code/dynamic_inventory.py as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [all] *************************************************************************************************************************************************************
skipping: no hosts matched

PLAY RECAP *************************************************************************************************************************************************************

The script fetches the hostnames from MySQL DB into JSON format. I couldn't find any plugins in the official ansible docs. Can anyone help on how to go about this? Is there any way to render the script output into ini format.

A:

I tried changing the script to executable and got this:
[root@satellite code]# ansible-playbook -i dynamic_inventory.py sample.yaml
[WARNING]:  * Failed to parse /root/code/dynamic_inventory.py with script plugin: problem running /root/code/dynamic_inventory.py --list ([Errno 8] Exec format error)
[WARNING]:  * Failed to parse /root/code/dynamic_inventory.py with ini plugin: /root/code/dynamic_inventory.py:1: Expected key=value host variable assignment, got: os

Note that it used script plugin this time, the "Exec format error" was due to my system defaulting to python2. Added the shebang(#!/usr/bin/python3) in the file and it worked:
[root@satellite code]# ansible-playbook -i dynamic_inventory.py sample.yaml
[DEPRECATION WARNING]: The TRANSFORM_INVALID_GROUP_CHARS settings is set to allow bad characters in group names by default, this will change, but still be user
configurable on deprecation. This feature will be removed in version 2.10. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

PLAY [all] *************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
fatal: [worker-1.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname worker-1.example.com: Name or service not known", "unreachable": true}
fatal: [worker-2.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname worker-2.example.com: Name or service not known", "unreachable": true}
fatal: [k8s-master.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname k8s-master.example.com: Name or service not known", "unreachable": true}
fatal: [satellite.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}

PLAY RECAP *************************************************************************************************************************************************************
k8s-master.example.com    : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
satellite.example.com     : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
worker-1.example.com      : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
worker-2.example.com      : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0

