---
- name: Install sssd and nslcd
  apt:
    update_cache: true
    name:
      - libnss-ldapd
      - libpam-ldapd
      - nslcd
      - sssd
    state: present
  register: apt_result
  retries: 3
  until: apt_result is succeeded

- name: Configure sssd
  template:
    src: sssd/sssd.conf.j2
    dest: /etc/sssd/sssd.conf
    mode: 0600
  notify: Restart sssd service

- name: Enable sssd socket activation
  systemd:
    name: "sssd-{{ item }}"
    enabled: true
  loop:
    - nss
    - pam

- name: Configure nslcd for hosts
  template:
    src: nslcd.conf.j2
    dest: /etc/nslcd.conf
    mode: 0600
  notify: Restart nslcd service

- name: Configure NSS to use sss
  lineinfile:
    dest: /etc/nsswitch.conf
    regexp: "^{{ item.name }}:"
    line: "{{ item.name }}:		{{ item.db }}"
  loop:
    - {name: passwd, db: files systemd sss}
    - {name: group, db: files systemd sss}
    - {name: shadow, db: files sss}
    - {name: networks, db: files ldap}
    - {name: hosts, db: files ldap dns}

- name: Disable nscd cache
  lineinfile:
    dest: /etc/nscd.conf
    regex: "enable-cache\t\t{{ item }}"
    line: "\tenable-cache\t\t{{ item }}\t\tno"
  loop:
    - passwd
    - group

- name: Override PAM rule priority for unix login to insert sssd login
  pamd:
    # Standard Unix auth by default if available (for root)
    name: common-auth
    type: auth
    control: '[success=2 default=ignore]'
    new_control: '[success=3 default=ignore]'
    module_path: pam_unix.so

- name: Insert PAM SSS authentication rule
  pamd:
    name: common-auth
    type: auth
    control: '[success=3 default=ignore]'
    module_path: pam_unix.so
    new_type: auth
    new_control: '[success=2 default=ignore]'
    new_module_path: pam_sss.so
    state: after

- name: Update PAM arguments for SSS authentication
  pamd:
    name: common-auth
    type: auth
    module_path: pam_sss.so
    control: '[success=2 default=ignore]'
    module_arguments: 'use_first_pass'

- name: Add PAM rule for SSS sessions
  pamd:
    name: common-session
    type: session
    control: required
    module_path: pam_unix.so
    new_type: session
    new_control: optional
    new_module_path: pam_sss.so
    state: after

- name: Override PAM rule priority for unix passwords
  pamd:
    name: common-password
    type: password
    control: '[success=2 default=ignore]'
    new_control: '[success=3 default=ignore]'
    module_path: pam_unix.so

- name: Insert PAM SSS password rule
  pamd:
    name: common-password
    type: password
    control: '[success=3 default=ignore]'
    module_path: pam_unix.so
    new_type: password
    new_control: '[success=2 default=ignore]'
    new_module_path: pam_sss.so
    state: after

- name: Update PAM arguments for SSS authentication
  pamd:
    name: common-password
    type: password
    module_path: pam_sss.so
    control: '[success=2 default=ignore]'
    module_arguments: 'use_authtok'