Introduction

JSON (JavaScript Object Notation) is a common data format for APIs and configuration management. In modern IT operations, querying JSON data is essential for automation. Ansible, a powerful tool for automating IT tasks, offers a robust json_query filter that simplifies querying and extracting data. In this article, we will demonstrate how to use Ansible to extract a folder value from a JSON structure based on a specific name.

---

1. Why Automate JSON Queries?

JSON queries can become repetitive and error-prone when done manually. Automating this process with Ansible provides several advantages:

  • Consistency: Avoid manual errors by standardizing queries.
  • Efficiency: Save time with automated data extraction.
  • Flexibility: Adapt quickly to changes in JSON structures.

---

2. Example Use Case: Extracting Folder Value by Name

Let’s consider a scenario where you need to extract the folder value for a specific name from JSON data.

The JSON Data

Here’s an example JSON structure:

``yaml

[

{ "name": "foo", "folder": "foo_folder" },

{ "name": "bar", "folder": "bar_folder" }

]

`

The Goal

Retrieve the folder value for name: foo using Ansible.

---

3. The Playbook

Below is the Ansible playbook for this task:

`yaml

---

  • name: Extract folder value based on name

hosts: localhost

gather_facts: no

vars:

# Sample JSON data

json_data:

- { "name": "foo", "folder": "foo_folder" }

- { "name": "bar", "folder": "bar_folder" }

# Query to extract the folder value for the given name

query: "[?name=='{{ lookup_name }}'].folder | [0]"

# Variable to hold the name for which the folder value is queried

lookup_name: foo

tasks:

- name: Extract folder value for name={{ lookup_name }}

set_fact:

folder_value: "{{ json_data | json_query(query) }}"

- name: Display extracted folder value

debug:

msg: "The folder value for '{{ lookup_name }}' is '{{ folder_value }}'"

`

---

4. Understanding the Playbook

JSON Data

The json_data variable represents the data to be queried. It’s a list of dictionaries with name and folder fields.

Query Syntax

The json_query filter uses JMESPath syntax for querying:

  • ?name=='{{ lookup_name }}': Filters objects with name matching lookup_name.
  • .folder: Retrieves the folder field from the matched objects.
  • [0]: Selects the first match.

set_fact

The set_fact module dynamically sets the folder_value variable with the query result.

Debugging

The debug module displays the extracted folder value, verifying the playbook's success.

---

5. Running the Playbook

Save the playbook as extract_folder.yml and execute it with:

`bash

ansible-playbook extract_folder.yml

`

Example Output

`

TASK [Display extracted folder value] **

ok: [localhost] => {

"msg": "The folder value for 'foo' is 'foo_folder'"

}

``