0

I'm trying to build LDAP DIT tree core structure with ansible. Here is my test (pb) playbook:

pb/ansible.cfg

; playbook config [defaults] inventory = inv roles_path = roles stdout_callback = yaml remote_tmp = /tmp log_path = /tmp/pb.log duplicate_dict_key = ignore inject_facts_as_vars = False retry_files_enabled = False forks = 1 vault_identity = default deprecation_warnings=False interpreter_python = auto_legacy_silent ansible_managed = This file is managed by ansible, don't make changes here - they will be overwritten. [ssh_connection] ssh_args = -C -o ControlMaster=auto -o ControlPersist=10m scp_if_ssh = True 

pb/inv/hosts

--- all: children: gldap: hosts: ldap0: ... 

pb/inv/host_vars/ldap0:

--- ansible_host: 10.0.0.10 ansible_user: user ... 

pb/inv/group_vars/gldap

--- olc_rootdn_password: password mdb_rootdn_password: password mon_rootdn_password: password ansible_become_password: password oldap_dit: testlabs: - link - role - grp: - posix - obj: - hw - sw - subj: - usr - srv: - dhcpd - dns orgname: testlabs orgdomain: testlabs ... 

pb/pbks/main.yml

--- - name: Setup LDAP hosts: gldap gather_facts: false roles: - oldap ... 

pb/roles/oldap/tasks/main.yml

--- - name: Privileged tasks become: true block: - name: Show DIT debug: msg: "{{ oldap_dit }}" - name: Subtree build include_tasks: popnodes.yml loop: "{{ [ oldap_dit ] }}" loop_control: loop_var: tree_brnch extended: true vars: brnch_key: "{{ tree_brnch.keys() | first | string }}" ... 

roles/oldap/tasks/popnodes.yml

--- - name: input value debug: msg: "{{ tree_brnch }}" - name: input type debug: msg: "{{ tree_brnch | type_debug }}" - debug: msg: "{{ ansible_loop }}" - debug: msg: "{{(',' + prnt_node) if prnt_node is defined }}" - debug: msg: "{{ brnch_key }}" - name: Create node for string items become: true community.general.ldap_entry: dn: "dc={{ cur_node }}{{(',' + prnt_node) if prnt_node is defined }}" objectClass: - dcObject - organizationalRole attributes: cn: "{{ cur_node }}" dc: "{{ cur_node }}" vars: cur_node: "{{ brnch_key }}" - name: Process nested items recursively include_tasks: popnodes.yml loop: "{{ [] if tree_brnch is string else lookup('ansible.builtin.dict',tree_brnch).value }}" loop_control: loop_var: tree_brnch extended: true vars: prnt_node: "dc={{ brnch_key }}{{(',' + prnt_node) if prnt_node is defined }}" brnch_key: "{{ tree_brnch.keys() | first | string }}" ... 

It's strange, but it fails on creating terminal element from string in subcall, when evaluating dn's value.

The error is:

PLAYBOOK: main.yml ************************************************************************************************************ 1 plays in pbks/main.yml PLAY [Setup LDAP] ************************************************************************************************************* TASK [oldap : Show DIT] ******************************************************************************************************* task path: /home/user/pb/roles/oldap/tasks/main.yml:5 ok: [ldap0] => msg: testlabs: - link - role - grp: - posix - obj: - hw - sw - subj: - usr - srv: - dhcpd - dns TASK [oldap : First level] **************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/main.yml:9 ok: [ldap0] => (item=testlabs) => msg: testlabs TASK [oldap : Subtree build] ************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/main.yml:14 included: /home/user/pb/roles/oldap/tasks/popnodes.yml for ldap0 => (item={'testlabs': ['link', 'role', {'grp': ['posix']}, {'obj': ['hw', 'sw']}, {'subj': ['usr']}, {'srv': ['dhcpd', 'dns']}]}) TASK [oldap : input value] **************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:2 ok: [ldap0] => msg: testlabs: - link - role - grp: - posix - obj: - hw - sw - subj: - usr - srv: - dhcpd - dns TASK [oldap : input type] ***************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:6 ok: [ldap0] => msg: dict TASK [oldap : debug] ********************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:10 ok: [ldap0] => msg: allitems: - testlabs: - link - role - grp: - posix - obj: - hw - sw - subj: - usr - srv: - dhcpd - dns first: true index: 1 index0: 0 last: true length: 1 revindex: 1 revindex0: 0 TASK [oldap : debug] ********************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:13 ok: [ldap0] => msg: '' TASK [oldap : debug] ********************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:16 ok: [ldap0] => msg: testlabs TASK [oldap : Create node for string items] *********************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:19 ok: [ldap0] => changed=false ansible_facts: discovered_interpreter_python: /usr/bin/python3 TASK [oldap : Process nested items recursively] ******************************************************************************* task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:32 [WARNING]: TASK: oldap : Process nested items recursively: The loop variable 'tree_brnch' is already in use. You should set the `loop_var` value in the `loop_control` option for the task to something else to avoid variable collisions and unexpected behavior. included: /home/user/pb/roles/oldap/tasks/popnodes.yml for ldap0 => (item=link) included: /home/user/pb/roles/oldap/tasks/popnodes.yml for ldap0 => (item=role) included: /home/user/pb/roles/oldap/tasks/popnodes.yml for ldap0 => (item={'grp': ['posix']}) included: /home/user/pb/roles/oldap/tasks/popnodes.yml for ldap0 => (item={'obj': ['hw', 'sw']}) included: /home/user/pb/roles/oldap/tasks/popnodes.yml for ldap0 => (item={'subj': ['usr']}) included: /home/user/pb/roles/oldap/tasks/popnodes.yml for ldap0 => (item={'srv': ['dhcpd', 'dns']}) TASK [oldap : input value] **************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:2 ok: [ldap0] => msg: link TASK [oldap : input type] ***************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:6 ok: [ldap0] => msg: AnsibleUnsafeText TASK [oldap : debug] ********************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:10 ok: [ldap0] => msg: allitems: - link - role - grp: - posix - obj: - hw - sw - subj: - usr - srv: - dhcpd - dns first: true index: 1 index0: 0 last: false length: 6 nextitem: role revindex: 6 revindex0: 5 TASK [oldap : debug] ********************************************************************************************************** task path: /home/user/pb/roles/oldap/tasks/popnodes.yml:13 fatal: [ldap0]: FAILED! => msg: 'An unhandled exception occurred while templating ''dc={{ brnch_key }}{{('','' + prnt_node) if prnt_node is defined }}''. Error was a <class ''ansible.errors.AnsibleError''>, original message: An unhandled exception occurred while templating ''dc={{ brnch_key }}{{('','' + prnt_node) if prnt_node is defined }}''. Error was a <class ''ansible.errors.AnsibleError''>, original message: An unhandled exception occurred while templating ''dc={{ brnch_key }}{{('','' + prnt_node) if prnt_node is defined }}''. Error was a <class ''ansible.errors.AnsibleError''>, original message: An unhandled exception occurred while templating ''dc={{ brnch_key }}{{('','' + prnt_node) if prnt_node is defined }}''. Error was a <class ''ansible.errors.AnsibleError''>, original message: An unhandled exception occurred while templating ''dc={{ brnch_key }}{{('','' + prnt_node) if prnt_node is defined }}''. Error was a <class ''ansible.errors.AnsibleError''>, original message: An unhandled exception occurred while templating ''dc={{ brnch_key }}{{('','' + prnt_node) if prnt_node is defined }}''. <...skipped...> Error was a <class ''ansible.errors.AnsibleError''>, original message: An unhandled exception occurred while templating ''dc={{ brnch_key }}{{('','' + prnt_node) if prnt_node is defined }}''. Error was a <class ''ansible.errors.AnsibleError''>, original message: An unhandled exception occurred while templating ''dc={{ brnch_key }}{{('','' + prnt_node) if prnt_node is defined }}''. Error was a <class ''ansible.errors.AnsibleError''>, original message: recursive loop detected in template string: dc={{ brnch_key }}{{('','' + prnt_node) if prnt_node is defined }}. maximum recursion depth exceeded while calling a Python object' PLAY RECAP ******************************************************************************************************************** ldap0 : ok=18 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 

Is there any solution?

Why this happens in such a way?

0

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.