Home > Back-end >  How do I add to my existing Ansible Dictionary by looking something up from another dictionary?
How do I add to my existing Ansible Dictionary by looking something up from another dictionary?

Time:03-01

Been at this about a week and I think it's time to post this. I'm pretty decent at ansible but clearly terrible at dictionaries.

How do I add a sub-key to a dictionary using update_list?

Alright so I have two dictionaries, one is the output of a command to pull AD Creds, the dictionary looks like this called userresult:

{
"objects": [
  {
    "Name" : "Administrator"
    "objectSid": {
       "Name" : "DOMAIN\\Administrator"
       "Sid": "S-1-5-21"
    }
  },
  {
       "Name" : "Guest"
       "objectSid": {
       "Name" : "DOMAIN\\Guest"
       "Sid": "S-1-5-22"   
  }
 ]
}

Now, I've got a dictionary that has the names and info I want to lookup (inputdictionary.yml):

dictionary:
  users:
     Nonexistentuser:
         old_sid: 1-1-1-1
         domain: nonexistentdomain
     Administrator:
         old_sid: 2-2-2-2
         domain: DOMAIN

What I've tried:

---
- name: Update dictionary
  hosts: myhosts
  gather_facts: no
  tasks:
  - name: Get SID for user - you can ignore this part it just gets userresult
    community.windows.win_domain_object_info:
      filter: ObjectClass -eq 'user' -and objectCategory -eq 'Person'
    properties:
    - objectSid
    register: userresult
  - name: ready yaml dictionary
    delegate_to: localhost
    slurp:
      path: '/home/inputdictionary.yml'
    register: SourceInfo
  - name: extract dictionary
    set_fact:
      myinfo: "{{SourceInfo['content'}] | b64decode | from_yaml ))"
  - name: build a list of updates for dictionary
    set_fact:
       update_list: "{{ update list   update }}"
    loop: "{{ myinfo.dictionary.users | dict2items }}"
    loop_control:
       index_var: idx
    vars:
       update_list: []
       update:
       - path: myinfo.dictonary.users[{{idx}}].new_sid
         value: "TEST"
    - debug:
        var: update_list

Expected output:

dictionary:
  users:
     Nonexistentuser:
         old_sid: 1-1-1-1
         domain: nonexistentdomain
         new_sid: TEST
     Administrator:
         old_sid: 2-2-2-2
         domain: DOMAIN
         new_sid: TEST

Current output:

TASK [build a list of updates for dictinoary]
FAILED! -> { 
   "msg": "template error while templating string: expected token 'end of print statement', got 'list. String: {{update list   update}}"
}

Test needs to be replaced with the new SID eventually, but I just want this step to work first..

Been trying to follow this but no avail: https://docs.ansible.com/ansible/latest/collections/ansible/utils/update_fact_module.html

Any help would be appreciated while I continue to try to fix this..

CodePudding user response:

TEST needs to be replaced with the new SID eventually, but I just want this step to work first

- name: "make this working"
  hosts: localhost
  vars:
    dictionary:
      users:
        Nonexistentuser:
            old_sid: 1-1-1-1
            domain: nonexistentdomain
        Administrator:
            old_sid: 2-2-2-2
            domain: DOMAIN
  tasks:
    - name: build a list of updates for dictionary
      set_fact:
        update_list: "{{ update_list | d({}) | combine({ item.key: _v}) }}"
      loop: "{{ dictionary.users | dict2items }}"
      vars:
        _k: "{{ item.key }}"
        _v: "{{ item.value | combine({'new_sid': newsid}) }}"
        newsid: "TEST"
        
    - debug:
        msg: '{{ update_list }}'

result:

ok: [localhost] => {
    "msg": {
        "Administrator": {
            "domain": "DOMAIN",
            "new_sid": "TEST",
            "old_sid": "2-2-2-2"
        },
        "Nonexistentuser": {
            "domain": "nonexistentdomain",
            "new_sid": "TEST",
            "old_sid": "1-1-1-1"
        }
    }
}
  • Related