First, we have a playbook:
es.yml1 2 3 4 5
| - hosts: es become: yes roles: - elasticsearch serial: "50%"
|
serial: "50%"
means ansbile will run tasks in 50% of hosts (or less).
And, we should add a rule elasticsearch
:
roles/elasticsearch/tasks/main.yml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| --- - name: disable shard allocation for the cluster uri: url=http://localhost:9200/_cluster/settings method=PUT body='{{ es_allocation.disable }}' body_format=json ignore_errors: yes
- name: download ealsticsearch deb pacakge local_action: module: get_url url: "{{ elasticsearch_url }}" dest: "cache/elasticsearch-{{ elasticsearch_version }}.deb" checksum: "sha256:{{ elasticsearch_sha256 }}" become: no
- name: check if elasticsearch is installed command: dpkg-query --showformat='${Version}' -W elasticsearch register: elasticsearch_version_check failed_when: elasticsearch_version_check.rc > 1 changed_when: elasticsearch_version_check.rc == 1
- block: - name: copy elasticsearch package copy: src="cache/elasticsearch-{{ elasticsearch_version }}.deb" dest=/tmp/elasticsearch.deb - name: install elasticsearch apt: deb=/tmp/elasticsearch.deb always: - name: delete elasticsearch package file: path=/tmp/elasticsearch.deb state=absent when: elasticsearch_version_check.stdout != "{{ elasticsearch_version }}"
- name: restart elasticsearch service: name=elasticsearch state=restarted
- name: wait for elasticsearch node to come back up wait_for: port=9200 delay=15
- name: enable shard allocation for the cluster uri: url=http://localhost:9200/_cluster/settings method=PUT body='{{ es_allocation.enable }}' body_format=json
- name: wait for cluster health to return to green uri: url=http://localhost:9200/_cluster/health method=GET register: response until: "response.json.status == 'green'" retries: 50 delay: 5
|
- we try to disable allocation for cluster upgrade
- download elasticsearch’s deb package to local cache
- install and configure, restart elasticsearch
- wait 9200 port is available, enable allocation, wait for cluster become green.
some vars:
roles/elasticsearch/vars/main.yml1 2 3 4 5 6 7 8
| --- elasticsearch_version: 2.3.2 elasticsearch_url: "https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/{{ elasticsearch_version }}/elasticsearch-{{ elasticsearch_version }}.deb" elasticsearch_sha256: 3d474b0123ec8ad4ebfa089f8cde607033e6cbef28a6a0df318bdc3d2a546cd8
es_allocation: disable: '{"transient":{"cluster.routing.allocation.enable":"none"}}' enable: '{"transient":{"cluster.routing.allocation.enable": "all"}}'
|
something to notice:
Do not forget configure unique cluster.name
in elasticsearch.yml
.
configure node.name
to ${HOSTNAME}
in elasticsearch.yml
, needn’t to generate nodename.
generate host list from inventory list:
1 2 3 4
| discovery.zen.ping.unicast.hosts: {% for host in groups['es'] %} - {{ host }} {% endfor -%}
|
When master is upgrading, master electing will cause cluster unavailable for write.