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”