Elasticsearch 클러스터 반납 ansible 코드 작성
코드 작성 배경
사내에서 Elasticsearch (이하 ES) 클러스터 구성할 때 설정하는 작업들이 있습니다. ES 설치 및 서비스 구동, curator를 이용하여 로그들을 주기적으로 삭제하는 crontab 설정, ES data node들에 쿼리를 날리기 위해 LB와 연결되는 domain 설정, elasticsearch exporter를 이용하여 prometheus 모니터링 target 설정 등의 작업들을 진행합니다.
ES 클러스터 반납을 하기 위해서는 위의 설정한 항목들(ES 서비스 중지, 도메인 삭제, crontab 해제, 모니터링 해제)의 해제 작업을 해주어야 합니다. LB와 클러스터들이 생성된 vm들의 경우에는 반납 과정 처리 후 삭제해주면 되고, PM(physical machine)의 경우에는 OS 재설치를 진행하여 깔끔하게 반납 처리할 수 있습니다.
사내 ES 클러스터 반납 과정을 진행해보면서, 수작업으로 하나씩 처리하기에는 놓치는 작업들이 있었습니다. ex) 반납된 클러스터이지만 도메인과 crontab 삭제가 되지 않은 경우
또한, 도메인의 경우에는 DNS web UI에 접속해서 삭제를 해줘야 했기 때문에 하나의 작업이 더 추가됩니다.
스크립트로 작성하면 간단하기도 하고, 몇 대 되지도 않는 서버에 ansible을 돌리는 거는 ansible 취지에 맞지 않을 수도 있다고 생각도 들었지만, PM에 elasticsearch를 구성한 경우에는 서비스를 내려야 OS 재설치할 때 문제가 없기 때문에 모든 과정을 한 번에 진행할 수 있도록 코드를 작성하였습니다. (ansible을 좀 더 사용해보자는 생각도 있긴 했습니다)
코드 실행 방법
# FQDN은 예시입니다
# 아래와 같은 양식으로 hostsfile 작성
edenui-MacBookPro:single_tasks root# vi hostsfile
eden-test-es-master-1.eden.io / 10.10.10.10
eden-test-es-master-2.eden.io / 10.10.10.10
eden-test-es-master-3.eden.io / 10.10.10.10
eden-test-es-data-1.eden.io / 10.20.20.20
eden-test-es-data-2.eden.io / 10.20.20.20
eden-test-es-data-3.eden.io / 10.20.20.20
# hostsfile 기반으로 프린트 되는 내용을 hosts 파일에 붙여넣습니다.
edenui-MacBookPro:single_tasks root# ./hosts-generator.sh
[master-node]
eden-test-es-master-1.eden.io
eden-test-es-master-2.eden.io
eden-test-es-master-3.eden.io
[data-node]
eden-test-es-data-1.eden.io
eden-test-es-data-2.eden.io
eden-test-es-data-3.eden.io
[ES-management-node]
es-management-node.eden.io
# cluster-var 파일에 cluster_name, zone_name 을 적습니다.
edenui-MacBookPro:single_tasks root# vi tasks/cluster-var
cluster_name: eden-test-es
zone_name: eden.io
# ./return_cluster.sh 을 실행합니다.
# 내용 : ansible-playbook -i hosts --user eden ./tasks/return_cluster.yml --ask-vault-pass --extra-vars @tasks/var/key-var -k
edenui-MacBookPro:single_tasks root# ./return_cluster.sh
# ssh 접속 비밀번호와 vault decrypt를 위한 비밀번호를 적습니다.
코드 설명
Path: ansible-elasticsearch/single_tasks/tasks/return_cluster.yml
- name: return cluster
hosts: ES-mgmt-node
become: yes
vars_files: var/cluster-var
tasks:
- name: disable ES monitoring ///////ES node들을 모니터링하는 파일에서 주석처리
replace:
path: /etc/prometheus/elasticsearch_exporter_targets.yml
regexp: "- {{ item }}"
replace: "#- {{item}}"
with_items:
- "{{groups['master-node']}}"
- "{{groups['data-node']}}"
- name: reload exporter target /////// 주석처리 한 후 모니터링 파일 Reload
uri:
url: http://localhost:9090/-/reload
method: POST
- name: delete crontab ///// crontab으로 돌고 있던 내용 삭제, eden-test-es 이라는 클러스터 이름을 제외한 내용을 출력하고 crontab에 다시 씀
shell: crontab -l | grep -v "{{cluster_name}}" | crontab -
- name: delete domain record //// powerdns 레코드 삭제 API를 이용하여 LB랑 연결되어 있던 ES cluster 도메인 삭제
uri:
url: https://powerdns-api.eden.io/api/v1/servers/localhost/zones/{{zone_name}}
method: PATCH
#return_content: yes
body: "{\"rrsets\": [{\"changetype\":\"DELETE\",\"type\":\"A\",\"name\":\"{{ cluster_name}}.{{zone_name}}.\"}]}"
body_format: json
status_code: 204
headers:
X-API-Key: "{{api_key}}" //// 암호화된 변수
- name: move returned cluster files //curator config 파일 backup
command: mv /home/eden/curator/{{item['file']}} /home/eden/curator/{{item['backup']}}/backup
with_items:
- { file: 'action_config/{{cluster_name}}-action.yml', backup: 'action_config' }
- { file: 'target_config/{{cluster_name}}-config.yml', backup: 'target_config' }
- { file: 'scrtips/{{cluster_name}}.sh', backup: 'scrtips' }
- { file: 'log/{{cluster_name}}.log', backup: 'log' }
- name: disable ES nodes //// 각 노드에 있는 ES 서비스 down
hosts:
- master-node
- data-node
become: yes
tasks:
- name: stop ES services
systemd:
state: stopped
name: elasticsearch
enabled: no
- name: stop ES exporter services
systemd:
state: stopped
name: elasticsearch_exporter.service
enabled: no
API key 암호화를 위해 아래의 과정을 수행하였습니다. 아래 커맨드를 입력하면 해당 파일이 encrypt 처리되고 ansible을 실행할 때 비밀번호를 입력하여 decrypt 처리할 수 있습니다.
edenui-MacBookPro:var root# ansible-vault encrypt key-var
**참고
간혹 ansible을 돌리다보면 아래와 같은 에러가 발생하고는 하는데 다음과 같이 해결할 수 있습니다.
TASK [Gathering Facts] *********************************************************
fatal: [es-management-node.eden.io]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."}
edenui-MacBookPro:single_tasks root# export ANSIBLE_HOST_KEY_CHECKING=False