In diesem Artikel erfahren Sie, wie Sie mit Shell und Ansible ES-Cluster (ElasticSearch) mit einem Klick bereitstellen, Batch-Vorgänge bei der Cluster-Bereitstellung realisieren und den Charme der automatisierten Bereitstellung genießen.
Bereiten Sie den Host vor
CPU-Name | IP | CPU | Scheibe | Erinnerung |
---|---|---|---|---|
Ansible | 10.0.0.61 | 2C | 20G | 2G |
ELK104 | 10.0.0.104 | 2C | 20G | 2G |
ELK105 | 10.0.0.105 | 2C | 20G | 2G |
ELK106 | 10.0.0.106 | 2C | 20G | 2G |
Shell-Bereitstellung mit einem Klick
Wir bereiten die erforderlichen Dateien auf Ansible vor (ES-Installationspaket ohne JDK und Oracles JDK) und schreiben Shell-Skripte in Ansible, um die Bereitstellung des ES-Clusters mit einem Klick zu erreichen. Tatsächlich gibt es viele Ideen für das Schreiben von Skripten. Hier verwende ich Do Dies sollten Sie zunächst vermeiden: Schreiben Sie nach Abschluss des Schlüssels eine for-Schleife, um eine Einzelpunktbereitstellung durchzuführen. Sie können einen Knoten auch direkt bereitstellen und kopieren.
Wenn Sie das Verzeichnis ändern möchten, müssen Sie die Skriptdateien, die Dateien elasticsearch.yml und es7.service ändern, sodass die Konfigurationsdateien gepackt und am Ende des Artikels platziert werden.
[root@Ansible ~]# cat deploy_ES.sh
#!/bin/bash
#1、先做免密钥,方便文件的推送以及远程执行命令
if [ -f /root/.ssh/id_rsa.pub ];then
echo "公钥已经存在"
else
ssh-keygen -t rsa
echo "公钥不存在,自动创建公钥"
fi
hosts=(
10.0.0.104
10.0.0.105
10.0.0.106
)
for i in ${hosts[*]}
do
expect <<EOF
set timeout 10
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "1\n" }
}
expect "password" { send "1\n" }
EOF
done
#2、准备配置文件
# 拼接IP字符串
ip_str=$(printf '", "%s' "${hosts[@]}")
ip_str=${ip_str:3}
# 替换文件中的IP地址
sed -i 's#^discovery.*#discovery.seed_hosts: \['"$ip_str"'"\]#g' elasticsearch.yml
sed -i 's#^cluster.initial_master_nodes.*#cluster.initial_master_nodes: \['"$ip_str"'"\]#g' elasticsearch.yml
#3、搭建ES集群
for q in ${hosts[*]}
do
scp -r elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz jdk-8u291-linux-x64.tar.gz elasticsearch.yml es7.service jvm.options jdk.sh $q:/root/
ssh $q "mkdir -p /koten/{softwares,data,logs}"
ssh $q "tar xf /root/elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz -C /koten/softwares/"
ssh $q "useradd koten"
ssh $q "chown koten:koten /koten/softwares/elasticsearch-7.17.5/ -R"
ssh $q "cat > /etc/security/limits.d/es.conf <<EOF
* soft nofile 65535
* hard nofile 131070
EOF
"
ssh $q "cat > /etc/sysctl.d/es.conf <<EOF
vm.max_map_count=262144
EOF"
ssh $q "sysctl -f /etc/sysctl.d/es.conf"
ssh $q "tar xf /root/jdk-8u291-linux-x64.tar.gz -C /koten/softwares/"
ssh $q "\cp /root/elasticsearch.yml /koten/softwares/elasticsearch-7.17.5/config/"
ssh $q "\cp /root/es7.service /usr/lib/systemd/system/"
ssh $q "\cp /root/jvm.options /koten/softwares/elasticsearch-7.17.5/config/"
ssh $q "\cp /root/jdk.sh /etc/profile.d/"
ssh $q "source /etc/profile.d/jdk.sh"
ssh $q "install -d /koten/{data,logs}/es7 -o koten -g koten"
done
#3、都部署好后再启动,防止脑裂
for e in ${hosts[*]}
do
ssh $e "systemctl enable --now es7"
if [ `ss -ntl | grep 19|wc -l` != 0 ];then
echo "$e 主机ES启动成功!"
fi
done
[root@Ansible ~]# sh deploy_ES.sh
......
Created symlink from /etc/systemd/system/multi-user.target.wants/es7.service to /usr/lib/systemd/system/es7.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/es7.service to /usr/lib/systemd/system/es7.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/es7.service to /usr/lib/systemd/system/es7.service.
[root@ELK104 ~]# netstat -tnulp|grep 19
tcp6 0 0 :::19200 :::* LISTEN 2252/java
tcp6 0 0 :::19300 :::* LISTEN 2252/java
Ansible-Batch-Bereitstellung
1. Initialisieren Sie das Rollenverzeichnis
[root@Ansible roles]# ansible-galaxy init es
- Role es was created successfully
[root@Ansible roles]# cd es
[root@Ansible es]# pwd
/ansible/roles/es
[root@Ansible es]# ls
defaults files handlers meta README.md tasks templates tests vars
2. Schreiben Sie schlüsselfreie Playbooks für 10.0.0.104, 10.0.0.105 und 10.0.0.106
[root@Ansible es]# cat /etc/ansible/hosts | tail -4
[es_group]
es104 ansible_ssh_host=10.0.0.104 ansible_ssh_user='root' ansible_ssh_pass='1'
es105 ansible_ssh_host=10.0.0.105 ansible_ssh_user='root' ansible_ssh_pass='1'
es106 ansible_ssh_host=10.0.0.106 ansible_ssh_user='root' ansible_ssh_pass='1'
[root@Ansible es]# cat ssh.yaml
---
- hosts: es_group
gather_facts: no
tasks:
- name: install ssh key
authorized_key: user=root
key="{
{ lookup('file','/root/.ssh/id_rsa.pub')}}"
state=present
[root@Ansible es]# ansible-playbook ssh.yaml
PLAY [es_group] ****************************************************************************************
TASK [install ssh key] *********************************************************************************
changed: [es106]
changed: [es105]
changed: [es104]
PLAY RECAP *********************************************************************************************
es104 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
es105 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
es106 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3. Schreiben Sie ein Playbook für Daten-Push und Konfiguration
Wenn Sie den Host ändern müssen, müssen Sie nicht nur die Hosts-Datei, sondern auch Elasticsearch.yml ändern
[root@Ansible roles]# cat hosts | tail -4
[es_group]
10.0.0.104
10.0.0.105
10.0.0.106
[root@Ansible roles]# cat site.yml
- hosts: es_group
roles:
- role: es
[root@Ansible roles]# ls es/files/
elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz es7.service jdk.sh
elasticsearch.yml jdk-8u291-linux-x64.tar.gz jvm.options
[root@Ansible roles]# cat es/tasks/main.yml
- name: mkdir /koten/softwares /koten/data /koten/logs
file:
path: "{
{ item }}"
state: directory
with_items:
- /koten/softwares
- /koten/data
- /koten/logs
- name: tar xf elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz jdk-8u291-linux-x64.tar.gz
unarchive:
src: "{
{ item }}"
dest: /koten/softwares
with_items:
- elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz
- jdk-8u291-linux-x64.tar.gz
- name: Create koten Group
group:
name: koten
- name: Create koten User
user:
name: koten
- name: chown -R koten.koten /koten/softwares/elasticsearch-7.17.5/
file:
path: /koten/softwares/elasticsearch-7.17.5/
owner: koten
group: koten
recurse: yes
- name: copy content to /etc/security/limits.d/es.conf
copy:
content: |
* soft nofile 65535
* hard nofile 131070
dest: /etc/security/limits.d/es.conf
- name: copy test content to /etc/sysctl.d/es.conf
copy:
content: |
vm.max_map_count=262144
dest: /etc/sysctl.d/es.conf
- name: sysctl -f /etc/sysctl.d/es.conf
command: sysctl -f /etc/sysctl.d/es.conf
- name: push es7.service to /usr/lib/systemd/system/
copy:
src: es7.service
dest: /usr/lib/systemd/system/
- name: push jvm.options to /koten/softwares/elasticsearch-7.17.5/config/
copy:
src: jvm.options
dest: /koten/softwares/elasticsearch-7.17.5/config/
- name: push elasticsearch.yml to /koten/softwares/elasticsearch-7.17.5/config/
copy:
src: elasticsearch.yml
dest: /koten/softwares/elasticsearch-7.17.5/config/elasticsearch.yml
- name: push jdk.sh to /etc/profile.d/
copy:
src: jdk.sh
dest: /etc/profile.d/
- name: source /etc/profile.d/jdk.sh
command: bash -c 'source /etc/profile.d/jdk.sh'
- name: mkdir /koten/data/es7 /koten/logs/es7
file:
path: "{
{ item }}"
state: directory
owner: koten
group: koten
with_items:
- /koten/data/es7
- /koten/logs/es7
- name: systemctl enable --now es7
systemd:
name: es7
state: started
enabled: yes
4. Führen Sie das Daten-Push- und Konfigurations-Playbook aus und stellen Sie den ES-Cluster bereit
[root@Ansible roles]# ansible-playbook site.yml
PLAY [es_group] ****************************************************************
TASK [Gathering Facts] *********************************************************
ok: [es105]
ok: [es106]
ok: [es104]
TASK [mkdir /koten/softwares /koten/data /koten/logs] **************************
changed: [es105] => (item=/koten/softwares)
changed: [es104] => (item=/koten/softwares)
changed: [es106] => (item=/koten/softwares)
changed: [es106] => (item=/koten/data)
changed: [es104] => (item=/koten/data)
changed: [es105] => (item=/koten/data)
changed: [es106] => (item=/koten/logs)
changed: [es105] => (item=/koten/logs)
changed: [es104] => (item=/koten/logs)
TASK [es : tar xf elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz jdk-8u291-linux-x64.tar.gz] ***
changed: [es105] => (item=elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz)
changed: [es104] => (item=elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz)
changed: [es106] => (item=elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz)
changed: [es105] => (item=jdk-8u291-linux-x64.tar.gz)
changed: [es106] => (item=jdk-8u291-linux-x64.tar.gz)
changed: [es104] => (item=jdk-8u291-linux-x64.tar.gz)
TASK [es : Create koten Group] *************************************************
changed: [es105]
changed: [es106]
changed: [es104]
TASK [es : Create koten User] **************************************************
changed: [es104]
changed: [es105]
changed: [es106]
TASK [chown -R koten.koten /koten/softwares/elasticsearch-7.17.5/] *************
changed: [es104]
changed: [es105]
changed: [es106]
TASK [copy content to /etc/security/limits.d/es.conf] **************************
changed: [es104]
changed: [es106]
changed: [es105]
TASK [copy test content to /etc/sysctl.d/es.conf] ******************************
changed: [es106]
changed: [es104]
changed: [es105]
TASK [sysctl -f /etc/sysctl.d/es.conf] *****************************************
changed: [es106]
changed: [es104]
changed: [es105]
TASK [push es7.service to /usr/lib/systemd/system/] ****************************
changed: [es104]
changed: [es105]
changed: [es106]
TASK [push jvm.options to /koten/softwares/elasticsearch-7.17.5/config/] *******
changed: [es104]
changed: [es105]
changed: [es106]
TASK [push elasticsearch.yml to /koten/softwares/elasticsearch-7.17.5/config/] ***
changed: [es104]
changed: [es106]
changed: [es105]
TASK [es : push jdk.sh to /etc/profile.d/] *************************************
changed: [es104]
changed: [es105]
changed: [es106]
TASK [es : source /etc/profile.d/jdk.sh] ***************************************
changed: [es104]
changed: [es106]
changed: [es105]
TASK [mkdir /koten/data/es7 /koten/logs/es7] ***********************************
changed: [es104] => (item=/koten/data/es7)
changed: [es105] => (item=/koten/data/es7)
changed: [es106] => (item=/koten/data/es7)
changed: [es105] => (item=/koten/logs/es7)
changed: [es104] => (item=/koten/logs/es7)
changed: [es106] => (item=/koten/logs/es7)
TASK [systemctl enable --now es7] **********************************************
changed: [es106]
changed: [es104]
changed: [es105]
PLAY RECAP *********************************************************************
es104 : ok=16 changed=15 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
es105 : ok=16 changed=15 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
es106 : ok=16 changed=15 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 查看es的状态
[root@ELK104 ~]# systemctl status es7.service
● es7.service - es7
Loaded: loaded (/usr/lib/systemd/system/es7.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2023-10-27 14:01:54 CST; 42s ago
Main PID: 3578 (java)
CGroup: /system.slice/es7.service
├─3578 /koten/softwares/jdk1.8.0_291/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=6...
└─3711 /koten/softwares/elasticsearch-7.17.5/modules/x-pack-ml/platform/linux-x86_64/bin/c...
Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,716][INFO ][o.e.p.PluginsService ...wn]
Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,716][INFO ][o.e.p.PluginsService ...ql]
Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,716][INFO ][o.e.p.PluginsService ...ck]
Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,717][INFO ][o.e.p.PluginsService ...re]
Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,717][INFO ][o.e.p.PluginsService ...de]
Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,749][INFO ][o.e.p.PluginsService ...er]
Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,750][INFO ][o.e.p.PluginsService ...ded
Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,958][INFO ][o.e.e.NodeEnvironment...fs]
Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,959][INFO ][o.e.e.NodeEnvironment...ue]
Oct 27 14:02:20 ELK104 elasticsearch[3578]: [2023-10-27T14:02:20,074][INFO ][o.e.n.Node ...st]
Hint: Some lines were ellipsized, use -l to show in full.
Link zum Herunterladen der Paketdatei „deploy_es_shell“: https://pan.baidu.com/s/1l22I0aSB-50NXlh4lYZArw?pwd=umbm
Link zum Herunterladen der Paketdatei „deploy_es_ansible“: https://pan.baidu.com/s/1lIfYWMnhsg7yoyzgkBSEDA?pwd=8hpl
Mein Name ist Koten. Ich verfüge über 10 Jahre Betriebs- und Wartungserfahrung. Ich teile weiterhin Betriebs- und Wartungstipps. Vielen Dank fürs Lesen und Aufpassen!