使用Jumpserver 作业中心Ansible批量安装 Zabbix-agent

使用Jumpserver 作业中心批量安装 Zabbix-agent,主要使用了 Jumpserver 内置的 Ansible 功能来实现
Ansible 是一个强大的开源自动化工具,广泛应用于配置管理、应用部署、任务自动化和 IT 编排等领域。其简洁、高效和无代理的特性使其成为 DevOps 实践中的热门选择。
Ansible 以其简单性、无代理架构、强大的自动化与编排能力、幂等性以及丰富的生态系统,成为实现 IT 自动化、提高运维效率、保障系统一致性和可靠性的理想选择。无论是小型团队还是大型企业,都能从中受益

Jumpserver 操作可以参考官方文档:
https://kb.fit2cloud.com/?p=519e53ae-4b29-4dad-9ad4-10d5f81244a7

1、主机实现免密登陆,这个是前提条件。这个就不过多介绍了
堡垒机纳管了主机,jumpserver又集成了Ansible功能,所有实现批量安装 还是很容易的

b803abb1-8dd1-4047-b38c-13970f3e3656
2、模板管理,创建playbook,如图两个文件
44d314ee-4acd-4a0e-bec4-84324bd36170
70ad665c-4bd5-486c-abbc-f04ff3744172

提供两个文件给大家,给出了两个剧本(Centos7、Rockyliux9),已亲测可以实现部署。剧本比较基础,对于复杂的运维 环境来说需要去完善。此脚本不涉及操作系统本身的参数变更和优化,安全风险较小。

main.yml文件(Centos7 注意修改成自己的环境 zabbix_server_ip zabbix_agent_url)

- name: 安装并配置Zabbix Agent(带启动检测和开机自启)
  hosts: all
  become: yes
  vars:
    zabbix_server_ip: "10.x.x.x"
    zabbix_agent_listen_port: 10050
    zabbix_agent_hostname: "{{ ansible_hostname }}"
    zabbix_agent_version: "7.0.10"
    zabbix_agent_url: "https://xxx.xxx.cn/downloads/zabbix/7.0/{{ zabbix_agent_version }}/zabbix_agent-{{ zabbix_agent_version }}-linux-3.0-amd64-static.tar.gz"
    install_dir: "/usr/local/zabbix"
    default_conf_path: "/usr/local/etc"
    default_conf_file: "{{ default_conf_path }}/zabbix_agentd.conf"
    log_dir: "/var/log/zabbix"
    pid_dir: "/var/run/zabbix"
    temp_tar_path: "/tmp/zabbix_agent.tar.gz"
    zabbix_user: "zabbix"
    zabbix_group: "zabbix"

  tasks:
    # 安装依赖包
    - name: 安装必要依赖(含policycoreutils-python)
      yum:
        name:
          - wget
          - tar
          - gzip
          - policycoreutils-python
        state: present

    # 创建用户和组
    - name: 创建zabbix用户组
      group:
        name: "{{ zabbix_group }}"
        state: present
        system: yes

    - name: 创建zabbix用户
      user:
        name: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"
        state: present
        system: yes
        shell: /sbin/nologin
        create_home: no
        home: "{{ install_dir }}"

    # 创建目录结构
    - name: 创建安装目录
      file:
        path: "{{ install_dir }}"
        state: directory
        mode: '0750'
        owner: root
        group: "{{ zabbix_group }}"

    - name: 创建默认配置目录
      file:
        path: "{{ default_conf_path }}"
        state: directory
        mode: '0755'
        owner: root
        group: root

    - name: 创建日志目录
      file:
        path: "{{ log_dir }}"
        state: directory
        mode: '0750'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    - name: 创建PID目录
      file:
        path: "{{ pid_dir }}"
        state: directory
        mode: '0750'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    - name: 确保PID目录重启后自动重建
      copy:
        content: "d {{ pid_dir }} 0750 {{ zabbix_user }} {{ zabbix_group }} -"
        dest: /etc/tmpfiles.d/zabbix.conf
        mode: '0644'

    - name: 创建扩展配置目录
      file:
        path: "{{ install_dir }}/conf/zabbix_agentd"
        state: directory
        mode: '0750'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    # 下载和解压
    - name: 下载Zabbix Agent静态包
      command: >
        wget --retry-connrefused --waitretry=5 --read-timeout=30 --timeout=20 -t 5
        -O {{ temp_tar_path }} {{ zabbix_agent_url }}
      args:
        creates: "{{ temp_tar_path }}"
      register: download_result
      retries: 3
      until: download_result is succeeded

    - name: 解压压缩包
      command: >
        tar -zxvf {{ temp_tar_path }} -C {{ install_dir }} --strip-components=1
      args:
        creates: "{{ install_dir }}/sbin/zabbix_agentd"

    # 设置文件权限
    - name: 设置二进制文件权限
      file:
        path: "{{ install_dir }}/sbin/zabbix_agentd"
        mode: '0750'
        owner: root
        group: "{{ zabbix_group }}"

    # 配置文件处理
    - name: 生成临时配置文件
      template:
        src: zabbix_agentd.conf.j2
        dest: "{{ install_dir }}/conf/zabbix_agentd.conf"
        mode: '0640'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    - name: 拷贝配置文件到默认路径
      copy:
        src: "{{ install_dir }}/conf/zabbix_agentd.conf"
        dest: "{{ default_conf_file }}"
        remote_src: yes
        mode: '0640'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    # 配置systemd服务
    - name: 创建systemd服务文件
      copy:
        content: |
          [Unit]
          Description=Zabbix Agent
          After=network.target

          [Service]
          Type=forking
          ExecStart={{ install_dir }}/sbin/zabbix_agentd -c {{ default_conf_file }}
          Restart=always
          User={{ zabbix_user }}
          Group={{ zabbix_group }}
          PrivateTmp=true
          ProtectSystem=full
          NoNewPrivileges=true

          [Install]
          WantedBy=multi-user.target
        dest: /etc/systemd/system/zabbix-agent.service
        mode: '0644'
        owner: root
        group: root
      notify: 重新加载systemd

    # SELinux配置
    - name: 配置SELinux允许Zabbix端口
      seport:
        ports: "{{ zabbix_agent_listen_port }}"
        proto: tcp
        setype: zabbix_agent_port_t
        state: present
      when: ansible_selinux.status == 'enabled'

    # 重启服务并检测
    - name: 重启Zabbix Agent服务
      service:
        name: zabbix-agent
        state: restarted

    - name: 等待服务启动(最多10秒)
      wait_for:
        path: "{{ pid_dir }}/zabbix_agentd.pid"
        state: present
        timeout: 10
      register: pid_check

    - name: 检测服务是否启动成功
      fail:
        msg: "Zabbix Agent启动失败,未找到PID文件"
      when: pid_check is failed

    - name: 验证服务状态
      command: systemctl is-active zabbix-agent
      register: service_status
      failed_when: service_status.stdout != 'active'

    - name: 检查防火墙状态
      service:
        name: firewalld
        state: started
      register: firewall_status
      check_mode: yes
      ignore_errors: yes

    - name: 防火墙运行时放行10050/tcp端口
      firewalld:
        port: "{{ zabbix_agent_listen_port }}/tcp"
        state: enabled
        immediate: yes
        permanent: yes
      when: firewall_status is succeeded

    # 配置开机自启
    - name: 确保Zabbix Agent开机自启
      service:
        name: zabbix-agent
        enabled: yes

    - name: 验证开机自启配置
      command: systemctl is-enabled zabbix-agent
      register: enable_status
      failed_when: enable_status.stdout != 'enabled'

    - name: 安装成功提示
      debug:
        msg: "Zabbix Agent已成功启动并配置开机自启!"

  handlers:
    - name: 重新加载systemd
      command: systemctl daemon-reload

main.yml文件(Rocky linux9 注意修改成自己的环境 zabbix_server_ip zabbix_agent_url)

---
- name: 安装并配置 Zabbix Agent(支持 Rocky Linux 9 + 阿里云源)
  hosts: all
  become: yes
  gather_facts: yes

  vars:
    zabbix_server_ip: "x.x.x.x"
    zabbix_agent_listen_port: 10050
    zabbix_agent_hostname: "{{ ansible_hostname }}"
    zabbix_agent_version: "7.0.10"
    zabbix_agent_url: "https://xxx.xxx.cn/downloads/zabbix/7.0/{{ zabbix_agent_version }}/zabbix_agent-{{ zabbix_agent_version }}-linux-3.0-amd64-static.tar.gz"
    install_dir: "/usr/local/zabbix"
    default_conf_path: "/usr/local/etc"
    default_conf_file: "{{ default_conf_path }}/zabbix_agentd.conf"
    log_dir: "/var/log/zabbix"
    pid_dir: "/var/run/zabbix"
    temp_tar_path: "/tmp/zabbix_agent.tar.gz"
    zabbix_user: "zabbix"
    zabbix_group: "zabbix"

    # 仅使用稳定镜像源
    aliyun_rocky9_mirrors:
      - "https://mirrors.aliyun.com/rockylinux/9/BaseOS/x86_64/os/"

  tasks:
    - name: 检查操作系统兼容性
      ansible.builtin.assert:
        that:
          - ansible_distribution == 'Rocky'
          - ansible_distribution_major_version is version('9', '==')
        success_msg: "✅ 操作系统兼容(Rocky Linux {{ ansible_distribution_major_version }})"
        fail_msg: "❌ 仅支持 Rocky Linux 9"

    - name: 检查阿里云 Rocky Linux 9 镜像仓库连通性
      uri:
        url: "{{ item }}repodata/repomd.xml"
        method: HEAD
        timeout: 15
        status_code: [200, 302]
      register: mirror_check
      with_items: "{{ aliyun_rocky9_mirrors }}"
      retries: 3
      delay: 3
      until: mirror_check is succeeded
      ignore_errors: yes

    - name: 验证是否找到可用的阿里云镜像
      fail:
        msg: "❌ 无法连接到阿里云 Rocky Linux 9 镜像源,请检查网络或 DNS"
      when: mirror_check.results | selectattr('status', 'defined') | selectattr('status', 'in', [200, 302]) | list | length == 0

    - name: 备份原有 Rocky Linux 仓库配置
      shell: |
        mkdir -p /etc/yum.repos.d/backup
        mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null || true
      args:
        creates: /etc/yum.repos.d/backup/.done

    - name: 配置阿里云 Rocky Linux 9 镜像源
      copy:
        content: |
          [BaseOS]
          name=Rocky Linux 9 - BaseOS - Aliyun
          baseurl=https://mirrors.aliyun.com/rockylinux/9/BaseOS/x86_64/os/
          gpgcheck=1
          enabled=1
          gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
          timeout=15
          retries=3

          [AppStream]
          name=Rocky Linux 9 - AppStream - Aliyun
          baseurl=https://mirrors.aliyun.com/rockylinux/9/AppStream/x86_64/os/
          gpgcheck=1
          enabled=1
          gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
          timeout=15
          retries=3

          [Extras]
          name=Rocky Linux 9 - Extras - Aliyun
          baseurl=https://mirrors.aliyun.com/rockylinux/9/extras/x86_64/os/
          gpgcheck=1
          enabled=1
          gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
          timeout=15
          retries=3
        dest: /etc/yum.repos.d/rocky-aliyun.repo
        mode: '0644'

    - name: 清理 DNF 缓存
      command: dnf clean all
      changed_when: false

    - name: 为 Rocky Linux 生成元数据缓存
      command: dnf makecache
      args:
        creates: /var/cache/dnf/metadata_lock.pid

    - name: 安装必要依赖(修复 timeout 错误)
      dnf:
        name:
          - wget
          - tar
          - gzip
          - policycoreutils-python-utils
          - firewalld
          - selinux-policy-targeted
        state: present
        update_cache: yes
        lock_timeout: 60
      retries: 3
      delay: 5
      until: true

    - name: 创建 zabbix 用户组
      group:
        name: "{{ zabbix_group }}"
        state: present
        system: yes

    - name: 创建 zabbix 用户
      user:
        name: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"
        state: present
        system: yes
        shell: /sbin/nologin
        create_home: no
        home: "{{ install_dir }}"

    - name: 创建安装目录
      file:
        path: "{{ install_dir }}"
        state: directory
        mode: '0750'
        owner: root
        group: "{{ zabbix_group }}"

    - name: 创建默认配置目录
      file:
        path: "{{ default_conf_path }}"
        state: directory
        mode: '0755'
        owner: root
        group: root

    - name: 创建日志目录
      file:
        path: "{{ log_dir }}"
        state: directory
        mode: '0750'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    - name: 创建 PID 目录
      file:
        path: "{{ pid_dir }}"
        state: directory
        mode: '0750'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    - name: 确保 PID 目录重启后自动重建
      copy:
        content: "d {{ pid_dir }} 0750 {{ zabbix_user }} {{ zabbix_group }} -"
        dest: /etc/tmpfiles.d/zabbix.conf
        mode: '0644'

    - name: 创建扩展配置目录
      file:
        path: "{{ install_dir }}/conf/zabbix_agentd"
        state: directory
        mode: '0750'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    - name: 下载 Zabbix Agent 静态包(原始地址)
      get_url:
        url: "{{ zabbix_agent_url }}"
        dest: "{{ temp_tar_path }}"
        mode: '0640'
        timeout: 30
        validate_certs: no
      register: download_result
      retries: 5
      delay: 5
      until: download_result is succeeded

    - name: 解压 Zabbix Agent 包
      unarchive:
        src: "{{ temp_tar_path }}"
        dest: "{{ install_dir }}"
        remote_src: yes
        extra_opts: [--strip-components=1]
        creates: "{{ install_dir }}/sbin/zabbix_agentd"

    - name: 设置二进制文件权限
      file:
        path: "{{ install_dir }}/sbin/zabbix_agentd"
        mode: '0750'
        owner: root
        group: "{{ zabbix_group }}"

    - name: 生成配置文件
      template:
        src: zabbix_agentd.conf.j2
        dest: "{{ install_dir }}/conf/zabbix_agentd.conf"
        mode: '0640'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    - name: 拷贝配置文件到默认路径
      copy:
        src: "{{ install_dir }}/conf/zabbix_agentd.conf"
        dest: "{{ default_conf_file }}"
        remote_src: yes
        mode: '0640'
        owner: "{{ zabbix_user }}"
        group: "{{ zabbix_group }}"

    - name: 创建 systemd 服务文件
      copy:
        content: |
          [Unit]
          Description=Zabbix Agent
          After=network.target

          [Service]
          Type=forking
          ExecStart={{ install_dir }}/sbin/zabbix_agentd -c {{ default_conf_file }}
          Restart=always
          User={{ zabbix_user }}
          Group={{ zabbix_group }}
          PrivateTmp=true
          ProtectSystem=full
          NoNewPrivileges=true

          [Install]
          WantedBy=multi-user.target
        dest: /etc/systemd/system/zabbix-agent.service
        mode: '0644'
      notify: 重新加载 systemd

    - name: 配置 SELinux 放行端口
      seport:
        ports: "{{ zabbix_agent_listen_port }}"
        proto: tcp
        setype: zabbix_agent_port_t
        state: present
      when: ansible_selinux.status == 'enabled'

    - name: 检测 firewalld 状态
      command: systemctl is-active firewalld
      register: firewalld_status
      ignore_errors: yes

    - name: 防火墙放行 Zabbix Agent 端口(仅当 firewalld 运行中)
      firewalld:
        port: "{{ zabbix_agent_listen_port }}/tcp"
        state: enabled
        immediate: yes
        permanent: yes
      when: firewalld_status.stdout == 'active'

    - name: 启动 Zabbix Agent 服务
      service:
        name: zabbix-agent
        state: restarted
        enabled: yes

    - name: 等待服务启动
      wait_for:
        path: "{{ pid_dir }}/zabbix_agentd.pid"
        state: present
        timeout: 10
      register: pid_check
      ignore_errors: yes

    - name: 检查服务是否运行
      fail:
        msg: "❌ Zabbix Agent 启动失败,未生成 PID 文件"
      when: pid_check is failed

    - name: 验证服务状态
      command: systemctl is-active zabbix-agent
      register: service_status
      failed_when: service_status.stdout != 'active'

    - name: 清理临时文件
      file:
        path: "{{ temp_tar_path }}"
        state: absent

    - name: 安装成功提示
      debug:
        msg: "🎉 Zabbix Agent 已成功安装并启动!主机: {{ zabbix_agent_hostname }},IP: {{ zabbix_server_ip }}"

  handlers:
    - name: 重新加载 systemd
      systemd:
        daemon_reload: yes

zabbix_agentd.conf.j2 文件 (注意修改成自己的环境 Zabbix Server ServerActive )

PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=x.x.x.x
ServerActive=x.x.x.x
Hostname={{ zabbix_agent_hostname }}
ListenPort=10050
# Include=/usr/local/zabbix/conf/zabbix_agentd/*.conf
UnsafeUserParameters=0

运行结果如下:
6b1343f5-5bf5-4f8c-9a7e-47dc81309365

posted @ 2025-08-05 13:26  凡人的四季  阅读(41)  评论(0)    收藏  举报