Ansible: set debconf variables

Sometimes I need to automate some install on Ubuntu using Ansible. To do that, I need to get a list of questions/variables from the app/package. Welcome to debconf-get-selections

In this example, we'll use slapd package.

$ apt-get install -y debconf-utils

# As an example, install slapd
$ apt-get install -y slapd

# Displays all parameters of "slapd"
$ debconf-get-selections | grep "slapd"

slapd	slapd/internal/adminpw	password	
slapd	slapd/password1	password	
slapd	slapd/internal/generated_adminpw	password	
slapd	slapd/password2	password	
slapd	slapd/move_old_database	boolean	true
slapd	slapd/dump_database_destdir	string	/var/backups/slapd-VERSION
slapd	shared/organization	string	nodomain
slapd	slapd/no_configuration	boolean	false
slapd	slapd/password_mismatch	note	
# Potentially unsafe slapd access control configuration
slapd	slapd/unsafe_selfwrite_acl	note	
slapd	slapd/dump_database	select	when needed
slapd	slapd/upgrade_slapcat_failure	error	
slapd	slapd/ppolicy_schema_needs_update	select	abort installation
# Do you want the database to be removed when slapd is purged?
slapd	slapd/purge_database	boolean	false
slapd	slapd/backend	select	MDB
slapd	slapd/invalid_config	boolean	true
slapd	slapd/domain	string	nodomain

With Ansible, you can automate it. In your playbook, add something like:

- hosts: localhost
  vars:
    ldap_admin_pw: 'Wf^rp&429GrtRkslc83lsj'
    hostname: openldap
    domain_sec: example
    domain_tld: com
    org: example
    ldap_backend: HDB

  tasks:
    - name: install pre-req packages
      package:
        state: latest
        name:
          - debconf-utils

    - name: Check debconf for slapd entries
      shell: (debconf-get-selections | grep -q -s slapd); echo $?
      register: debconf
      ignore_errors: yes
      changed_when: False

    # check them with `debconf-get-selections | grep slapd`
    - name: "Set OpenLDAP unattended installation parameters"
      debconf:
        name: "slapd"
        question: "{{ item.key }}"
        vtype: "{{ item.type }}"
        value: "{{ item.value }}"
      with_items:
        - key: slapd/password1
          type: password
          value: "{{ ldap_admin_pw }}"
        - key: slapd/password2
          type: password
          value: "{{ ldap_admin_pw }}"
        - key: slapd/move_old_database
          type: boolean
          value: true
        - key: slapd/domain
          type: string
          value: "{{ domain_sec }}.{{ domain_tld }}"
        - key: shared/organization
          type: string
          value: "{{ org }}"
        - key: slapd/no_configuration
          type: boolean
          value: false
        - key: slapd/purge_database
          type: boolean
          value: false
        - key: slapd/allow_ldap_v2
          type: boolean
          value: false
        - key: slapd/backend
          type: select
          value: "{{ ldap_backend|upper }}"
      when: debconf.stdout == "1"
      no_log: true

    - name: install packages
      package:
        state: latest
        name:
          - slapd
          - ldap-utils