---
- name: Install Logstash
  hosts: elastic-logstash
  become: true
  vars_files:
    - vars/variables.yml

  environment: "{{ deployment_environment_variables | default({}) }}"

  pre_tasks:
    - include_tasks: common_task_data_node_hosts.yml
      tags:
        - always
  tasks:
    - name: Set quarter memory fact
      set_fact:
        q_mem: "{{ (ansible_memtotal_mb | int) // 4 }}"
        q_storage: "{{ ansible_processor_cores }}"
      tags:
        - always

    - name: Set logstash facts
      set_fact:
        elastic_heap_size: "{{ ((q_mem | int) > 30720) | ternary(30720, q_mem) }}"
        logstash_queue_size: "{{ (((q_storage | int) > 16) | ternary(16, q_storage) | int) * 1024 }}"
      tags:
        - always

    - include_tasks: common_task_install_elk_repo.yml

    - name: Configure systcl vm.max_map_count=262144 on container hosts
      sysctl:
        name: "vm.max_map_count"
        value: "262144"
        state: "present"
        reload: "yes"
      delegate_to: "{{ physical_host }}"
      tags:
        - sysctl

    - name: Ensure mount directories exists
      file:
        path: "/openstack/{{ inventory_hostname }}/logstash"
        state: "directory"
      delegate_to: "{{ physical_host }}"

    - name: logstash datapath bind mount
      lxc_container:
        name: "{{ inventory_hostname }}"
        container_command: |
          [[ ! -d "/var/lib/logstash" ]] && mkdir -p "/var/lib/logstash"
        container_config:
          - "lxc.mount.entry=/openstack/{{ inventory_hostname }}/logstash var/lib/logstash none bind 0 0"
      delegate_to: "{{ physical_host }}"
      when:
        - physical_host != inventory_hostname
        - container_tech | default('lxc') == 'lxc'

    - name: Ensure Java is installed
      apt:
        name: openjdk-8-jre
        state: "{{ elk_package_state | default('present') }}"
        install_recommends: yes
        update_cache: yes
      register: _apt_task
      until: _apt_task is success
      retries: 3
      delay: 2
      tags:
        - package_install

    - name: Ensure Logstash is installed
      apt:
        name: logstash
        state: "{{ elk_package_state | default('present') }}"
        update_cache: yes
      register: _apt_task
      until: _apt_task is success
      retries: 3
      delay: 2
      tags:
        - package_install

    - name: Drop elasticsearch conf file
      template:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
      with_items:
        - src: templates/jvm.options.j2
          dest: /etc/logstash/jvm.options
        - src: templates/99-elasticsearch-output.conf.j2
          dest: /etc/logstash/conf.d/99-elasticsearch-output.conf
        - src: templates/02-beats-input.conf.j2
          dest: /etc/logstash/conf.d/02-beats-input.conf
        - src: templates/logstash.yml.j2
          dest: /etc/logstash/logstash.yml
      notify:
        - Enable and restart logstash
      tags:
        - config

    - name: Create patterns directory
      file:
        name: "/opt/logstash/patterns"
        owner: "logstash"
        group: "logstash"
        state: directory
      tags:
        - logstash-patterns

    - name: Logstash Extra Patterns
      template:
        src: "{{ item }}"
        dest: "/opt/logstash/patterns/{{ item }}"
        owner: "logstash"
        group: "logstash"
      with_items:
        - extras
      when:
        - logstash_deploy_filters
      notify:
        - Enable and restart logstash
      tags:
        - logstash-filters
        - config

    - name: Deploy Logstash configuration files
      copy:
        src: "files/{{ item }}"
        dest: "/etc/logstash/conf.d/{{ item }}"
      with_items:
        - 02-general.conf
        - 02-journald.conf
        - 03-nova.conf
        - 04-neutron.conf
        - 05-glance.conf
        - 06-cinder.conf
        - 07-libvirt.conf
        - 08-apache.conf
        - 09-heat.conf
        - 10-mysql.conf
        - 10-syslog-filter.conf
        - 11-auth.conf
        - 12-logstash.conf
        - 13-swift.conf
        - 14-keystone.conf
        - 16-elasticsearch.conf
        - 17-rabbitmq.conf
        - 18-ceph.conf
        - 19-nginx.conf
        - 20-magnum.conf
        - 21-octavia.conf
        - 98-traceback.conf
      when:
        - logstash_deploy_filters
      notify:
        - Enable and restart logstash
      tags:
        - logstash-filters
        - config

    - name: Run kafka output block
      block:
        - name: Copy kafka keystore into place
          copy:
            src: "{{ logstash_kafka_ssl_keystore_location }}"
            dest: "/var/lib/logstash/{{ logstash_kafka_ssl_keystore_location | basename }}"
          when:
            - logstash_kafka_ssl_keystore_location is defined

        - name: Copy kafka truststore into place
          copy:
            src: "{{ logstash_kafka_ssl_truststore_location }}"
            dest: "/var/lib/logstash/{{ logstash_kafka_ssl_truststore_location | basename }}"
          when:
            - logstash_kafka_ssl_truststore_location is defined

        - name: Deploy Logstash kafka configuration files
          template:
            src: "templates/99-kafka-output.conf"
            dest: "/etc/logstash/conf.d/99-kafka-output.conf"
          notify:
            - Enable and restart logstash
      when:
        - logstash_kafka_options is defined

    - name: Ensure logstash ownership
      file:
        path: /var/lib/logstash
        owner: logstash
        group: logstash
        recurse: true
      register: l_perms
      until: l_perms is success
      retries: 3
      delay: 1

  handlers:
    - name: Enable and restart logstash
      systemd:
        name: "logstash"
        enabled: true
        state: restarted

  tags:
    - server-install