---
- name: Check if phpquery is installed
  shell: which phpquery || echo absent
  check_mode: false
  register: apache_phpquery_path
  changed_when: '"phpquery" not in apache_phpquery_path.stdout'
  tags:
    - apache

- name: Check PHP version
  block:

    - name: Run phpquery to get the PHP version
      command: phpquery -V
      register: apache_phpquery_version
      check_mode: false
      changed_when: false

    - name: Set a fact for the PHP version
      set_fact:
        apache_php_version: "{{ apache_phpquery_version.stdout }}"

  when: ( apache_phpquery_path is defined ) and ( apache_phpquery_path.stdout == "/usr/sbin/phpquery" )
  tags:
    - apache

- name: Set a fact for the Debian version
  set_fact:
    apache_debian_version: "{{ ansible_distribution_release }}"
  tags:
    - apache

- name: Apache packages present
  apt:
    pkg:
      - apache2
      - apache2-utils
      - lynx
    state: present
    update_cache: false
  tags:
    - apache

- name: Register the loaded modules
  command: a2query -m
  register: apache_modules_check
  tags:
    - apache

- name: Set an array of the loaded modules
  set_fact:
    apache_modules_loaded: "{{ apache_modules_loaded | default('') + [ '{{ line.split(' ')[0] }}' ] }}" 
    # apache_modules_loaded: "{{ ( apache_modules_check.stdout ).split(' ')[0] | list }}"
  loop: "{{ apache_modules_check.stdout_lines }}"
  loop_control:
    loop_var: line
    label: "{{ line }}"
  tags:
    - apache

- name: Debug loaded modules
  debug:
    var: apache_modules_loaded
    verbosity: 1
  tags:
    - apache

- name: Apache envars in place
  template:
    src: templates/envvars.j2
    dest: /etc/apache2/envvars
    mode: 0755
    owner: root
    group: root
  tags:
    - apache

- name: Check if we have a HTTPS cert
  stat:
    path: "/etc/ssl/le/{{ inventory_hostname }}.cert.pem"
  register: apache_cert
  tags:
    - apache

- name: Conditionally include Webarchitects config
  include_tasks: webarch.yml
  when: ( apache_conf_enabled is defined ) and ( "webarch" in apache_conf_enabled )
  tags:
    - apache

- name: Conditionally include mc3 config
  include_tasks: mc3.yml
  when: ( apache_conf_enabled is defined ) and ( "mc3" in apache_conf_enabled )
  tags:
    - apache

- name: Let's Encrypt /.well-known/acme-challenge server-wide alias in place
  template:
    src: templates/le.conf.j2
    dest: /etc/apache2/conf-available/le.conf
  tags:
    - apache

- name: Custom Apache ssl.conf in place
  copy:
    src: files/ssl.conf
    dest: /etc/apache2/mods-available/ssl.conf
  tags:
    - apache

- name: Apache localhost and localhost.d directories in place
  file:
    path: "{{ dir }}"
    state: directory
  loop:
    - /var/www/localhost
    - /etc/apache2/localhost.d
  loop_control:
    loop_var: dir
  tags:
    - apache

- name: Apache localhost site available in place
  template:
    src: "templates/localhost.conf.j2"
    dest: "/etc/apache2/sites-available/localhost.conf"
  tags:
    - apache

- name: Deny robots files in place
  template:
    src: robots.deny.txt.j2
    dest: /var/www/html/robots.deny.txt
  tags:
    - apache

- name: Expires and robots conf available
  template:
    src: "templates/{{ file }}.j2"
    dest: "/etc/apache2/conf-available/{{ file }}"
  loop:
    - robots-deny.conf
    - robots-deny-nextcloud.conf
    - expires-strict.conf
    - expires-medium.conf
  loop_control:
    loop_var: file
  tags:
    - apache

- name: Apache modules disabled
  block:

    - name: Apache ITK MPM package absent
      apt:
        pkg:
          - libapache2-mpm-itk
        state: absent
        update_cache: false
      when: '"mpm-itk" in apache_mods_disabled'
      tags:
        - apache

    - name: Apache FastCGI absent
      apt:
        pkg:
          - libapache2-mod-fcgid
        state: absent
        update_cache: false
      when: '"fcgid" in apache_mods_disabled'
      tags:
        - apache

    - name: Apache suEXEC package absent
      apt:
        pkg:
          - apache2-suexec-pristine
        state: absent
        update_cache: false
      when: '"suexec" in apache_mods_disabled'
      tags:
        - apache

    - name: "Apache php{{ apache_php_version }} package absent"
      apt:
        pkg:
          - "libapache2-mod-php{{ apache_php_version }}"
        state: absent
        update_cache: false
      when: ( "php7.0" in apache_mods_disabled ) or ( "php7.2" in apache_mods_disabled ) or ( "php7.3" in apache_mods_disabled )
      tags:
        - apache

    - name: Disable modules
      include_tasks: a2dismod.yml
      loop: "{{ apache_mods_disabled }}"
      loop_control:
        loop_var: mod
      tags:
        - apache

  when: ( apache_mods_disabled is defined ) and ( apache_mods_disabled != [] )

- name: Apache modules enabled
  block:

    - name: Apache ITK MPM package present
      apt:
        pkg:
          - libapache2-mpm-itk
        state: present
        update_cache: false
      when: '"mpm-itk" in apache_mods_enabled'
      tags:
        - apache

    - name: Apache mpm_prefork.conf in place
      template:
        src: templates/mpm_prefork.conf.j2
        dest: /etc/apache2/mods-available/mpm_prefork.conf
      when: ( "mpm-itk" in apache_mods_enabled ) or ( "php7.0" in apache_mods_enabled ) or ( "php7.3" in apache_mods_enabled )
      tags:
        - apache

    - name: Apache Suexec package present
      apt:
        pkg:
          - apache2-suexec-pristine
        state: present
        update_cache: false
      when: '"suexec" in apache_mods_enabled'
      tags:
        - apache

    - name: Apache FastCGI package present
      apt:
        pkg:
          - libapache2-mod-fcgid
        state: present
        update_cache: false
      when: '"fcgid" in apache_mods_enabled'
      tags:
        - apache

    - name: Apache ratelimit conf present
      template:
        src: templates/ratelimit.conf.j2
        dest: /etc/apache2/mods-available/ratelimit.conf
      when: '"ratelimit" in apache_mods_enabled'
      tags:
        - apache

    - name: Apache mod_php package present
      apt:
        pkg:
          - "libapache2-mod-php{{ apache_php_version }}"
        state: present
        update_cache: false
      when: ( "php7.0" in apache_mods_enabled ) or ( "php7.3" in apache_mods_enabled )
      tags:
        - apache

    - name: Cloudflare config available
      include_tasks: cloudflare.yml
      when: '"remoteip" in apache_mods_enabled'
      tags:
        - apache

    - name: Apache modules enabled
      include_tasks: a2enmod.yml
      loop: "{{ apache_mods_enabled }}"
      loop_control:
        loop_var: mod
      tags:
        - apache

  when: ( apache_mods_enabled is defined ) and ( apache_mods_enabled != [] )

- name: Apache conf disabled
  include_tasks: a2disconf.yml
  loop: "{{ apache_conf_disabled }}"
  loop_control:
    loop_var: conf
  when: ( apache_conf_disabled is defined ) and ( apache_conf_disabled != [] )
  tags:
    - apache

- name: Apache conf enabled
  include_tasks: a2enconf.yml
  loop: "{{ apache_conf_enabled }}"
  loop_control:
    loop_var: conf
  when: ( apache_conf_enabled is defined ) and ( apache_conf_enabled != [] )
  tags:
    - apache

- name: Apache sites disabled
  include_tasks: a2dissite.yml
  loop: "{{ apache_sites_disabled }}"
  loop_control:
    loop_var: site
  when: ( apache_sites_disabled is defined ) and ( apache_sites_disabled != [] )
  tags:
    - apache

- name: Apache sites enabled
  include_tasks: a2ensite.yml
  loop: "{{ apache_sites_enabled }}"
  loop_control:
    loop_var: site
  when: ( apache_sites_enabled is defined ) and ( apache_sites_enabled != [] )
  tags:
    - apache

- name: Apache enabled for systemd servers
  systemd:
    name: apache2
    enabled: true
  when: apache_debian_version == "buster"
  tags:
    - apache

- name: Apache configtest
  command: apache2ctl configtest
  register: apache_configtest
  changed_when: '"Syntax OK" not in apache_configtest.stderr'
  check_mode: false
  tags:
    - apache

- debug:
    msg: "{{ apache_configtest.stderr }}"
    verbosity: 1
  tags:
    - apache

- name: Apache restarted
  service:
    name: apache2
    state: restarted
  when: '"Syntax OK" in apache_configtest.stderr'
  tags:
    - apache

- name: Fail if Apache configtest is not OK
  fail:
    msg: "{{ apache2ctl_configtest.stdout }}"
  when: '"Syntax OK" not in apache_configtest.stderr'
  tags:
    - apache
...