---
- name: Install Elastic Search
  hosts: "elastic-logstash:kibana"
  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 memory fact to half
      set_fact:
        h_mem: "{{ (ansible_memtotal_mb | int) // 2 }}"
      tags:
        - always

    - name: Set logstash facts
      set_fact:
        elastic_heap_size: "{{ ((h_mem | int) > 30720) | ternary(30720, h_mem) }}"
      tags:
        - always

    - name: Set kibana elasticsearch facts
      block:
        - name: Set kibana as elasticsearch coordinators
          set_fact:
            elasticsearch_node_master: false
            elasticsearch_node_data: false
            elasticsearch_node_ingest: false
            elastic_heap_size: "{{ (elastic_heap_size | int) // 3 }}"
      when:
        - inventory_hostname in (groups['kibana'] | difference(groups['elastic-logstash']))
      tags:
        - always

    - 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 }}/elasticsearch"
        state: "directory"
      delegate_to: "{{ physical_host }}"

    - name: elasticsearch datapath bind mount
      lxc_container:
        name: "{{ inventory_hostname }}"
        container_command: |
          [[ ! -d "/var/lib/elasticsearch" ]] && mkdir -p "/var/lib/elasticsearch"
        container_config:
          - "lxc.mount.entry=/openstack/{{ inventory_hostname }}/elasticsearch var/lib/elasticsearch 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

    - include_tasks: common_task_install_elk_repo.yml

    - name: Ensure Elastic search is installed
      apt:
        name: elasticsearch
        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/elasticsearch.yml.j2
          dest: /etc/elasticsearch/elasticsearch.yml
        - src: templates/jvm.options.j2
          dest: /etc/elasticsearch/jvm.options
        - src: templates/es-log4j2.properties.j2
          dest: /etc/elasticsearch/log4j2.properties
      tags:
        - config

    - name: Ensure elasticsearch ownership
      file:
        path: /var/lib/elasticsearch
        owner: elasticsearch
        group: elasticsearch
        recurse: true
      register: e_perms
      until: e_perms is success
      retries: 3
      delay: 1
      tags:
        - config

    - name: Enable and restart elastic
      systemd:
        name: "elasticsearch"
        enabled: true
        state: restarted
      tags:
        - config

  tags:
    - server-install