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?