0
votes

I have JSON file with database credentials and want to create playbook with external parameters to make migration between databases.

Firstly, I get JSON-data. Also, I have 2 variables like potential external arguments.


    vars:
       db_credentials: "{{ lookup('file','/etc/ansible-configs/config/db-migration/db-credentials.json') | from_json }}"
       db_from: "{{ _db_from }}"
       db_to: "{{ _db_to }}"

Next, I'm going to get value by key on my recently parsed JSON.


    - name: "Test"
      debug:
        msg: "{{ lookup('dict', db_credentials.project_1.dev_1) | selectattr('key', 'defined') | map (attribute='value') | first }}"

JSON:


    {
      "project_1": {
        "dev_1": {
          "server": "172.31.40.208",
          "port": "5432",
          "db": "db_dev_1",
          "login": "login",
          "password": "passw0rd"
        },
        "project_2": {
          "server": "172.31.40.208",
          "port": "5432",
          "db": "db_uat_1",
          "login": "login",
          "password": "passw0rd"
        }
      }
    }

The question is I want to pass parameters like project_1.dev_1.


    # ansible-playbook playbooks/migrate-db.yml -e '{"db_from":"project_1.dev_1"}'

How can I use it in my code?

I want something like this:


    msg: "{{ lookup('dict', db_credentials.{{ db_from }}) | selectattr('key', 'defined') | map (attribute='value') | first }}"

But it doesn't work.

1

1 Answers

2
votes

For your specific case you can simply use json_query filter as project_1.dev_1 is a valid JMESPath query:

- debug:
    msg: "{{ db_credentials | json_query(db_from) }}"

will give you:

{
    "server": "172.31.40.208",
    "port": "5432",
    "db": "db_dev_1",
    "login": "login",
    "password": "passw0rd"
}