1

starting data:

ok: [test@test.com] => {
    "msg": {
        "testdb1": {
            "dbe_user_not_in_db": [
                "test_user1", 
                "test_user2"
            ], 
        }
    }
}

I currently have the following in ansible:

    - name: Create dbe_pass_pairs
      set_fact:
        ora_sid_home_map: "{{ora_sid_home_map|combine({ item[0].key: {'dbe_pass_pairs': {item[1]: password} }}, recursive=True)}}"
      loop: "{{ ora_sid_home_map | dict2items | subelements('value.dbe_user_not_in_db') }}"
      vars:
        password: "{{ lookup('password', '/dev/null length=10 chars=ascii_letters,digits') }}"

Which yields:

ok: [test@test.com] => {
    "msg": {
        "testdb1": {
            "dbe_pass_pairs": {
                "test_user1": "4SS2kJ7p0z", 
                "test_user2": "VLIzNfoaxf"
            }, 
            "dbe_user_not_in_db": [
                "test_user1", 
                "test_user2"
            ], 
        }
    }
}

                

Instead of dbe_pass_pairs containing dictionary items I'd like them to be a list of strings like such with a semicolon as:

ok: [test@test.com] => {
    "msg": {
        "testdb1": {
            "dbe_pass_pairs": [
                "test_user1;4SS2kJ7p0z", 
                "test_user2;VLIzNfoaxf"
            ], 
            "dbe_user_not_in_db": [
                "test_user1", 
                "test_user2"
            ], 
        }
    }
}

                

Doing something like the following just overwrite the list instead of appending:

    - name: Create dbe_pass_pairs
      set_fact:
        ora_sid_home_map: "{{ora_sid_home_map|combine({ item[0].key: {'dbe_pass_pairs': [item[1] + ';' + password] }}, recursive=True)}}"
      loop: "{{ ora_sid_home_map | dict2items | subelements('value.dbe_user_not_in_db') }}"
      vars:
        password: "{{ lookup('password', '/dev/null length=10 chars=ascii_letters,digits') }}"
            "dbe_pass_pairs": [
                "test_user2;AxL6ayeZIH"
            ],

Any idea how to get what I'm looking for data wise?

1 Answers1

0

a solution using jinja2:

- name: Reproduce issue
  hosts: localhost
  gather_facts: yes
  vars:
    ora_sid_home_map:
      testdb1:
        dbe_user_not_in_db: ["test_user1", "test_user2"]
  tasks:      
    - name: Create paswords
      set_fact:
        ora_sid_home_map: >-
              {%- set ns=namespace(result=[], ident="", final={}) -%}
              {%- set ns.ident = ora_sid_home_map |first -%}              
              {%- for user in ora_sid_home_map[ns.ident].dbe_user_not_in_db -%}
              {%- set password = lookup('password', '/dev/null length=10 chars=ascii_letters,digits') -%}            
              {%- if ns.result.append(user ~ ';' ~ password) -%}{%- endif -%}
              {%- endfor -%}
              {{ {ns.ident: ora_sid_home_map[ns.ident] | combine({'dbe_pass_pairs': ns.result})} }}
    - debug:
        msg: "{{ ora_sid_home_map }}"

result:

ok: [localhost] => {
    "msg": {
        "testdb1": {
            "dbe_pass_pairs": [
                "test_user1;tPOSfCzLLq",
                "test_user2;e0A92Dkuac"
            ],
            "dbe_user_not_in_db": [
                "test_user1",
                "test_user2"
            ]
        }
    }
}

without jinja2:

- name: Reproduce issue
  hosts: localhost
  gather_facts: yes
  vars:
    ora_sid_home_map:
      testdb1:
        dbe_user_not_in_db: ["test_user1", "test_user2"]
  tasks:      
    - name: Create paswords
      set_fact:
        passwords: "{{ passwords | d([]) + [data] }}"
      loop: "{{ ora_sid_home_map[ident].dbe_user_not_in_db }}"
      vars:
        password: "{{ lookup('password', '/dev/null length=10 chars=ascii_letters,digits') }}"
        data: "{{ item ~ ';' ~ password }}"
        ident: "{{ ora_sid_home_map|first }}"
    - name: result
      set_fact:
        ora_sid_home_map: "{{ {ident: data} }}"
      vars:
        ident: "{{ ora_sid_home_map|first }}"
        data: "{{ ora_sid_home_map[ident]| combine({'dbe_pass_pairs': passwords}) }}"

    - debug:
        msg: "{{ ora_sid_home_map }}"
Frenchy
  • 16,386
  • 3
  • 16
  • 39
  • Thank you Frenchy! This is great. How would think look if say the value testd1 was dynamic. This playbook will get ran across many servers and that value will change. – user2763181 May 26 '22 at 15:34
  • see my answer modified in this case the first key is dynamic and set in variable ident – Frenchy May 26 '22 at 16:18
  • @user2763181 dont forget to close your question by validating and updating the answer..thanks – Frenchy Jun 11 '22 at 09:30