#注声明原手动部署来源于老男孩,为了完成用ansible一键化二进制部署,也写了如下playbook剧本,剧本可反复执行,如下需要注意几点:

(懒的复制代码的小伙伴可以直接使用我上传的文件,然后scp到自己的主机,然后改改。。)

1、本剧本适合用于测试阶段部署,并不适用于生产环境,因为在执行剧本时,我多次清空/oldboyedu/data/es7/* /oldboyedu/logs/es7/* /tmp/*目录下的文件,为了二次部署方便。
2、已经在es目录中有数据的小伙伴,尽量不要使用我的初始化脚本,会把数据清赶紧,如果必要请备份。
3、剧本中有很多命令是我用shell或command模块来执行的,有些命令没有使用变量,后期改路径的小伙伴请注意使用,(后续会更新剧本)。
4、###禁止生产环境使用,禁止,禁止,禁止(产生数据丢失后果概不负责)
5、剧本执行后,主机节点会重启,重新连接后生效,9200端口大概3分钟之内启动(看服务的快慢),为了仿制有锁,在剧本重启节点后,看下“使用说明”,删掉rm -rf /oldboyedu/data/es7/* /oldboyedu/logs/es7/* /tmp/* 并重启systemctl restart es7

使用前安装说明:
本节点是linux7的环境,确保节点(101主节点)配置/etc/hosts
#这是我的节点配置的(可修改)
192.168.31.101    elk101.oldboyedu.com
192.168.31.102    elk102.oldboyedu.com
192.168.31.103    elk103.oldboyedu.com

确定关闭防火墙以及selinux
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && sudo setenforce 0

systemctl stop firewalld
systemctl disable firewalld

每个主机节点要求最低配置:
2C 核cup    4G 内存       50G硬盘




创建目录:
mkdir /elk-ansible-hosts  && cd /elk-ansible-hosts



##配置ansible inventory
[root@elk101 elk-ansible-hosts]# cat inventory 

[es_nodes]
192.168.31.101 ansible_user=root ansible_password=123456
192.168.31.102 ansible_user=root ansible_password=123456
192.168.31.103 ansible_user=root ansible_password=123456

[es_nodes:vars]
es_ip=192.168.31.101
es_user=oldboyedu
es_uid=2023
es_version=7.17.5
es_cluster_name=oldboyedu-linux85-binary
es_data_dir=/oldboyedu/data/es7
es_logs_dir=/oldboyedu/logs/es7
es_softwares_dir=/oldboyedu/softwares/es7
es_config_dir=/oldboyedu/softwares/es7/elasticsearch-{{ es_version }}/config
es_nodes_list=["elk101.oldboyedu.com","elk102.oldboyedu.com","elk103.oldboyedu.com"]
###password根据自己主机的密码进行定义,我这里是123456,用户是root(建议使用root部署,权限够高。)

vim 初始化脚本init.yml

- name: 删除/oldboyedu目录下的所有文件和目录(警告:只适合重新安装es,目录下里面的数据全部清空)
  hosts: all  # 替换为你的目标主机组
  tasks:
    - name: 删除/oldboyedu目录下的所有文件和目录(警告:只适合重新安装es,目录下里面的数据全部清空)
      ansible.builtin.command: rm -rf /oldboyedu/*
      args:
        warn: false  # 禁止Ansible显示关于使用shell/command的警告
- name: 在所有节点创建用户 oldboyedu
  hosts: all  # 在所有节点执行
  become: yes  # 使用sudo权限
  tasks:
    - name: 创建用户 oldboyedu
      user:
        name: oldboyedu  # 用户名
        state: present   # 确保用户存在
        create_home: yes  # 创建用户主目录`


- name: 创建ansible阶梯目录结构
  hosts: localhost  # 在本地执行
  tasks:
    - name: 创建目录 /elk-ansible-hosts/roles/{es-install,es-config,es-optimize,es-service}/tasks
      file:
        path: "{{ item }}"
        state: directory  # 确保是目录
        owner: "oldboyedu"  # 设置所有者(替换为实际用户)
        group: "oldboyedu"  # 设置所属组(替换为实际组)
        mode: "0755"  # 设置权限
      with_items:
        - "/elk-ansible-hosts/roles/es-install/tasks"
        - "/elk-ansible-hosts/roles/es-config/tasks"
        - "/elk-ansible-hosts/roles/es-config/templates"
        - "/elk-ansible-hosts/roles/es-optimize/tasks"
        - "/elk-ansible-hosts/roles/es-service/tasks"
        - "/elk-ansible-hosts/roles/es-service/templates"

- name: 创建es安装目录结构
  hosts: all  # 所有节点执行
  tasks:
    - name: 创建目录 install -d /oldboyedu/{data,logs,softwares}/es7 -o oldboyedu -g oldboyedu 
      file:
        path: "{{ item }}"
        state: directory  # 确保是目录
        owner: "oldboyedu"  # 设置所有者(替换为实际用户)
        group: "oldboyedu"  # 设置所属组(替换为实际组)
        mode: "0777"  # 设置权限
      with_items:
        - "/oldboyedu/data/es7"
        - "/oldboyedu/logs/es7"
        - "/oldboyedu/softwares/es7"
        - "/oldboyedu"

- name: 拷贝hosts文件
  hosts: all  # 指定主机
  become: yes
  tasks:
    - name: 拷贝hosts文件
      copy:
        src: "/etc/hosts"  # 源路径
        dest: "/etc/"  # 目标路径
      when: inventory_hostname != "node1"

- name: 拷贝elasticsearch-7.17.5-linux-x86_64.tar.gz包到所有节点上
  hosts: all
  become: yes
  tasks:
    - name: Copy compressed package to nodes
      copy:
        src: /opt/elasticsearch-7.17.5-linux-x86_64.tar.gz  # 控制机上的源文件路径
        dest: /opt/  # 目标节点上的目标路径
        mode: 0755  # 设置文件权限

- name: 所有节点yum安装rsync
  hosts: all
  become: yes  # 使用特权权限(sudo)
  tasks:
    - name: Install rsync using yum
      yum:
        name: rsync
        state: present
      register: install_result  # 注册安装结果

    - name: Check if rsync installation succeeded
      debug:
        msg: "rsync installed successfully"
      when: install_result is succeeded  # 如果安装成功,输出成功信息

    - name: Handle rsync installation failure
      debug:
        msg: "Failed to install rsync. Please check the yum repository or network connection."
      when: install_result is failed  # 如果安装失败,输出错误信息


- name: 修改参数 vm.max_map_count
  hosts: all
  become: yes
  tasks:
    - name: Create /etc/sysctl.d/es.conf
      copy:
        dest: /etc/sysctl.d/es.conf
        content: |
          vm.max_map_count=524288
        owner: root
        group: root
        mode: 0755

    - name: 重新加载/etc/sysctl.d/es.conf
      sysctl:
        name: vm.max_map_count
        value: 524288
        state: present
        reload: yes  # 立即生效


 

部署playbook.yml

- name: 调用模块
  hosts: es_nodes
  become: yes
  roles:
    - es-install
    - es-config
    - es-optimize
    - es-service
    #- common
  tasks:
    - name: 所有节点重启
      reboot:
        msg: "Reboot initiated by Ansible for Elasticsearch deployment"
        connect_timeout: 5
        reboot_timeout: 600
        pre_reboot_delay: 0
        post_reboot_delay: 30
 

  roles:   - es-install模块剧本说明:
路径:/elk-ansible-hosts/roles/es-install/tasks
文件: /elk-ansible-hosts/roles/es-install/tasks/main.yml

- name: 解压Elasticsearch安装包
  unarchive:
    src: "/opt/elasticsearch-{{ es_version }}-linux-x86_64.tar.gz"  # 源路径:本地/opt目录下的包
    dest: "{{ es_softwares_dir }}"  # 目标路径:解压到指定目录
    remote_src: no  # 从本地路径解压
- name: 设置解压后目录的所有者和权限
  file:
    path: "/oldboyedu/softwares/es7/elasticsearch-7.17.5"
    owner: oldboyedu
    group: oldboyedu
    mode: '0777'
    recurse: yes  # 递归更改目录和文件的权限
 

  roles:    - es-config模块剧本说明:
路径:/elk-ansible-hosts/roles/es-config/tasks
文件: /elk-ansible-hosts/roles/es-config/tasks/main.yml

- name: Configure elasticsearch.yml
  template:
    src: elasticsearch.yml.j2
    dest: "{{ es_config_dir }}/elasticsearch.yml"
    owner: "{{ es_user }}"
    group: "{{ es_user }}"

- name: Sync configuration to all nodes
  copy: 
    src: "{{ es_config_dir }}/elasticsearch.yml"
    dest: "{{ es_config_dir }}/elasticsearch.yml"
    #when: inventory_hostname != "192.168.31.101"  # 排除自身
 

  roles:    - es-config模块剧本说明:
路径: /elk-ansible-hosts/roles/es-config/templates
文件: /elk-ansible-hosts/roles/es-config/templates/elasticsearch.yml.j2

cluster.name: {{ es_cluster_name }}
path.data: {{ es_data_dir }}
path.logs: {{ es_logs_dir }}
network.host: 0.0.0.0
discovery.seed_hosts: {{ es_nodes_list }}
cluster.initial_master_nodes: {{ es_nodes_list }}
node.max_local_storage_nodes: 2
 

roles:    - es-optimize模块剧本说明
路径:/elk-ansible-hosts/roles/es-optimize/tasks
文件: /elk-ansible-hosts/roles/es-optimize/tasks/main.yml

- name: Set file descriptor limits  # 任务名称:设置文件描述符限制
  lineinfile:
    path: /etc/security/limits.d/es7.conf  # 目标文件路径
    line: "{{ item }}"  # 要写入的行内容
    create: yes  # 如果文件不存在,则创建文件
  loop:  # 循环写入多行内容
    - "* soft nofile 65535"  # 设置软限制(soft limit)为 65535
    - "* hard nofile 131070"  # 设置硬限制(hard limit)为 131070
    - "* hard nproc 8192"  # 设置进程数硬限制为 8192

- name: Set kernel parameter vm.max_map_count  # 任务名称:设置内核参数 vm.max_map_count
  sysctl:
    name: vm.max_map_count  # 内核参数名称
    value: 524288  # 设置参数值为 524288
    state: present  # 确保参数存在
    reload: yes  # 立即生效(相当于执行 sysctl -p)
 

roles:    -es-service模块剧本说明
路径:/elk-ansible-hosts/roles/es-service/tasks
文件: /elk-ansible-hosts/roles/es-service/tasks/main.yml

- name: Create systemd service file # 调用 es7.service.j2 模板文件,生成 systemd 服务配置文件
  template:
    src: es7.service.j2  # 模板文件路径
    dest: /usr/lib/systemd/system/es7.service  # 生成的 systemd 服务文件路径
    owner: root  # 文件所属用户
    group: root  # 文件所属用户组
    mode: 0777   # 文件权限(777)

- name: Reload systemd daemon # 重新加载 systemd 配置,使新服务文件生效
  systemd:
    daemon_reload: yes  # 执行 systemctl daemon-reload

- name: Enable and start ES service # 启用并启动 Elasticsearch 服务
  systemd:
    name: es7  # 服务名称
    state: started  # 确保服务处于运行状态
    enabled: yes  # 设置服务开机自启动
 

roles:   -es-service
路径:/elk-ansible-hosts/roles/es-service/templates
文件: /elk-ansible-hosts/roles/es-service/templates/es7.service.j2

[Unit]
Description=oldboyedu linux85 es7
After=network.target

[Service]
Type=simple
ExecStart=/oldboyedu/softwares/es7/elasticsearch-7.17.5/bin/elasticsearch
User=oldboyedu
LimitNOFILE=131070

[Install]
WantedBy=multi-user.target

执行命令ansible-playbook -i inventory init.yml playbook.yml
#节点重启后重新连接
执行命令:
rm -rf /oldboyedu/data/es7/* /oldboyedu/logs/es7/* /tmp/*
systemctl restart es7
##查看状态
curl 192.168.31.101:9200/_cat/nodes


状态正常,部署完毕

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐