Work with JSON output of a Command#
Problem#
A complex service provides a command to get its status. The command has an option --json
to switch to a machine readable format.
How can we check if the value of BackendState
and run more tasks based on its value?
tailscale status --peers=false --json
{
"Version": "1.74.1-tccd6bf2f4-g8fce4ce11",
"TUN": true,
"BackendState": "Running",
"HaveNodeKey": true,
"AuthURL": "",
"TailscaleIPs": [
"100.100.xx.xx"
],
"Self": {
"ID": "...",
"...": "..."
}
Solution#
Install the Python dependency jmespath
, then use the combination of the filters from_json
and json_query
get the value of a key.
- name: Tailscale status
ansible.builtin.command: tailscale status --peers=false --json
register: _tailscale__status
changed_when: false
- name: Tailscale up
ansible.builtin.command: >
tailscale up
--auth-key={{ tailscale__auth_token }}
--advertise-routes={{ tailscale__subnets|join(',') }}
when: _tailscale__status.stdout | ansible.builtin.from_json | community.general.json_query('BackendState') == 'NeedsLogin'
Explanation#
The output of the command is returned in json
format but Ansible doesn't know that and returns it as String in output
. That is why we need to turn it back to json
using from_json
first.