0

I'm trying to use getent to lookup a user's home directory and then apply that information to a copy job. I know we can't do nested variables, but I'm just stuck. I have been playing with the lookup('var's...) syntax and various ways to pull a value out of a dict. In this particular case I do know the user's home directory, but now it's more an exercise in figuring this out. ANSIBLE_USER is defined as ansible

My playbook is:

#lookup ansible user's home directory
#drops the value into a getent_passwd variable
- hosts: all
  become_user: root
  become: true
  tasks:
    - name: get info
      getent:
        key: "{{ ANSIBLE_USER }}"
        database: passwd
    - debug:
        var: getent_passwd.{{ ANSIBLE_USER }}.4
    - set_fact:
        ANSIBLE_HOME: "{{ getent_passwd['ansible'][4] }}"

- hosts: all
  become_user: root
  become: true
  tasks:
    - name: copy iptables files
      copy:
        src: "iptables/{{ IPTABLESCONFSRC }}/iptables.sh"
        dest: "{{ ANSIBLE_HOME }}/temp/iptables.sh"

This works because I'm manually defining the 'ansible' string in the ANSIBLE_HOME line. However, what I'm functionally trying to accomplish is:

ANSIBLE_HOME: "{{ getent_passwd['{{ ANSIBLE_HOME }}'][4] }}"

The best I can get is a undefined variable error because I end up looking for: getent_passwd[ansible][4] or getent_passwd.ansible.4 and that doesn't exist via:

ANSIBLE_HOME: "{{ lookup('vars', 'getent_passwd.' + ANSIBLE_USER + '.4') }}"

or

ANSIBLE_HOME: "{{ lookup('vars', 'getent_passwd[' + ANSIBLE_USER + '][4]') }}"

The debug output shows:

ok: [HOSTNAME] => {
"getent_passwd.ansible.4": "/home/ansible"
}

This seems to work because the debug var is already considered Jinja, so it's effectively double nesting for you.

0

1 Answer 1

1

Oh geeze. Guess this was easier then what I was thinking. This:

ANSIBLE_HOME: "{{ getent_passwd[ANSIBLE_USER][4] }}"

works fine.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.