I'm trying to create a basic dynamic inventory script for ansible based on 
json output. I'm new to jq but I've hit an issue where the dynamic script 
on ansible v2.9.14 & 2.9.15 doesn't like the output, but if I send the 
output to a file and then run Ansible against the output in the file, 
ansible works.

I know there will be syntax issues with trailing commas on the last 
key:value and I have an awful sed at the end of the curl to get it to look 
right.

This is what happens:

dynamic inventory script output:
```$ ./dynamic1.sh
{
  "all": {
      "hosts": {
"ip-172-31-39-30.eu-west-1.compute.internal": null,
"ip-172-31-44-224.eu-west-1.compute.internal": null,
"ip-172-31-42-6.eu-west-1.compute.internal": null,
"ip-172-31-32-68.eu-west-1.compute.internal": null,
    }
  }
}
```

Ansible run and error:
```
$ ansible -i ./dynamic1.sh all -m ping -u ubuntu
[WARNING]:  * Failed to parse /home/ubuntu/dynamic1.sh with script plugin: 
failed to parse executable inventory script results from 
/home/ubuntu/dynamic1.sh:
Expecting property name enclosed in double quotes: line 8 column 5 (char 
242)
[WARNING]:  * Failed to parse /home/ubuntu/dynamic1.sh with ini plugin: 
/home/ubuntu/dynamic1.sh:2: Expected key=value host variable assignment, 
got: {
[WARNING]: Unable to parse /home/ubuntu/dynamic1.sh 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'
```

Now, if I output the dynamic script run to a file, then run ansible again, 
it works:
```
$ ./dynamic1.sh > output.json

$ cat output.json
{
  "all": {
      "hosts": {
"ip-172-31-39-30.eu-west-1.compute.internal": null,
"ip-172-31-44-224.eu-west-1.compute.internal": null,
"ip-172-31-42-6.eu-west-1.compute.internal": null,
"ip-172-31-32-68.eu-west-1.compute.internal": null,
    }
  }
}

$ ansible -i output.json all -m ping -u ubuntu
[DEPRECATION WARNING]: Distribution Ubuntu 16.04 on host 
ip-172-31-42-6.eu-west-1.compute.internal should use /usr/bin/python3, but 
is using /usr/bin/python for
backward compatibility with prior Ansible releases. A future Ansible 
release will default to using the discovered platform python for this host. 
See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html
 
for more information. This feature will be removed in version 2.12. 
Deprecation
warnings can be disabled by setting deprecation_warnings=False in 
ansible.cfg.
ip-172-31-42-6.eu-west-1.compute.internal | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
ip-172-31-39-30.eu-west-1.compute.internal | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
ip-172-31-32-68.eu-west-1.compute.internal | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
ip-172-31-44-224.eu-west-1.compute.internal | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
```

This is the contents of dynamic1.sh. I know there will be better ways to do 
this but I just need a list of servers based on a matching variable in the 
JSON output.

```
$ cat dynamic1.sh
#!/bin/bash
echo "{"
echo "  \"all\": {"
echo "      \"hosts\": {"
curl --silent -X GET https://url.com/api/servers -H "Authorization: Token 
$token" -H "Content-Type: text/json"  -H "Accept:application/json" | jq -r 
'.Result.servers[] | select(.ansible_local.local.local_facts.instance_type 
| tostring | contains("t2.micro")) | (.ansible_fqdn+"\": null,")' | sed 
's/^/"/g'
echo "    }"
echo "  }"
echo "}"
```

Can anyone give me any help on why does ansible accepts the file but not 
the output of the script?

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/88e3162d-1c31-47ae-b6e3-ac95d14eb7b9n%40googlegroups.com.

Reply via email to