Introduction

In the realm of Ansible automation, managing variables effectively can save time and reduce errors. A lesser-known but powerful feature is using JSON files with the --extra-vars option to pass parameters to your playbooks. This approach is particularly handy when testing multiple parameters without altering global configurations, such as those stored in group_vars or host_vars.

This article explains how to define --extra-vars as JSON, streamlining your workflow and maintaining version control hygiene.

---

The Basics: --extra-vars

Ansible allows variables to be overridden on the command line using the --extra-vars option. The most common method is passing a space-separated list of key=value pairs. However, for extensive variables, this can become unwieldy and error-prone. JSON files provide a clean and structured alternative.

---

Example Playbook

Consider the following simple playbook, main.yml:

``yaml

---

  • hosts: localhost

connection: local

vars:

var1: "var1 set in playbook"

var2: "var2 set in playbook"

var3: "var3 set in playbook"

tasks:

- name: Print var1

debug:

var: var1

- name: Print var2

debug:

var: var2

- name: Print var3

debug:

var: var3

`

When executed, the variables output their default values:

`bash

$ ansible-playbook -i localhost, -v main.yml

`

---

Overriding Variables

To override variables, use --extra-vars:

`bash

$ ansible-playbook -i localhost, -v main.yml --extra-vars "var2='new value' var3='another new value'"

`

The output reflects the overridden values. However, this method becomes cumbersome with many variables.

---

Using JSON for --extra-vars

Instead of typing variables inline, create a JSON file, params.json:

`json

{

"var1": "value from JSON",

"var2": "another value from JSON",

"var3": "final value from JSON"

}

`

Run the playbook with:

`bash

$ ansible-playbook -i localhost, -v main.yml --extra-vars "@params.json"

`

Here, @params.json tells Ansible to load the variables from the specified file.

Output Example

The playbook uses the values defined in params.json, ensuring consistency and readability:

`plaintext

TASK [Print var1] **

ok: [localhost] => {

"var1": "value from JSON"

}

`

---

Advantages of JSON --extra-vars

  • Readability: Clearly organized parameters.
  • Reusability: Easily switch parameter sets by swapping JSON files.
  • Error Reduction: Minimizes typos and formatting issues.
  • Version Control: Exclude JSON files from commits using .gitignore.

---

Best Practices

1. Default to group_vars: Use playbooks' default variables for standard operations.

2. Isolate Edge Cases: Use --extra-vars for testing or temporary changes.

3. Secure Sensitive Data: Encrypt JSON files with ansible-vault when containing credentials.

---

Conclusion

Leveraging JSON for --extra-vars` simpli