• 【运维知识大神篇】两种方法,一键部署ElasticSearch集群(Shell+Ansible自动化部署)


    本篇文章给大家介绍一下用Shell和Ansible两种方式,去一键部署ES(ElasticSearch)集群,实现在集群部署中的批量化操作,享受自动化部署的魅力。

    准备主机

    主机名IPcpudiskmemory
    Ansible10.0.0.612C20G2G
    ELK10410.0.0.1042C20G2G
    ELK10510.0.0.1052C20G2G
    ELK10610.0.0.1062C20G2G

    Shell一键部署

    我们在Ansible上准备好所需文件(无JDK的ES安装包和oracle的JDK),在Ansible编写Shell脚本,实现ES集群的一键部署,其实脚本编写的思路有很多,这里我使用先做免密钥,做完后写for循环,里面进行单点部署,也可以直接部署出来一个节点后进行拷贝

    如果想修改目录的话需要修改脚本,elasticsearch.yml、es7.service里的文件,所以配置文件都打包放在了文末。

    1. [root@Ansible ~]# cat deploy_ES.sh
    2. #!/bin/bash
    3. #1、先做免密钥,方便文件的推送以及远程执行命令
    4. if [ -f /root/.ssh/id_rsa.pub ];then
    5. echo "公钥已经存在"
    6. else
    7. ssh-keygen -t rsa
    8. echo "公钥不存在,自动创建公钥"
    9. fi
    10. hosts=(
    11. 10.0.0.104
    12. 10.0.0.105
    13. 10.0.0.106
    14. )
    15. for i in ${hosts[*]}
    16. do
    17. expect <<EOF
    18. set timeout 10
    19. spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
    20. expect {
    21. "yes/no" { send "yes\n";exp_continue }
    22. "password" { send "1\n" }
    23. }
    24. expect "password" { send "1\n" }
    25. EOF
    26. done
    27. #2、准备配置文件
    28. # 拼接IP字符串
    29. ip_str=$(printf '", "%s' "${hosts[@]}")
    30. ip_str=${ip_str:3}
    31. # 替换文件中的IP地址
    32. sed -i 's#^discovery.*#discovery.seed_hosts: \['"$ip_str"'"\]#g' elasticsearch.yml
    33. sed -i 's#^cluster.initial_master_nodes.*#cluster.initial_master_nodes: \['"$ip_str"'"\]#g' elasticsearch.yml
    34. #3、搭建ES集群
    35. for q in ${hosts[*]}
    36. do
    37. 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/
    38. ssh $q "mkdir -p /koten/{softwares,data,logs}"
    39. ssh $q "tar xf /root/elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz -C /koten/softwares/"
    40. ssh $q "useradd koten"
    41. ssh $q "chown koten:koten /koten/softwares/elasticsearch-7.17.5/ -R"
    42. ssh $q "cat > /etc/security/limits.d/es.conf <
    43. * soft nofile 65535
    44. * hard nofile 131070
    45. EOF
    46. "
    47. ssh $q "cat > /etc/sysctl.d/es.conf <
    48. vm.max_map_count=262144
    49. EOF"
    50. ssh $q "sysctl -f /etc/sysctl.d/es.conf"
    51. ssh $q "tar xf /root/jdk-8u291-linux-x64.tar.gz -C /koten/softwares/"
    52. ssh $q "\cp /root/elasticsearch.yml /koten/softwares/elasticsearch-7.17.5/config/"
    53. ssh $q "\cp /root/es7.service /usr/lib/systemd/system/"
    54. ssh $q "\cp /root/jvm.options /koten/softwares/elasticsearch-7.17.5/config/"
    55. ssh $q "\cp /root/jdk.sh /etc/profile.d/"
    56. ssh $q "source /etc/profile.d/jdk.sh"
    57. ssh $q "install -d /koten/{data,logs}/es7 -o koten -g koten"
    58. done
    59. #3、都部署好后再启动,防止脑裂
    60. for e in ${hosts[*]}
    61. do
    62. ssh $e "systemctl enable --now es7"
    63. if [ `ss -ntl | grep 19|wc -l` != 0 ];then
    64. echo "$e 主机ES启动成功!"
    65. fi
    66. done
    67. [root@Ansible ~]# sh deploy_ES.sh
    68. ......
    69. Created symlink from /etc/systemd/system/multi-user.target.wants/es7.service to /usr/lib/systemd/system/es7.service.
    70. Created symlink from /etc/systemd/system/multi-user.target.wants/es7.service to /usr/lib/systemd/system/es7.service.
    71. Created symlink from /etc/systemd/system/multi-user.target.wants/es7.service to /usr/lib/systemd/system/es7.service.
    72. [root@ELK104 ~]# netstat -tnulp|grep 19
    73. tcp6 0 0 :::19200 :::* LISTEN 2252/java
    74. tcp6 0 0 :::19300 :::* LISTEN 2252/java

     

    Ansible批量部署

    1、初始化roles目录

    1. [root@Ansible roles]# ansible-galaxy init es
    2. - Role es was created successfully
    3. [root@Ansible roles]# cd es
    4. [root@Ansible es]# pwd
    5. /ansible/roles/es
    6. [root@Ansible es]# ls
    7. defaults files handlers meta README.md tasks templates tests vars

    2、编写给10.0.0.104、10.0.0.105、10.0.0.106做免密钥的playbook

    1. [root@Ansible es]# cat /etc/ansible/hosts | tail -4
    2. [es_group]
    3. es104 ansible_ssh_host=10.0.0.104 ansible_ssh_user='root' ansible_ssh_pass='1'
    4. es105 ansible_ssh_host=10.0.0.105 ansible_ssh_user='root' ansible_ssh_pass='1'
    5. es106 ansible_ssh_host=10.0.0.106 ansible_ssh_user='root' ansible_ssh_pass='1'
    6. [root@Ansible es]# cat ssh.yaml
    7. ---
    8. - hosts: es_group
    9. gather_facts: no
    10. tasks:
    11. - name: install ssh key
    12. authorized_key: user=root
    13. key="{{ lookup('file','/root/.ssh/id_rsa.pub')}}"
    14. state=present
    15. [root@Ansible es]# ansible-playbook ssh.yaml
    16. PLAY [es_group] ****************************************************************************************
    17. TASK [install ssh key] *********************************************************************************
    18. changed: [es106]
    19. changed: [es105]
    20. changed: [es104]
    21. PLAY RECAP *********************************************************************************************
    22. es104 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    23. es105 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    24. es106 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

    3、编写数据推送和配置的playbook

    如果需要修改主机,不仅要修改hosts文件,还需要修改elasticsearch.yml

    1. [root@Ansible roles]# cat hosts | tail -4
    2. [es_group]
    3. 10.0.0.104
    4. 10.0.0.105
    5. 10.0.0.106
    6. [root@Ansible roles]# cat site.yml
    7. - hosts: es_group
    8. roles:
    9. - role: es
    10. [root@Ansible roles]# ls es/files/
    11. elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz es7.service jdk.sh
    12. elasticsearch.yml jdk-8u291-linux-x64.tar.gz jvm.options
    13. [root@Ansible roles]# cat es/tasks/main.yml
    14. - name: mkdir /koten/softwares /koten/data /koten/logs
    15. file:
    16. path: "{{ item }}"
    17. state: directory
    18. with_items:
    19. - /koten/softwares
    20. - /koten/data
    21. - /koten/logs
    22. - name: tar xf elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz jdk-8u291-linux-x64.tar.gz
    23. unarchive:
    24. src: "{{ item }}"
    25. dest: /koten/softwares
    26. with_items:
    27. - elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz
    28. - jdk-8u291-linux-x64.tar.gz
    29. - name: Create koten Group
    30. group:
    31. name: koten
    32. - name: Create koten User
    33. user:
    34. name: koten
    35. - name: chown -R koten.koten /koten/softwares/elasticsearch-7.17.5/
    36. file:
    37. path: /koten/softwares/elasticsearch-7.17.5/
    38. owner: koten
    39. group: koten
    40. recurse: yes
    41. - name: copy content to /etc/security/limits.d/es.conf
    42. copy:
    43. content: |
    44. * soft nofile 65535
    45. * hard nofile 131070
    46. dest: /etc/security/limits.d/es.conf
    47. - name: copy test content to /etc/sysctl.d/es.conf
    48. copy:
    49. content: |
    50. vm.max_map_count=262144
    51. dest: /etc/sysctl.d/es.conf
    52. - name: sysctl -f /etc/sysctl.d/es.conf
    53. command: sysctl -f /etc/sysctl.d/es.conf
    54. - name: push es7.service to /usr/lib/systemd/system/
    55. copy:
    56. src: es7.service
    57. dest: /usr/lib/systemd/system/
    58. - name: push jvm.options to /koten/softwares/elasticsearch-7.17.5/config/
    59. copy:
    60. src: jvm.options
    61. dest: /koten/softwares/elasticsearch-7.17.5/config/
    62. - name: push elasticsearch.yml to /koten/softwares/elasticsearch-7.17.5/config/
    63. copy:
    64. src: elasticsearch.yml
    65. dest: /koten/softwares/elasticsearch-7.17.5/config/elasticsearch.yml
    66. - name: push jdk.sh to /etc/profile.d/
    67. copy:
    68. src: jdk.sh
    69. dest: /etc/profile.d/
    70. - name: source /etc/profile.d/jdk.sh
    71. command: bash -c 'source /etc/profile.d/jdk.sh'
    72. - name: mkdir /koten/data/es7 /koten/logs/es7
    73. file:
    74. path: "{{ item }}"
    75. state: directory
    76. owner: koten
    77. group: koten
    78. with_items:
    79. - /koten/data/es7
    80. - /koten/logs/es7
    81. - name: systemctl enable --now es7
    82. systemd:
    83. name: es7
    84. state: started
    85. enabled: yes

    4、执行数据推送和配置的playbook,部署es集群

    1. [root@Ansible roles]# ansible-playbook site.yml
    2. PLAY [es_group] ****************************************************************
    3. TASK [Gathering Facts] *********************************************************
    4. ok: [es105]
    5. ok: [es106]
    6. ok: [es104]
    7. TASK [mkdir /koten/softwares /koten/data /koten/logs] **************************
    8. changed: [es105] => (item=/koten/softwares)
    9. changed: [es104] => (item=/koten/softwares)
    10. changed: [es106] => (item=/koten/softwares)
    11. changed: [es106] => (item=/koten/data)
    12. changed: [es104] => (item=/koten/data)
    13. changed: [es105] => (item=/koten/data)
    14. changed: [es106] => (item=/koten/logs)
    15. changed: [es105] => (item=/koten/logs)
    16. changed: [es104] => (item=/koten/logs)
    17. TASK [es : tar xf elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz jdk-8u291-linux-x64.tar.gz] ***
    18. changed: [es105] => (item=elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz)
    19. changed: [es104] => (item=elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz)
    20. changed: [es106] => (item=elasticsearch-7.17.5-no-jdk-linux-x86_64.tar.gz)
    21. changed: [es105] => (item=jdk-8u291-linux-x64.tar.gz)
    22. changed: [es106] => (item=jdk-8u291-linux-x64.tar.gz)
    23. changed: [es104] => (item=jdk-8u291-linux-x64.tar.gz)
    24. TASK [es : Create koten Group] *************************************************
    25. changed: [es105]
    26. changed: [es106]
    27. changed: [es104]
    28. TASK [es : Create koten User] **************************************************
    29. changed: [es104]
    30. changed: [es105]
    31. changed: [es106]
    32. TASK [chown -R koten.koten /koten/softwares/elasticsearch-7.17.5/] *************
    33. changed: [es104]
    34. changed: [es105]
    35. changed: [es106]
    36. TASK [copy content to /etc/security/limits.d/es.conf] **************************
    37. changed: [es104]
    38. changed: [es106]
    39. changed: [es105]
    40. TASK [copy test content to /etc/sysctl.d/es.conf] ******************************
    41. changed: [es106]
    42. changed: [es104]
    43. changed: [es105]
    44. TASK [sysctl -f /etc/sysctl.d/es.conf] *****************************************
    45. changed: [es106]
    46. changed: [es104]
    47. changed: [es105]
    48. TASK [push es7.service to /usr/lib/systemd/system/] ****************************
    49. changed: [es104]
    50. changed: [es105]
    51. changed: [es106]
    52. TASK [push jvm.options to /koten/softwares/elasticsearch-7.17.5/config/] *******
    53. changed: [es104]
    54. changed: [es105]
    55. changed: [es106]
    56. TASK [push elasticsearch.yml to /koten/softwares/elasticsearch-7.17.5/config/] ***
    57. changed: [es104]
    58. changed: [es106]
    59. changed: [es105]
    60. TASK [es : push jdk.sh to /etc/profile.d/] *************************************
    61. changed: [es104]
    62. changed: [es105]
    63. changed: [es106]
    64. TASK [es : source /etc/profile.d/jdk.sh] ***************************************
    65. changed: [es104]
    66. changed: [es106]
    67. changed: [es105]
    68. TASK [mkdir /koten/data/es7 /koten/logs/es7] ***********************************
    69. changed: [es104] => (item=/koten/data/es7)
    70. changed: [es105] => (item=/koten/data/es7)
    71. changed: [es106] => (item=/koten/data/es7)
    72. changed: [es105] => (item=/koten/logs/es7)
    73. changed: [es104] => (item=/koten/logs/es7)
    74. changed: [es106] => (item=/koten/logs/es7)
    75. TASK [systemctl enable --now es7] **********************************************
    76. changed: [es106]
    77. changed: [es104]
    78. changed: [es105]
    79. PLAY RECAP *********************************************************************
    80. es104 : ok=16 changed=15 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    81. es105 : ok=16 changed=15 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    82. es106 : ok=16 changed=15 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    83. # 查看es的状态
    84. [root@ELK104 ~]# systemctl status es7.service
    85. ● es7.service - es7
    86. Loaded: loaded (/usr/lib/systemd/system/es7.service; enabled; vendor preset: disabled)
    87. Active: active (running) since Fri 2023-10-27 14:01:54 CST; 42s ago
    88. Main PID: 3578 (java)
    89. CGroup: /system.slice/es7.service
    90. ├─3578 /koten/softwares/jdk1.8.0_291/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=6...
    91. └─3711 /koten/softwares/elasticsearch-7.17.5/modules/x-pack-ml/platform/linux-x86_64/bin/c...
    92. Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,716][INFO ][o.e.p.PluginsService ...wn]
    93. Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,716][INFO ][o.e.p.PluginsService ...ql]
    94. Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,716][INFO ][o.e.p.PluginsService ...ck]
    95. Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,717][INFO ][o.e.p.PluginsService ...re]
    96. Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,717][INFO ][o.e.p.PluginsService ...de]
    97. Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,749][INFO ][o.e.p.PluginsService ...er]
    98. Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,750][INFO ][o.e.p.PluginsService ...ded
    99. Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,958][INFO ][o.e.e.NodeEnvironment...fs]
    100. Oct 27 14:02:19 ELK104 elasticsearch[3578]: [2023-10-27T14:02:19,959][INFO ][o.e.e.NodeEnvironment...ue]
    101. Oct 27 14:02:20 ELK104 elasticsearch[3578]: [2023-10-27T14:02:20,074][INFO ][o.e.n.Node ...st]
    102. Hint: Some lines were ellipsized, use -l to show in full.

     


    deploy_es_shell打包文件下载链接:https://pan.baidu.com/s/1l22I0aSB-50NXlh4lYZArw?pwd=umbm

    deploy_es_ansible打包文件下载链接:https://pan.baidu.com/s/1lIfYWMnhsg7yoyzgkBSEDA?pwd=8hpl

    我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

  • 相关阅读:
    五步走,轻松拥有你的个性化小程序
    Python图像处理丨三种实现图像形态学转化运算模式
    【DS基础】栈与队列
    FISCO BCOS(三十七)———FISCOBCOS应用开发,交易hash、区块高度的获取
    SpringMVC中如何编写一个Controller呢?
    ffmpeg音频重采样
    微信小程序OA会议系统个人中心授权登入
    MarkDown实现文章内跳转
    【Linux-网络编程】
    java笔试题含答案总结四
  • 原文地址:https://blog.csdn.net/qq_37510195/article/details/130855070