The whole idea of this post is obvious. I have already covered the same objective in a standard fashion but this is about perform the installation via ansible automation. If you don’t have an understanding on Ansible Directory Structure – I really recommend to check my other post –Â where I highlighted each key areas that needed to get familiar.
Inventory File
In the example, I am going to deploy Three nodes of ElasticSearch – one represent MASTER role, while other two as DATA role.
[elastic_master] es-0001 ansible_host=172.17.0.10 [elastic_data] es-0002 ansible_host=172.17.0.11 es-0003 ansible_host=172.17.0.12
prod.yaml
- hosts: elastic_master <------------ following actions will be performed against any host listed in elastic_master alias which found to be in inventory file remote_user: root <---------------- to execute the command as root become: true pre_tasks: - name: "Installing basic packages" action: yum <---------------- calls the yum module and any key that goes with with_items will be installed name={{ item }} state=installed with_items: - unzip when: ansible_os_family == "RedHat" <---------------- a condition such that instruct the ansible pre_tasks should only suppose to be executed on a Fedora based distribution roles: - { role: elastic_master_install } - hosts: elastic_data remote_user: root become: true pre_tasks: - name: "Installing basic packages" action: yum name={{ item }} state=installed with_items: - unzip when: ansible_os_family == "RedHat" roles: - { role: elastic_data_install }
Default File
As we already covered this variables will be used when files which are in Jinga format are being copied under the Template DIrectory.
# vim roles/elastic_master_install/defaults
cluster_name: clusterName node_master_true: "true" node_data_true: "false" node_ingest_true: "false" path_to_log: /data/elk/logs path_to_data: /data/elk/data http_port: 9200 transport_tcp_port: 9300 discovery_zen_ping_unicast_hosts: '["172.17.0.10"]' ### - jvm config init_heap_size: "-Xms8g" max_heap_size: "-Xmx8g"
Template file Example
This is how a basic elasticsearch.yaml looks like in Jinja fromat.
# vim roles/elastic_master_install/templates/elasticsearch.yml.j2
cluster.name: {{cluster_name}}
node.name: {{inventory_hostname}}
node.master: {{node_master_true}}
node.data: {{node_data_true}}
node.ingest: {{node_ingest_true}}
path.data: {{path_to_data}}
path.logs: {{path_to_log}}
network.host: {{ansible_host}}
Task File
This is where we can define all the task that are part of the respective role, in this case task that needed to execute setting up Elasticsearch
# vim roles/elastic_master_install/tasks/main.yml
- name: Creating elk user...
user:
name: elk
comment: "elk User"
createopt: yes
opt: /opt/elk/
uid: 1999
shell: /bin/bash
become: true
- name: Copying & untar ElasticSearch5.5..
unarchive:
src: /root/Ansible/ElasticSearch5/roles/elastic_master_install/Files/elasticsearch-5.5.0.tar.gz
dest: /opt/elk/
owner: elk
group: elk
mode: 0755
become: true
- name: Creating necessary directories..
file:
path: /data/elk/{{ item }}
state: directory
owner: elk
group: elk
mode: 0775
recurse: yes
with_items:
- [data, logs, run]
become: true
- name: Copying the main config file...
template: src=elasticsearch.yml.j2 dest={{elasticsearch_config_dir}}/elasticsearch.yml owner=elk group=elk mode=0644
become: true
Please note that I have only added files for Role “elastic_master_install” => Task/Template/Default. However, as in the prod.yaml there is another role called “elastic_data_install” which you also need to work on as did in above last three steps.
When you have the Directory Structure ready, you can initiate the Ansible by;
# ansible-playbook -i inventory prod.yaml
“I hope this has been informative for you”


