记录一下学习日常⑨(ansible、Open-V、zabbix)

一、ansible常用的一些模块和基本的示例

(一)ansible工作流程

1 ansible 在执行命令之前

  • 先检测 目标主机,是否在 主机清单中存在

  • 远程执行前,会进行 ssh的认证

  • 用户名+密码

  • 免密码认证
    2 ansible 开始执行命令

-1 直接调用模块,到目标主机执行命令

-2 执行playbook

  • playbook 转换成ansible的模块

  • 调用模块到目标主机执行命令
    3 ansible 执行后效果

  • 远程主机执行模块命令

  • 将命令执行过程,返回到 ansible 操作界面

  • 收尾

  • 临时产生的文件【本地主机+远程主机】删除

(二)ansible部署

环境架构:一主三从

|----|-----------|----------|--------|----------|
| 序号 | 主机ip | 主机名 | 操作系统 | 备注 |
| 1 | 10.0.0.10 | ubuntu10 | ubuntu | 控制端、被控端1 |
| 2 | 10.0.0.30 | rocky30 | rocky | 被控端2 |
| 3 | 10.0.0.11 | ubuntu11 | ubuntu | 被控端3 |

每台主机上做一个域名解析

bash 复制代码
vim /etc/hosts
10.0.0.10 ubuntu10.ansible.com ubuntu10
10.0.0.30 rocky30.ansible.com rocky30
10.0.0.11 ubuntu11.ansible.com ubuntu11

ubuntu上面可以优化一下下载源,用阿里的仓库

bash 复制代码
rm -rf /etc/apt/sources.list.d/*
cat > /etc/apt/sources.list <<-eof
deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse
eof
apt update

rocky上安装一个epel源

bash 复制代码
yum install epel-release.noarch

1.ubuntu安装ansible-⼆进制

bash 复制代码
apt install -y software-properties-common     #更新软件源
add-apt-repository --yes --update ppa:ansible/ansible        #安装ansible的专⽤软件源
apt install -y ansible                        #安装ansible软件

2. Rocky安装ansible-⼆进制

bash 复制代码
yum install epel-release
yum install ansible

(三)配置文件

bash 复制代码
root@ubuntu10:~# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg    #配置文件
├── hosts          #主机清单
└── roles          #大型项目的存放角色的目录

Ansible 的配置⽂件可以放在多个不同地⽅,表⽰作⽤范围的不同,优先级从⾼到低顺序如下

bash 复制代码
ANSIBLE_CONFIG                  # 环境变量
./ansible.cfg                   # 当前目录下的ansible.cfg
~/.ansible.cfg                  # 当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg        # 系统默认配置文件

ansible远程执行

黄色 - 更改变动

紫色 - 告警警告提示

绿色 - 正常执行

红色 - 命令执行异常

(四)基本命令模块实践

1.command模块

对于默认模块来说,我们不需要-m来指定模块,可以对目标主机使用"-a"传入一个命令参数,来执行查看本机上的信息,命令格式如下:

ansible <目标主机> -a 模块参数

bash 复制代码
root@ubuntu10:~  ansible localhost -a "ifconfig ens33"
localhost | CHANGED | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.10  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::bc99:a81f:3743:b509  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d9:c1:90  txqueuelen 1000  (以太网)
        RX packets 734220  bytes 1102127164 (1.1 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 153385  bytes 9421791 (9.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2.ping模块

ansible 可以通过 ping模块来探测目标主机的存活性,格式如下:

ansible localhost -m ping

bash 复制代码
root@ubuntu10:~# ansible localhost -m ping
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

3.ansible-doc命令

ansible-doc命令是专⻔⽤来查看ansible的模块帮助信息的,我们可以通过-h参数来查看他的帮助信息

常见参数

-a 显示所有帮助信息,该参数已经被 --metadata-dump 参数替代

-l 显示所有模块

-s 显示

bash 复制代码
ansible-doc -l                #-l 选项,查看所有的模块

查看command模块帮助
ansible-doc command           #查看完整帮助
ansible-doc command -s        #查看简单帮助

简单的帮助信息

4.ansible-config

ansible-config命令用于专门管理ansible的配置信息

ansible-config -h

5.跨主机免密码认证

bash 复制代码
root@ubuntu10:~  ssh-keygen -t rsa
root@ubuntu10:~  ssh-copy-id root@10.0.0.10

(三)目标主机匹配

对于目标的匹配规则来说,他们的获取方式和表现样式主要有这么几种:

匹配所有:all

正则匹配:*(通配符)

逻辑或: :(并集),一般用于主机组

逻辑与: :&(交集),一般用于主机组

逻辑非: :!(补集),一般用于主机组

配置一个主机清单

bash 复制代码
root@ubuntu10:~  vim /etc/ansible/hosts
10.0.0.13
[web]
10.0.0.12
10.0.0.13
[mysql]
10.0.0.13
10.0.0.16
[storage]
10.0.0.12
10.0.0.16
bash 复制代码
root@ubuntu10:~# ansible all -m ping
10.0.0.10 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.12"
    },
    "changed": false,
    "ping": "pong"
}

10.0.0.11 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.12"
    },
    "changed": false,
    "ping": "pong"
}

10.0.0.30 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.9"
    },
    "changed": false,
    "ping": "pong"
}

(四)日常命令操作模块

1.command模块

argv: # 以列表或者字符串格式输入命令
chdir: # 执行命令前,先切换工作路径.

creates: # 依赖存在对象的命令,若被创建的对象已存在,则不执行该命令

free_form: # 以自由格式输入参数,这是一个强制的选项

removes: # 依赖移除对象的命令,若被移除的对象存在,则执行该命令

stdin: # 设定标准输入作为参数.

warn: # 警告信息,需要ansible的配置文件的 command_warnings的属性值是yes.

注意:

由于ansible的默认模块就是command,所以远程执行命令的时候,一般会忽略-m选项,效果如下:

ansible <目标主机> -a '可执行命令'

可执行命令,就是我们平常在命令行输入的一些执行成功的命令,但是不允许是别名

command不支持"可执行命令"中的自定义变量和特殊符号(< > | ;&等)

bash 复制代码
root@ubuntu10:~  ansible 10.0.0.30 -a "chdir=/tmp mkdir cmd_test"
10.0.0.30 | CHANGED | rc=0 >>


[root@rocky30 ~]  ls /tmp/
cmd_test
dbus-Msihpo5AN6
systemd-private-afbc576f942b47859f4d12bdca53dd14-chronyd.service-v03uFF
systemd-private-afbc576f942b47859f4d12bdca53dd14-colord.service-QMri71
systemd-private-afbc576f942b47859f4d12bdca53dd14-dbus-broker.service-gEW8eD
systemd-private-afbc576f942b47859f4d12bdca53dd14-irqbalance.service-gQLwx5
systemd-private-afbc576f942b47859f4d12bdca53dd14-kdump.service-3tZRex
systemd-private-afbc576f942b47859f4d12bdca53dd14-ModemManager.service-ewvueS
systemd-private-afbc576f942b47859f4d12bdca53dd14-rtkit-daemon.service-15a99m
systemd-private-afbc576f942b47859f4d12bdca53dd14-switcheroo-control.service-ZdUZwC
systemd-private-afbc576f942b47859f4d12bdca53dd14-systemd-logind.service-6hLrQt
systemd-private-afbc576f942b47859f4d12bdca53dd14-upower.service-2LkzOP

2.shell模块

Shell模块在ansible使用的时候,标准的写法是:

ansible <目标主机> -m shell -a '可执行命令'

注意:

可执行命令,就是我们平常在命令行输入的一些执行成功的命令

shell支持"可执行命令"中的所有效果

shell在远程执行脚本的时候,必须远程主机存在,否则的话会报错

将shell模块替代command,设为默认模块

bash 复制代码
vim /etc/ansible/ansible.cfg 
[defaults]
module_name=shell

(五)系统管理模块

1. hostname模块

hostname模块在ansible使用的时候,标准的写法是:

ansible <目标主机> -m hostname -a 'name=主机名'

注意:

主机名的设置一定要规范

这种方式更改的主机名,是立刻生效而且是永久生效的

bash 复制代码
ansible 10.0.0.30 -m hostname -a "name=ansible-node2"

2.user模块

常见属性

comment: # 用户的描述信息.

group: # 设定用户的主组信息

home: # 设置用户家目录.

password: # 设置登录密码

shell: # 设定用户的专用shell类型

state: # 设定用户的存活状态

system: # 设定用户是否为系统用户

uid: # 设定用户uid

remove # 设定删除用户及家目录等数据,默认remove=no,推荐用yes

user模块在ansible使用的时候,标准的写法是:

ansible <目标主机> -m user -a '属性1=值1 属性2=值2 ... 属性n=值n'

注意:

用户名的设置一定要提前做好规划

在工作中,uid的值一定要提前做好规划,而且必须唯一。

bash 复制代码
创建用户
ansible 10.0.0.11 -m user -a "name=webapp1 home=/tmp/webapp1 generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa"

删除用户
ansible 10.0.0.11 -m user -a "name=webapp state=absent remove=yes"

3.group模块

group模块在ansible使用的时候,标准的写法是:

ansible <目标主机> -m group -a '属性1=值1 属性2=值2 ... 属性n=值n'

注意:

主机名的设置一定要规范,gid一定要唯一。

bash 复制代码
创建⼀个⽤⼾组
ansible 10.0.0.11 -m group -a "name=webap system=yes gid=10088"

删除
ansible 10.0.0.11 -m group -a "name=webap state=absent"

4. setup模块

常用参数

fact_path: # 设定facts的文件路径
filter: # 指定过滤格式,可以正则形式.

setup模块在ansible使用的时候,标准的写法是:

ansible <目标主机> -m setup -a '属性1=值1 属性2=值2 ... 属性n=值n'

注意:

不加 -a的话,表示获取目标主机的所有属性信息

过滤信息的规则一定要合理的设计。

这个功能很重要,尤其是后期自动化管理的时候

bash 复制代码
获取指定的主机属性:内存总量
ansible 10.0.0.11 -m setup -a "filter=ansible_memtotal_mb"

(六)文件管理模块

1.copy模块

常见参数

backup: # 创建一个包含时间戳信息的备份文件

dest: # 设置目标的路径(强制选项),格式与src一致

group: # 设定文件属组信息.

mode: # 设定文件属性信息.

owner: # 设定文件属主信息.

src: # 源文件的路径,平常使用的话,推荐使用相对路径,敏感文件推荐 用绝对路径

copy模块在ansible使用的时候,标准的写法是:

ansible <目标主机> -m copy -a '属性1=值1 属性2=值2 ... 属性n=值n'

注意:

src源文件路径和dest目标文件的路径,最好格式一

bash 复制代码
ansible 10.0.0.30 -m copy -a "src=/tmp/script.sh dest=/tmp/tpircs.sh" 
#将10.0.0.30主机中的/tmp/script.sh拷贝到/tmp/tpircs.sh

拷⻉⽂件的时候,更改属性(属组|主+权限)
ansible 10.0.0.16 -m copy -a "src=/tmp/script.sh dest=/tmp/tpircs.sh owner=daemon group=sys mode=666"

利⽤内容,直接⽣成⽬标⽂件
ansible 10.0.0.16 -m copy -a "content='test content\n' dest=/tmp/content.sh"

2.fetch模块

该模块的作用于copy的作用正好相反,它是从远程主机拉取文件到本地目录

常见参数

dest: # 设定目标文件的地址(强制选项)

flat: # 允许拼接方式创建文件名

src: # 设定源文件的地址(强制选项)

注意:

常用的属性,也就上面标红的三个。

源文件和目标文件的格式最好一致。

src 当前的版本,只支持抓取远程的单个文件

dest 支持只能是本机的目录,抓取后的格式: "/dest/" + "目标主机/path/to/src"

bash 复制代码
单文件拉取
ansible 10.0.0.30 -m fetch -a "src=/tmp/tpircs.sh dest=/tmp"

多⽂件拉取(fetch默认情况下只能拉取单文件,而且它不支持通配符)
最好通过压缩包的方式,来实现多文件的传输
ansible 10.0.0.30 -m shell -a "tar zcf /tmp/log.tar.gz /var/log/*.log"

3. file模块

常见属性

mode: # 设定文件权限属性.

owner: # 设定文件属主.

path: # 指定文件的路径(强制选项).之前版本可以用name和dest来代替

src: # 指定文件的源路径.

state: # 设定文件的状态,directory、file、absent、touch、link

file模块在ansible使用的时候,标准的写法是:

ansible <目标主机> -m file -a '属性1=值1 属性2=值2 ... 属性n=值n'

注意:

在创建相关文件的话,如果涉及到父目录,必须确保父目录存在,否则会失败

bash 复制代码
创建⽂件
ansible 10.0.0.11 -m file -a "path=/file/ state=directory"        #目录
ansible 10.0.0.11 -m file -a "path=/file/file.txt state=touch"    #文件
ansible 10.0.0.11 -m file -a "src=/etc/fstab dest=/file/file.link state=link"    #链接

删除文件
ansible 10.0.0.16 -m file -a "path=/file/ state=absent"

(七)压缩包模块

unarchive模块

常见参数

copy:默认为yes,

当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,

如果设置为copy=no,会在远程主机上寻找src源文件

remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上

src:源路径,可以是ansible主机上或远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no

dest:远程主机上的目标路径

mode:设置解压缩后的文件权限

注意:

有时候,会因为ansible版本的问题,导致无法远程解压,可以通过 copy + shell方式来解决

unarchive模块在ansible使用的时候,标准的写法是:

ansible <目标主机> -m unarchive -a '属性1=值1 ... 属性n=值n'

bash 复制代码
ansible 10.0.0.16 -m unarchive -a 'src=/root/passwd.tar.gz dest=/data/passwd'
#在目标主机中需要有对应的目录,否则会解压失败

(八)软件模块

yum模块和apt模块分别用于 centos|redhat 和 ubuntu|debian 系统下的软件安装

1.apt模块

这两个模块的核心选项基本上都是一样的,常见的选项有

name: # 指定安装软件.

state: # 软件状态:安装(present|installed)

移除(absent|removed)

升级到最新版本latest

build-dep 安装依赖包

fix 修复

注意:

安装多个包,将包名之间使用逗号隔开即可

特殊语法:所有包都升级到最新版本

ansible 10.0.0.16 -m apt -a "name=* state=latest"

bash 复制代码
更新索引源
ansible 10.0.0.30 -m apt -a "update_cache=yes"

清空缓存
ansible 10.0.0.30 -m apt -a "autoclean=yes"

安装软件
ansible 10.0.0.30 -m apt -a "name=nginx,mariadb-server,redis-server state=present"

卸载软件
ansible 10.0.0.30 -m apt -a 'name=mariadb-server,redis-server state=absent'

2. yum模块

和上面一样只不过把apt换成yum

3.service模块

主要选项

enabled: # 设置开机自启动

name: # 服务名称(强制选项).

state: # 设置服务的状态started|stopped|restarted|reloaded

命令格式:

service模块在ansible使用的时候,标准的写法是:

ansible <目标主机> -m service -a '属性1=值1 ... 属性n=值n'

bash 复制代码
开机⾃启动
ansible 10.0.0.30 -m service -a 'name=nginx enabled=yes'

禁止开机⾃启动
ansible 10.0.0.30 -m service -a 'name=nginx enabled=false'

二、编写playbook实现Nginx的两种安装过程,安装方式可通过变量传入控制,编译安装和apt安装

需求:

基于现有的nginx配置文件,定制部署nginx软件,将我们的知识进行整合

定制要求:

启动用户:nginx-test,uid是82,系统用户,不能登录

启动端口10086

web项目根目录/data/webserver/html

默认首页:index.html

首页内容:"welcome to ansible"
分析:

0 基于手工安装的nginx配置文件来编辑,更改用户为nginx-test,uid为82

1 根据playbook的默认属性:hosts和remote_user来描述

2 结合user模块的name、system和shell属性来完成

3 结合file模块的name、owner和state属性来完成

4 结合shell模块的可执行命令来完成

5 结合yum|apt模块的name和state属性来完成

6 结合copy模块的src和dest属性来完成

7 结合service模块的name、state和enabled属性来实现

(一)准备工作

当前主机配置

bash 复制代码
root@ubuntu10:~  cat /etc/ansible/hosts | grep -A2 web]
[web]
10.0.0.11
10.0.0.12

免密认证
ssh-copy-id root@10.0.0.12

10.0.0.12主机关闭防火墙服务

bash 复制代码
root@ubuntu12:~  systemctl disable ufw

root@ubuntu12:~  systemctl stop ufw

保证⽬标主机没有安装nginx

bash 复制代码
root@ubuntu10:~  ansible web -m shell -a "apt purge nginx nginx-common -y"

root@ubuntu10:~  ansible web -m shell -a "apt list --installed | grep nginx"
10.0.0.11 | FAILED | rc=1 >>

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.non-zero return code
10.0.0.12 | FAILED | rc=1 >>

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.non-zero return code

保证⽬标主机没有占⽤uid的⽤⼾

bash 复制代码
root@ubuntu10:~  ansible web -m shell -a "getent passwd | grep 82"
10.0.0.11 | FAILED | rc=1 >>
non-zero return code
10.0.0.12 | FAILED | rc=1 >>
non-zero return code

制作⼀个nginx.conf

bash 复制代码
root@ubuntu10:~  apt install nginx -y
root@ubuntu10:~  systemctl stop nginx
root@ubuntu10:~  mkdir /data/ansible/nginx -p
root@ubuntu10:~  cd /data/ansible/nginx/
root@ubuntu10:/data/ansible/nginx  grep -Ev '#|^$' /etc/nginx/nginx.conf > nginx.conf
                                   #清理掉注释信息和空行

定制配置信息
sed -i 's#www-data#nginx-test#' nginx.conf    #需求中用户名是nginx-test,所以把配置文件中的名字改了

root@ubuntu10:/data/ansible/nginx  vim nginx-define.conf 
server {
   listen 10086;
   root        /data/webserver/html;
   location / {
   }
}

(二)编写playbook

bash 复制代码
# 针对web组的主机执行nginx部署配置
- hosts: web
  remote_user: root
  tasks:
    # 创建nginx-test系统用户
    - name: create new user
      user: name=nginx-test system=yes uid=82 shell=/sbin/nologin

    # 创建web根目录并指定属主
    - name: create web root
      file: name=/data/webserver/html owner=nginx-test state=directory

    # 生成index.html测试页面
    - name: touch web index
      shell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html

    # 安装nginx软件包
    - name: install package
      apt: name=nginx state=present

    # 复制nginx主配置文件
    - name: copy config
      copy: src=nginx.conf dest=/etc/nginx/nginx.conf

    # 复制nginx子配置文件到conf.d目录
    - name: copy subconfig
      copy: src=nginx-define.conf dest=/etc/nginx/conf.d

    # 启动nginx服务并设置开机自启
    - name: start service
      service: name=nginx state=started enabled=yes
bash 复制代码
检查语法
root@ubuntu10:/data/ansible/nginx  ansible-playbook 01-playbook-nginx.yml --syntax-check

playbook: 01-playbook-nginx.yml

模拟执⾏
ansible-playbook 01-playbook-nginx.yml -C
#有一两个报错也不影响执行

执行文件
ansible-playbook 01-playbook-nginx.yml

检查

bash 复制代码
root@ubuntu10:/data/ansible/nginx  ansible web -m shell -a "getent passwd | grep 82"
10.0.0.11 | CHANGED | rc=0 >>
nginx-test:x:82:82::/home/nginx-test:/sbin/nologin
10.0.0.12 | CHANGED | rc=0 >>
nginx-test:x:82:82::/home/nginx-test:/sbin/nologin
root@ubuntu10:/data/ansible/nginx   ansible web -m shell -a "ls -l /data/"
10.0.0.11 | CHANGED | rc=0 >>
总计 4
drwxr-xr-x 3 nginx-test root 4096 12月 22 18:52 webserver
10.0.0.12 | CHANGED | rc=0 >>
总计 4
drwxr-xr-x 3 nginx-test root 4096 12月 22 19:11 webserver
bash 复制代码
root@ubuntu10:/data/ansible/nginx  ansible web -m shell -a "netstat -tnulp | grep nginx"
10.0.0.12 | CHANGED | rc=0 >>
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5184/nginx: master  
tcp6       0      0 :::80                   :::*                    LISTEN      5184/nginx: master  
10.0.0.11 | CHANGED | rc=0 >>
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      25944/nginx: master 
tcp6       0      0 :::80                   :::*                    LISTEN      25944/nginx: master 

发现没有10086端口原因是ubuntu系统安装后自动启动,所以需要重置一下配置文件
root@ubuntu10:/data/ansible/nginx  ansible web -m shell -a "systemctl reload nginx"

(三)异常中断

强制正常 || /bin/true

bash 复制代码
编写nginx的playbook文件 02-playbook-nginx-jump-force.yml
- hosts: web
remote_user: root
tasks:
- name: create new user
user: name=nginx-test system=yes uid=82 shell=/sbin/nologin
- name: test new user
shell: getend passwd | grep nginx-test || /bin/true
...
注意:
我们在 test new user 任务的shell后面添加 || /bin/true

解决异常-忽略错误 ignore_errors

bash 复制代码
tasks:
  - name: create new user
    user: name=nginx-test system=yes uid=82 shell=/sbin/nologin
  - name: test new user
    shell: getend passwd | grep nginx-test
    ignore_errors: True

注意:
ignore_errors配置项 放到tasks字段下,表示针对所有的子任务
ignore_errors配置项 放到一个具体的子任务下,表示针对的是当前的子任务

(四)任务依赖

notify中的handler的样式如下,以playbook.yaml文件为例

  • hosts: web

remote_user: root

tasks:

...

handlers: # 定义触发器任务列表

  • name: restart nginx # 定义具体触发动作

service: name=nginx status=restarted # 触发动作的详情

配置详解:

handlers 和 tasks 是同一级别的属性

handlers 中定义一系列的触发动作,动作的名称必须唯一。

每一个触发动作的定义格式,与task的动作格式完全一样

修改playbook-nginx-handler.yml⽂件,增加notify和handlers部分

bash 复制代码
---
# 针对web组主机部署Nginx相关配置
- hosts: web
  remote_user: root
  tasks:
    # 创建nginx-test系统用户
    - name: create new user
      user: name=nginx-test system=yes uid=82 shell=/sbin/nologin

    # 验证新用户是否创建(注:原命令中getend为笔误,正确应为getent)
    - name: test new user
      shell: getend passwd | grep nginx-test
      ignore_errors: True

    # 创建web根目录并指定属主
    - name: create web root
      file: name=/data/webserver/html owner=nginx-test state=directory

    # 生成index.html测试页面
    - name: touch web index
      shell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html

    # 安装nginx软件包
    - name: install package
      apt: name=nginx state=present

    # 复制nginx主配置文件
    - name: copy config
      copy: src=nginx.conf dest=/etc/nginx/nginx.conf

    # 复制nginx子配置文件到conf.d目录(触发重启handler)
    - name: copy subconfig
      copy: src=nginx-define.conf dest=/etc/nginx/conf.d
      notify: restart nginx

    # 启动nginx服务并设置开机自启(为了演示效果,不要改成restart)
    - name: start service
      service: name=nginx state=started enabled=yes

  # 定义handler(与tasks同级)
  handlers:
    # 重启nginx服务的handler
    - name: restart nginx
      service: name=nginx state=restarted

(五)变量

1.基础

获取变量:

获取格式:{{ 变量名 }}

示例:

{{ nginx_port }}

注意:

变量名和{}之间有空格,这是书写习惯,你不加也不会发生报错,不过我们推荐按照这种方式来写,有时用"{{variable_name}}"才生效。

在ansible中有很多方式来设定变量,常见的方法有以下几种:

1 目标主机默认的属性

2 主机清单中定义的特有属性

3 命令行定义的特定属性

4 playbook通过vars定义的特有属性

5 专用的YAML定义的特有属性文件

各种方式的优先级:

1 < 2 < 4 < 5 < 3

2.主机

bash 复制代码
使用普通变量的设置方式,给每个主机都设置一个hostid的变量:
tail -n 4 /etc/ansible/hosts
[web]
10.0.0.30 hostid=master
10.0.0.10 hostid=node1
10.0.0.31 hostid=node2
10.0.0.11 hostid=node3
10.0.0.12 hostid=node4
bash 复制代码
编写一个设定主机名的任务 02-variable-hostname.yml
- hosts: web
  remote_user: root
    tasks:
      - name: set hostname
        hostname: name=ansible-{{ hostid }}.example.com

变量定义主机名字

bash 复制代码
cat /etc/ansible/hosts
......
[web]
10.0.0.30 hostid=master
10.0.0.10 hostid=node1
10.0.0.31 hostid=node2
10.0.0.11 hostid=node3
10.0.0.12 hostid=node4
[web:vars]
head=ansible
tail=.123.com
bash 复制代码
cat 03-variable-hostname.yml 
--- 
- hosts: web
  remote_user: root
  tasks:
    - name: set hostname
      hostname:
        name: "{{ head }}-{{ hostid }}{{ tail }}" 

(六)模版

在使用模板文件的时候有这么三个基本原则:

1 模板专用目录:跟playbook.yaml同目录下创建一个templates目录

2 基准配置文件:基准配置文件放在templates目录下,文件后缀必须是".j2"

3 自动替换数据:通过jinja2模板语言将数据传递到基准配置文件中。

1.部署nginx的时候,基于标准的nginx配置文件,自动生成专用的nginx配置文件

bash 复制代码
改造/etc/ansible/hosts主机清单文件
[web]
10.0.0.30 nginx_port=81
10.0.0.11 nginx_port=82
10.0.0.12 nginx_port=83

基准配置⽂件

bash 复制代码
cat templates/nginx-define.conf.j2
server {
    listen {{ nginx_port }};
    root /data/webserver/html;
    location / {
    }
}

编写playbook文件

bash 复制代码
vim /data/ansible/playbook/templates/01-playbook-nginx-templates.yml
---  
- hosts: web            
  remote_user: root         
  tasks:                  
    - name: install package
      apt:                 
        name: nginx         
        state: present

    - name: create web root  # 创建web根目录
      file:
        name: "/data/webserver/html" 
        state: directory    # 确保是目录类型

    - name: touch web index  # 生成首页文件
      shell: |              
        echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html

    - name: delete default nginx conf  # 删除默认配置
      file:
        name: "/etc/nginx/sites-enabled/default"
        state: absent       # 确保文件/链接不存在

    - name: copy config      # 复制自定义Nginx配置
      template:
        src: "./templates/nginx-define.conf.j2"
        dest: "/etc/nginx/conf.d/nginx-define.conf"
      notify: restart nginx # 配置变更时触发重启

    - name: start service    # 启动并开机自启Nginx
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:              
    - name: restart nginx  
      service:           
        name: nginx
        state: restarted

2.条件管理

在ansible动态生成配置文件的场景中,when语句可以对我们的变量|facts的值进行针对性的条件判断,从而实现不同的效果状态。

  • hosts: web

remote_user: root

tasks:

  • name: install package

apt: name=nginx state=present

when: ansible_os_family == "RedHat"

3.迭代管理

  • hosts: websrvs

remote_user: root

tasks:

  • name: install packages
    **apt: name={{ item }} state=present
    with_items:
  • nginx
  • httpd**

...

loop 用于在任务中对给定列表的每个元素进行迭代操作(新版的)

  • name: 任务名称

module:

参数: "{{ item }}" # 这里的item代表列表中的每个元素
loop:

  • 元素1

  • 元素2

  • 元素3

多值迭代

bash 复制代码
---
- hosts: web
  remote_user: root
  tasks:
    - name: add some group
      user:
        name: "{{ item }}"
        state: present
      with_items:
        - group1
        - group2
        - group3

    - name: add some users
      user:
        name: "{{ item.name }}"
        group: "{{ item.group }}"
        state: present
      with_items:                            #主要就是这个部分
        - { name: 'user1', group: 'group1' }
        - { name: 'user2', group: 'group2' }
        - { name: 'user3', group: 'group3' }

(七)Role

  1. Role 是 Ansible 的模块化工具,把 "一个功能" 的代码打包成独立 "工具包",解决单文件 Playbook 臃肿、无法复用的问题;
  2. Role 有固定目录结构,主要关注tasks/(任务)、vars/(变量)、templates/(模板)3 个核心目录;
  3. 使用流程:创建 Role 目录→拆分代码到对应目录→Playbook 中用roles:调用,逻辑和普通 Playbook 完全一致,只是组织形式更优。
    role角色目录结构及其作用

/path/to/roles/ 项目角色目录

role1/ 子角色目录

files/ 文件目录 - 存放由copy或script等模块依赖的文件,目录结构如下

xxx.yaml 任务剧本 - 实现拆分后的子任务的playbook文件

main.yaml 整合文件 - 通过include语句将本目录下所有剧本文件进行整合

templates/ 模板目录 - template模块依赖的模板文件,结构同上

tasks/ 任务目录 - role的核心元素,有所有任务playbook文件组成,结构同上

handlers/ 关联目录 - 存放各种触发器任务文件,结构同上

vars/ 变量目录 - 存放各种变量文件,结构同上

meta/ 数据目录 - 设定角色的特殊设定及其依赖关系,结构同

default/ 默认目录 - 一些基础的配置文件,比如默认变量、默认配置等内容,结构同上

role2/ 子角色目录

...

注意:

以上部分是比较常见的内容,其中最重要的是 tasks目录

清理nginx环境

bash 复制代码
ansible web -m service -a "name=nginx state=stopped"
ansible web -m apt -a "name=nginx,nginx-common state=absent"
ansible web -m file -a "path=/data/webserver state=absent"
ansible web -m file -a "path=/etc/nginx/conf.d/nginx-define.conf state=absent"
ansible web -m user -a "name=nginx-test state=absent"

三、Open-V的部署安装过程和基本使用

是在不安全的公网环境中,搭建一条加密的专用通信隧道,让两端设备像在同一内网一样互通,兼顾安全性和灵活性,是运维、企业远程办公最常用的 V 方案之一。

工作原理:

建立隧道:

V 网关采用双网卡结构,外网卡用公网 IP 接入互联网。在公用网络中创建专用数据通道(隧道),利用隧道协议(如 PPTP、L2TP、IPSec 等 )对数据包封装,让数据在隧道中安全传输 。

加密与解密:

V 设备根据规则对数据加密后传输,到达目的 VPN 设备后解密。发送时,VPN 客户端加密数据,接收时,VPN 服务器解密数据 。

地址转换:

V 网关对数据包目标地址转换,使远程用户看似在专用网络内访问资源 。
部署流程:

  1. 准备阿⾥云主机,其中⼀台配置公⽹IP

  2. 在阿⾥云安全组中放⾏ 1194 端⼝

  3. 在有公⽹IP的阿⾥云主机上部署 OpenV Server

  4. 在 Magedu 内⽹主机上部署 OpenV Client

  5. 测试 OpenV ⽹络

注意:一定要确保所有的内容都在同一个区域

(一)创建vpc

阿里云权益中心_助力学生、开发者、企业用云快速上云-阿里云

进入之后配置网段和名称、路由等

(二)设定云主机的安全组

(三)购买ECS云主机服务

创建完成后停止,修改ip地址

可以修改主机名方便管理

现在ping是ping不通的;还需要申请一个公网ip

(四)购买一个公网ip

绑定公网IP

远程连接进入终端

(五)配置 OpenV证书

1.安装管理工具

bash 复制代码
安装openvpn,安装证书管理⼯具
root@vpn-server:~  apt update;apt install openvpn easy-rsa

2.配置CA证书环境

准备证书环境,让证书和 openv 配置处于⼀个⽬录,⽅便迁移

bash 复制代码
cp -r /usr/share/easy-rsa/ /etc/openvpn/

cd /etc/openvpn/easy-rsa/
mv vars.example vars

3.初始化证书目录

bash 复制代码
初始化证书环境
./easyrsa init-pki

4.生成CA机构证书

⽣成CA机构证书,不使⽤密码

bash 复制代码
./easyrsa build-ca nopass

5.配置OpenV服务器证书

bash 复制代码
./easyrsa gen-req server nopass
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:lty-vpn.123.com    #名字随意

颁发机构证书

bash 复制代码
root@vpn-server:/etc/openvpn/easy-rsa  ./easyrsa sign-req server server

root@vpn-server:/etc/openvpn/easy-rsa  tree ./
./
├── easyrsa
├── openssl-easyrsa.cnf
├── pki
│   ├── ca.crt
│   ├── certs_by_serial
│   │   └── F818179AF775EA1AA2C7771146AE01A9.pem
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── inline
│   ├── issued
│   │   └── server.crt
│   ├── openssl-easyrsa.cnf
│   ├── private
│   │   ├── ca.key
│   │   └── server.key
│   ├── reqs
│   │   └── server.req
│   ├── revoked
│   │   ├── certs_by_serial
│   │   ├── private_by_serial
│   │   └── reqs_by_serial
│   ├── serial
│   └── serial.old
├── vars
└── x509-types
    ├── ca
    ├── client
    ├── code-signing
    ├── COMMON
    ├── email
    ├── kdc
    ├── server
    └── serverClient

6.创建 Diffie-Hellman 密钥

官方说明:https://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange

bash 复制代码
创建参数⽂件
./easyrsa gen-dh

7.配置OpenV客户端证书

⽣成客户证书申请⽂件

bash 复制代码
./easyrsa gen-req tom nopass

签发客户端证书

bash 复制代码
./easyrsa sign-req client tom

重复上述步骤,为⽤⼾ jerry 创建证书

bash 复制代码
root@vpn-server:easy-rsa  ./easyrsa gen-req jerry nopass
root@vpn-server:easy-rsa  ./easyrsa sign-req client jerry

8.整理目录

将特定⽤户的 openV 服务端相关证书⽂件复制到 server 目录中

bash 复制代码
root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/
root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/server/
root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/server/
root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/

为客户端⽤户创建⽬录,并将相关⽂件放到指定目录

bash 复制代码
mkdir /etc/openvpn/client/{tom,jerry}

root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/client/tom/
root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/private/tom.key /etc/openvpn/client/tom/
root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/issued/tom.crt /etc/openvpn/client/tom/

root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/client/jerry/
root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/private/jerry.key /etc/openvpn/client/jerry/
root@vpn-server:~  cp /etc/openvpn/easy-rsa/pki/issued/jerry.crt /etc/openvpn/client/jerry/

(六)OpenV服务端配置

1.配置文件

#常用配置项

bash 复制代码
;local a.b.c.d     #服务端监听的本机IP,默认所有IP
port 1194     #默认端口
;proto tcp     #使用TCP协议,生产环境建议使用TCP协议
proto udp     #默认使用UDP协议
;dev tap     #创建以太网隧道设备,此设备操作的是第二层数据包
dev tun     #创建IP路由隧道设备,此选项模拟的是网络层设备,其操作的是第三层的数据包,生产环境建议使用;dev-node MyTap #TAP-Win32的设备驱动。非windows系统不需要
ca ca.crt     #CA机构证书文件路径
cert server.crt     #OpenVPN服务器证书文件路径
key server.key     #OpenVPN服务器
dh dh2048.pem     #DH参数文件

;topology subnet
server 10.8.0.0 255.255.255.0     #客户端连接后自动分配的IP网段,
                                  #默认会给服务器分配此网段的第一个IP将做为客户端的网关,
                                  #注意不要和内网网段相同
ifconfig-pool-persist ipp.txt     #记录客户端和虚拟IP地址分配的文件
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100     #配置网桥模式,无需配置,建议注释;server-bridge
;push "route 192.168.10.0 255.255.255.0"     #推送给客户端的到达服务器后面网段的静态路由,
                                             #网关是服务器地址10.8.0.1
;push "route 192.168.20.0 255.255.255.0"     #推送路由信息到客户端,以允许客户端能够连接到服务器
                                             #背后的其它私有网络
;client-config-dir ccd                       #为特定客户端添加路由信息,
                                             #此路由是客户端后面的网段而非服务端的网段,无需设置
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script             #指定外部脚本文件,实现创建不同组的iptables规则,
                                    #无需配置
;push "redirect-gateway def1 bypass-dhcp"     #启用此配置后客户端所有流量都将通过VPN服务器进行转发,
                                              #因此生产一般无需配置此项
;push "dhcp-option DNS 208.67.222.222"        #推送DNS服务器地址,无需配置
;push "dhcp-option DNS 208.67.220.220"
;client-to-client             #允许不同的客户端直接通信,不安全,生产环境一般无需配置
;duplicate-cn                 #多用户共用一个证书,一般用于测试环境,生产环境建议一个用
户一个证书
keepalive 10 120              #服务端活动的检测的间隔和超时时间,10秒ping一次,
#120S没有回应认为下线
tls-auth ta.key 0             #访止DoS等攻击的安全增强配置,服务器和每个客户端
                              #都需要拥有此密钥文件。
                              #第二个参数在服务器端为0,客户端为1
cipher AES-256-CBC            #加密算法
;compress lz4-v2              #启用Openvpn2.4.X新版压缩算法
;push "compress lz4-v2"       #推送客户端使用新版压缩算法,
                              #和下面的comp-lzo不要同时使用
;comp-lzo                     #旧户端兼容的压缩配置,需要客户端配置开启压缩,
                              #openvpn2.4.X等新版可以不用开
;max-clients 100              #最多支持的客户端数量
;user nobody                  #指定openvpn服务的用户
;group nobody                 #指定openvpn服务的组
persist-key                   #重启服务时默认会重新读取key文件,开启此配置后保持使用
                              #第一次的key文件,生产环境无需开启
persist-tun
status openvpn-status.log     #服务器状态记录文件,每分钟记录一次相关信息
;log openvpn.log              #日志记录模式,此项表示每次重启服务后重新生成日志
;log-append openvpn.log       #日志记录模式,此项表示在原有日志后面追加
verb 3                        #日志级别,0-9,0 只记录错误
;mute 20                      #对相同类别的信息只记录前20条到日志文件中
                              #相当于日志去重
explicit-exit-notify 1        #当服务端重启后通知客户端自动重新连接服务器,
                              #此项配置仅能用于udp模式,
                              #tcp模式无需配置即能实现重新连接功能,
                              #且开启此项后tcp配置后将导致openvpn服务无法启动,
                              #所以tcp时必须不能开启此项
script-security 3             # 允许使用自定义脚本
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env     #指定自定义脚本路径
username-as-common-name         #开启用户密码验证
client-cert-not-required        #只支持用户和密码方式验证,不支持证书,
                                #无此配置表示需要证书和用户密码多种验证
bash 复制代码
vim server.conf
port 1194
proto tcp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
push "route 172.30.0.0 255.255.255.0"
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 2048
user root
group root
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20

2.启动服务并查看状态

bash 复制代码
root@vpnsystemctl enable --now openvpn.service --now openvpn.service

root@vpn-server:/etc/openvpn  systemctl is-active openvpn.service
active
root@vpn-server:/etc/openvpn  ss -tnlp | grep 1194
LISTEN 0      32           0.0.0.0:1194      0.0.0.0:*    users:(("openvpn",pid=10467,fd=6)) 

3.为不同⽤户设置配置文件

bash 复制代码
root@vpn-server:/etc/openvpn#  vim client/tom/client.ovpn
client
dev tun
proto tcp
remote 114.55.4.198 1194 #生产中为OpenVPN服务器的FQDN或者公网IP,这个地方时需要更改的
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert tom.crt
key tom.key
remote-cert-tls server
#tls-auth ta.key 1
cipher AES-256-CBC
verb 3 #此值不能随意指定,否则无法通信
compress lz4-v2 #此项在OpenVPN2.4.X版本使用,需要和服务器端保持一致,如不指定,默认使用comp-lz压缩
bash 复制代码
root@vpn-server:/etc/openvpn#  vim client/jerry/client.ovpn
client
dev tun
proto tcp
remote 114.55.4.198 1194
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert jerry.crt
key jerry.key
remote-cert-tls server
#tls-auth ta.key 1
cipher AES-256-CBC
verb 3
compress lz4-v2

查看目录内容

bash 复制代码
root@vpn-server:/etc/openvpn# tree client/
client/
├── jerry
│   ├── ca.crt
│   ├── client.ovpn
│   ├── jerry.crt
│   └── jerry.key
└── tom
    ├── ca.crt
    ├── client.ovpn
    ├── tom.crt
    └── tom.key

(七)部署 OpenV客户端

官网:https://openvpn.net/community-downloads/

安装好之后,把文件打包下载到客户机上

解压文件,把内部文件放到OpenV\config文件中

openv上连接之后,就可以ping通了

(八)连接server主机的后端主机

bash 复制代码
在vpn-server主机上,开启数据包转发的能⼒
echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf

在OpenVPN server 主机上设置 SNAT 转发
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j MASQUERADE

四、完成zabbix相关的安装

官方安装教程:https://www.zabbix.com/documentation/7.0/zh/manual/installation/getting_zabbix

(一)安装 Zabbix 软件库

1.安装软件

bash 复制代码
root@ubuntu10:~  wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/

root@ubuntu10:~  dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb

root@ubuntu10:~  apt update 

安装zabbix server 和 前端工具以及代理agent

bash 复制代码
apt install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent

安装数据库

bash 复制代码
apt install mysql-server -y

定制数据库

bash 复制代码
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;    #创建数据库
mysql> create user zabbix@localhost identified by 'password';        #创建用户
mysql> grant all privileges on zabbix.* to zabbix@localhost;         #给予权限
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit; 

导入初始架构和数据,系统将提示您输入新创建的密码。(在桌面版可以,如果是服务器版本需要在 msyql数据库中,为该用户增加 SUPER权限即可 GRANT SUPER ON *.* TO zabbix@localhost;)

bash 复制代码
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix 

将刚才为了导入数据库文件能力的 属性移除

bash 复制代码
mysql
mysql> set global log_bin_trust_function_creators = 0;
mysql> quit; 

2.配置zabbix连接数据库

编辑配置文件 /etc/zabbix/zabbix_server.conf

bash 复制代码
vim /etc/zabbix/zabbix_server.conf
### Option: DBPassword
#       Database password.
#       Comment this line if no password is used.
#
# Mandatory: no
# Default:
# DBPassword=
DBPassword=password            #增加这一条属性

3.前端的配置

删除默认的nginx首页配置文件

bash 复制代码
rm -f /etc/nginx/sites-enabled/default

定制zabbix的配置文件

bash 复制代码
vim /etc/nginx/conf.d/zabbix.conf
server {
        listen          80;
#        server_name     example.com;
......

修改php配置

bash 复制代码
vim /etc/zabbix/php-fpm.conf
......
php_value[upload_max_filesize] = 2M
php_value[max_input_time] = 300
php_value[max_input_vars] = 10000
php_value[date.timezone] = Asia/Shanghai
#增加中国的时区配置

重启服务

bash 复制代码
root@ubuntu10:~  systemctl restart zabbix-server zabbix-agent nginx php8.3-fpm
root@ubuntu10:~  systemctl enable zabbix-server zabbix-agent nginx php8.3-fpm     #开机自启

访问10.0.0.10

注意:这里面的语言包需要提前安装,中文包在安装的时候,就已经安装好了。

CentOS安装中文包,再修改语言,否则无法选择

yum -y install langpacks-zh_CN

Ubuntu安装下面中文包

apt -y install language-pack-zh-hans

安装之后需要重启才能生效

默认的用户名"Admin",在Password中输入默认密码"zabbix"

4.中文问题

点击图形后,进入到图形界面,会发生字体异常 -- 不是程序的问题,仅仅是字符集的问题;所以我们就需要对zabbix的字体进行调整,把我们宿主机上的某些字体上传到Zabbix内部,并且让其生效

上传windows中文字符集

bash 复制代码
root@ubuntu10:~  ls
SIMKAI.TTF  snap  zabbix-release_latest_7.0+ubuntu24.04_all.deb

转移字符集

bash 复制代码
root@ubuntu10:~  cd /usr/share/zabbix/assets/fonts
root@ubuntu10:/usr/share/zabbix/assets/fonts  mv graphfont.ttf graphfont.ttf-bak
root@ubuntu10:/usr/share/zabbix/assets/fonts  mv ~/SIMKAI.TTF graphfont.ttf

5.地图问题

默认情况下没有;到下图所示地方去更改

供应商:选择其他

URL: https://webrd04.is.autonavi.com/appmaptile?lang=zh_cn\&size=1\&scale=1\&style=7\&x={x}\&y={y}\&z={z}

属性文字:高德矢量地图

最大缩放级别: 18

修改初始化地点

改成项目所在地的 纬度,经度 即可

监控的原理:

1、客户端存在zabbix_agent

------服务一旦运行,就生成了大量的可用监控项条目

2、服务端 远程测试 目标监控项是否可用

------aabbix_get -s ip -p 10050 -k 监控项条目

3、zabbix server的web界面定制监控
如何从0开始定制监控项

1、客户端,编写脚本

2、客户端,使用脚本

3、客户端,定制监控属性

4、服务端,测试监控属性

5、服务端,应用监控属性

(二)监控主机

Zabbix Agent 需要安装到被监控的主机上,它负责定期收集各项数据,并发送到zabbix server端,zabbix server将数据存储到数据库中,zabbix web 访问数据库在前端进行展现和绘图。

在10.0.0.11上安装一个agent

1.安装agent

bash 复制代码
配置软件源
wgethttps://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb

dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb

apt update

apt install -y zabbix-agent

定制配置

bash 复制代码
vim /etc/zabbix/zabbix_agentd.conf
117:Server=10.0.0.10 # 指定zabbix服务端的地址,
# 如果需要本地测试临时测试的话,需要添加本地的ip地址
......
125:ListenPort=10050 # 默认的端口号,可以不用取消注释
......
158 # ServerActive=127.0.0.1 # 注释该条目,这是另外一种指定zabbixserver主机的方式
......
169:Hostname=10.0.0.11 # zabbixserver监控当前主机的时候,客户端主机唯一的标识

注意:
如果没有定义Hostname, 则服务器将使用agent的系统主机名命名主机。
如果需要本地测试监控,修改Server的配置Server=10.0.0.13,10.0.0.16

重启服务

bash 复制代码
systemctl restart zabbix-agent.service
systemctl enable zabbix-agent.service

2.资源创建

创建主机组资源

创建主机资源

为了主机能够正常的被监控到,我们还需要给他配备一些基础的监控项,点击创建主机界面中菜单栏中"Host"右侧的"Templates",在 Link new templates右侧的空框中选择"Template OS Linux by Zabbix agent"

3. JMX方式监控

对于一些java应用来说,zabbix可以通过 JMX 的方式来进行主机的监控效果。

JMX 全称为 Java Management Extension 。开启JMX后能观察tomcat服务运行时出现的故障,以及监视内存、cpu等使用情况。

10.0.0.11主机上

环境部署

bash 复制代码
安装tomcat
apt search tomcat
apt install tomcat10 -y

zabbix服务端部署 java gateway

bash 复制代码
apt install zabbix-java-gateway

vim /etc/zabbix/zabbix_java_gateway.conf
......
START_POLLERS=50 # 开启的进程可以多一点
......

重启服务
systemctl restart zabbix-java-gateway.service
systemctl enable zabbix-java-gateway.service

zabbix server 配置JMX(10.0.0.10)

bash 复制代码
vim /etc/zabbix/zabbix_server.conf
JavaGateway=10.0.0.11         # 指定java gateway 主机的地址
JavaGatewayPort=10052
StartJavaPollers=20           # 设定的java线程数量要小于 java-gateway的
START_POLLERS

重启服务
systemctl restart zabbix-server.service

查找tomcat的专属启动文件(10.0.0.11)

bash 复制代码
root@ubuntu11:~/ubuntu_install_zabbix_7.0  find / -name "catalina.sh"
/usr/share/tomcat10/bin/catalina.sh

vim /usr/share/tomcat10/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.11 -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

重启服务
systemctl restart tomcat10.service

netstat -tnulp | grep java
tcp6       0      0 :::36569                :::*                    LISTEN      25676/java          
tcp6       0      0 :::8080                 :::*                    LISTEN      25676/java          
tcp6       0      0 :::10086                :::*                    LISTEN      25676/java     #开启成功         
tcp6       0      0 :::10052                :::*                    LISTEN      25277/java          
tcp6       0      0 :::46063                :::*                    LISTEN      25676/java   

测试工具

bash 复制代码
root@ubuntu11:~/ubuntu_install_zabbix_7.0  mkdir /data/softs -p
root@ubuntu11:~/ubuntu_install_zabbix_7.0  cd /data/softs/
root@ubuntu11:/data/softs  ls
cmdline-jmxclient-0.10.3.jar

执行测试命令
root@ubuntu11:/data/softs  java -jar cmdline-jmxclient-0.10.3.jar - 10.0.0.11:10086 java.lang:type=Memory HeapMemoryUsage
12/31/2025 16:32:37 +0800 org.archive.jmx.Client HeapMemoryUsage: 
committed: 80740352
init: 65011712
max: 1015021568
used: 52648008

zabbix 以JMX方式监控tomcat主机

(三)Nginx监控

1.ubuntu10.0.0.11安装和配置nginx状态页

bash 复制代码
apt update && apt -y install nginx

修改配置
vim /etc/nginx/sites-enabled/default
...
server {
    .....
    #添加下面三行,Zabbix默认监控/basic_status,此处为/status,需要和zabbix的模板定义的路径要保持一致
    location /status {
        stub_status;
    }
......
}

nginx -t
systemctl restart nginx

root@ubuntu11:/data/softs  curl localhost/status
Active connections: 2 
server accepts handled requests
 2 2 7 
Reading: 0 Writing: 1 Waiting: 1 

Rocky部署nginx

bash 复制代码
yum -y install nginx

修改配置
vim /etc/nginx/sites-enabled/default
...
server {
    .....
    #添加下面三行,Zabbix默认监控/basic_status,此处为/status,需要和zabbix的模板定义的路径要保持一致
    location /status {
        stub_status;
    }
......
}

nginx -t
systemctl restart nginx

[root@rocky30 ~]  curl localhost/status
Active connections: 1 
server accepts handled requests
 1 1 1 
Reading: 0 Writing: 1 Waiting: 0 

2.添加nginx监控 - HTTP

3.Nginx监控-agent

10.0.0.30(rocky主机)

bash 复制代码
关闭防火墙
systemctl disable --now firewalld.service

安装软件
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm
yum clean all
yum install zabbix-agent

修改配置

bash 复制代码
vim /etc/zabbix/zabbix_agentd.conf

117:Server=10.0.0.10     # 指定zabbix服务端的地址
125:ListenPort=10050     # 默认的端口号,可以不用取消注释
158 # ServerActive=127.0.0.1     # 注释该条目,这是另外一种指定zabbixserver主机的方式
169:Hostname=10.0.0.30     # zabbixserver监控当前主机的时候,客户端主机唯一的标识

注意:
如果没有定义Hostname, 则服务器将使用agent的系统主机名命名主机。

重启服务
systemctl start zabbix-agent.service
systemctl enable zabbix-agent.service

4.调整监控项的时间间隔

五、核心内容

(一) Item解析(监控项)

关于item的设定

前提:zabbix server 能够通过 zabbix_get 远程获取目标属性

使用

1、直接为host定制item

2、将itiem添加到template里面,然后让host 关联绑定 模板template

1.创建item

需求分析:

案例需求:系统监控需求 - 监控当前系统中性能质量,比如cpu的1分钟、5分钟、15分钟的平均负载

需求分析:

1.我们可以借助于linux的系统命令top来获取这三个需求的值,效果如下

uptime

23:03:35 up 3:41, 3 users, load average: 0.01, 0.03, 0.05

注意:

虽然可以通过top + grep + awk 的方式来获取响应的值,但是top命令的效果默认情况下有后遗症,不适合作为监控项命令使用

2.根据zabbix_agent.conf中的Include配置,我们需要进入到/etc/zabbix/zabbix_agentd.d/目录下,创建以.conf为后缀的普通文件

获取具体条目

bash 复制代码
cd /etc/zabbix/zabbix_agentd.d
vim cpu_load.conf

查看编辑文件内容
cat cpu_load.conf
UserParameter=cpu.load1,uptime | awk -F ": |, " '{print $4}'
UserParameter=cpu.load5,uptime | awk -F ": |, " '{print $5}'
UserParameter=cpu.load15,uptime | awk -F ": |, " '{print $6}'

重启服务
systemctl restart zabbix-agent.service

root@ubuntu10:/etc/zabbix/zabbix_agentd.d  zabbix_get -s 10.0.0.10 -p 10050 -k cpu.load1
0.00

2.关联item

(二)Graph(图形)

关于graph的设定:

前提:item在zabbix中已经设定完毕了

创建Graph

(三)dashboard(仪表盘)

dashboard就是将多个Graph、数据源等各种各样的数据 组合起来放在一个dashboard中,dashboard本质上就是一个表格,只不过这个表格里存放的是各种Graph之类的图形展示资源。
原则:

1 梳理业务方向和功能模块

2 创建一个新的dashboard

2 分组归类监控item及Graph等图形资源

3 按照功能方向,将一组的图形放置在同一个dashboard上

4 如果dashboard图形过大,在展示的时候,需要借助于分屏软件进行全部展示

(四)触发器

关于触发器的设定

前提:item 能够通过 zabbix 远程获取目标属性

graph 在 zabbix 中已经设定完毕了(可选)

使用

1、直接为 host 定制 trigger

2、将 trigger 添加到 template 里面,然后让 host 关联绑定 模板template
触发器其实就是一些条件的定义,一个触发器是根据一个监控项的返回值,将之与预先设置的阈值进行对比,当监控项返回了不符合预定义的值范围后,就进行触发下一步操作的警戒线,一般要对创建的监控项设置触发器以及触发方式和值的大小。

功能函数

配置解析

在Trigger的配置中,比较重要的就是以下三个属性:

Nam 用于设定触发器的名称,如果需要携带特定主机唯一标识的话,可以借助于宏变量

Serverity 用于设定触发器的安全等级,可以随机选择

Expression 触发器的核心配置,表达式需要按照规矩来写

在zabbix server主机上创建一个文件,检查触发器效果。(没效果就把数值调大)

bash 复制代码
root@ubuntu10:~  cd /tmp/
root@ubuntu10:/tmp  dd if=/dev/zero of=/dev/null bs=1k count=10000000
输入了 10000000+0 块记录
输出了 10000000+0 块记录
10240000000 字节 (10 GB, 9.5 GiB) 已复制,9.50469 s,1.1 GB/s

(五)模板

关于模板的操作

创建模板

item、graph、dashboard、trigger等 和在主机中操作大同小异

1.在10.0.0.11主机上安装一个redis

bash 复制代码
apt install redis -y

systemctl restart redis

定制一个脚本去获取redis的监控属性

bash 复制代码
#!/bin/bash
# *************************************
# * 功能:查询Redis指定状态指标的值
# * 作者: lty
# *************************************

# 定制环境变量:接收脚本传入的第一个参数(Redis指标名)
user_cmd=$1

# 定义获取Redis状态的函数
redis_status() {
  # 接收函数传入的参数(指标名)
  cmd=$1
  # 核心逻辑:获取Redis全量状态 → 过滤指定指标行 → 截取指标值
  redis_status_value=$(/usr/bin/redis-cli -h 127.0.0.1 -p 6379 info | grep "$cmd:" | cut -d':' -f2)
  # 输出提取到的指标值
  echo $redis_status_value
}

# 调用函数,传入脚本接收的指标名参数
redis_status $user_cmd

执行脚本

bash 复制代码
/bin/bash /etc/zabbix/zabbix_agentd.d/redis_monitor.sh role

定制监控项配置文件

bash 复制代码
root@ubuntu11:~  vim /etc/zabbix/zabbix_agentd.d/redis_status.conf
UserParameter=redis_status[*], /bin/bash /etc/zabbix/zabbix_agentd.d/redis_monitor.sh "$1"

测试远程连接

bash 复制代码
root@ubuntu10:/tmp  zabbix_get -s 10.0.0.11 -p 10050 -k 'redis_status[redis_version]'
7.0.15
root@ubuntu10:/tmp  zabbix_get -s 10.0.0.11 -p 10050 -k 'redis_status[role]'
master
创建模板

添加item

添加trigger

使用模板

(六)实践

1.TCP实践

需求:借助于对主机间的TCP连接状态来实现获取 主机间网络通信质量的效果。

bash 复制代码
root@ubuntu11:/tmp  cat /etc/zabbix/zabbix_agentd.d/tcp_status.sh
#!/bin/bash
# *************************************
# * 功能: 定制TCP连接状态效果
# * 作者: lty
# *************************************

# 定制本地变量
user_status=$1

tcp_status() {
  TCP_STAT=$1
  TCP_STAT_VALUE=$(ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' | grep "$TCP_STAT" | cut -d ' ' -f2)
  if [ -z $TCP_STAT_VALUE ]; then
    TCP_STAT_VALUE=0
  fi
  echo $TCP_STAT_VALUE
}

tcp_status $user_status
bash 复制代码
root@ubuntu11:~  /bin/bash /etc/zabbix/zabbix_agentd.d/tcp_status.sh LISTEN
23
bash 复制代码
root@ubuntu11:~  vim /etc/zabbix/zabbix_agentd.d/tcp_status.conf
UserParameter=tcp_status[*],/bin/bash /etc/zabbix/zabbix_agentd.d/tcp_status.sh "$1"

服务端10.0.0.10上验证

bash 复制代码
root@ubuntu10:/tmp  zabbix_get -s 10.0.0.11 -k tcp_status[ESTAB]
3

添加一个预设的模板

使用模板

2.SNMP监控

网络设备要打开SNMP功能

3.web监控

六、高级内容

(一)用户管理

Zabbix 中有不同的用户角色,每种角色拥有不同的权限范围,角色定义可以管理和访问哪些菜单项。

1.创建用户

登录新的用户可以发现权限变少了

2.用户组

3.角色

点击创建用户角色,这里面有三种默认的权限选项:用户、管理员、超级管理员。每一种类型都是默认的权限;我们可以自定义

(二)可视化改造

Grafana

是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。
使用 Grafana 显示Zabbix的监控数据过程

1.安装 grafana

2.安装 zabbix 插件

3.创建 zabbix 数据源

4.导入 dashboard 模板

官网:https://grafana.com/grafana/download?platform=linux

ubuntu安装grafana

bash 复制代码
apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_11.5.2_amd64.deb
#也可以用新版无所谓
dpkg -i grafana-enterprise_11.5.2_amd64.deb

重启一下
systemctl enable --now grafana-server.service

访问 grafana的 web 界面 10.0.0.13:3000;默认用户名和密码都是admin登录

是为云原生服务的所以需要安装插件

官方安装说明:https://grafana.com/grafana/plugins/alexanderzobnin-zabbix-app/

bash 复制代码
root@ubuntu10:/data/softs  grafana-cli plugins install alexanderzobnin-zabbix-app

下载下来的文件在/var/lib/grafana/plugins下
root@ubuntu10:/var/lib/grafana/plugins  chown grafana:grafana -R ./*

root@ubuntu10:/var/lib/grafana/plugins  chmod 750 alexanderzobnin-zabbix-app/
root@ubuntu10:/var/lib/grafana/plugins  ll
总计 20
drwxr-x--- 5 grafana grafana 4096  1月  4 19:04 ./
drwxr-xr-x 6 grafana grafana 4096  1月  4 19:06 ../
drwxr-x--- 6 grafana grafana 4096  1月  4 19:04 alexanderzobnin-zabbix-app/
drwxr-x--- 3 grafana grafana 4096  1月  4 18:56 grafana-lokiexplore-app/
drwxr-x--- 5 grafana grafana 4096  1月  4 18:56 grafana-pyroscope-app/

连接数据源

关于数据源的url地址:

基于nginx的zabbix的web页面

http://zabbix-server(IP)/api_jsonrpc.php

基于apache的zabbix的web页面

http://zabbix-server(IP)/zabbix/api_jsonrpc.php

成功

可以看到编辑System load部分没有数据,那么我们点击 System load右侧的三个小点点,点击edit

(三)告警功能

原则:

准备工作

  • 业务场景需要告警机制(告警发送方和通知接收方)

  • 服务器支持告警功能

告警机制

  • User 和 User group 资源配置告警用户

  • 设定告警媒介Media资源

动作管理

  • 启动什么时候告警的Action

  • 关联触发告警的Trigger

1.邮箱配置

邮箱的设置功能,找到邮件服务,点击开启 POP3/SMTP服务[短信发送需要钱]

参数分类解析(按用途归类,标注必填 / 可选)

参数格式 类型 说明 示例 注意事项
-f ADDRESS 必填 发件人邮箱地址(需与 SMTP 认证账号匹配) -f wshs1117@126.com 必须是真实存在的邮 箱地址,否则 SMTP 服务 器会拒绝
-t ADDRESS 必填 收件人邮箱地址(多个收件人用空格分隔) -t 1002957707@qq.com 123@163.com 支持同时指定多个 收件人
-u SUBJECT 必填 邮件主题(含空格需用双引号包裹) -u "邮件测试-20260104" 中文主题需配合 -o message-charset=utf-8 避免乱码
-m MESSAGE 必填 邮件正文(含空格 / 换行需用双引号包裹,多行可写在 "" 内或用文件导入) -m "这是测试邮件的正文内容" 多行正文推荐:-m "$ (cat text.txt)"(读 取文件内容作为正文)
-s SERVER[:PORT] 必填 SMTP 服务器地址 + 端口(默认端口 25,加密推荐 465/587) -s smtp.126.com:465 126/QQ 邮箱推荐指定 465 端口(SSL 加密)
-xu USERNAME 可选 SMTP 认证用户名(通常是发件人邮箱完整地址) -xu wshs1117@126.com 公共邮箱(126/QQ) 必须填写,否则无法通过认证
-xp PASSWORD 可选 SMTP 认证密码 / 授权码(公共邮箱需用授权码,而非登录密码) -xp LTZFDDIVDRNYOOAL 授权码需在邮箱后台开启 SMTP 后生成
-a FILE [FILE ...] 可选 邮件附件(多个附件用空格分隔) -a file1.txt /data/file2.pdf 附件路径需写绝对路径, 避免找不到文件
-cc ADDRESS [ADDR ...] 可选 抄送地址(多个抄送地址用空格分隔) -cc admin@test.com 抄送地址会被所有 收件人看到
-bcc ADDRESS [ADDR ...] 可选 暗抄送地址(多个暗抄送地址用空格分隔) -bcc secret@test.com 暗抄送地址不会被其他 收件人看到
-o OPTION=VALUE 可选 自定义选项(格式必须是「选项名 = 值」,多个 - o 分开写) -o tls=yes -o message-charset=utf-8 1. tls=yes:启用加密; 2. message-charset=utf-8: 解决中文乱码
bash 复制代码
在服务端安装邮件环境
apt-get install libio-socket-ssl-perl libnet-ssleay-perl sendemail -y

测试
sendemail -f 发送方_email -t 收件方_email -u "email测试" -m "sendemail命令使用测试" -s smtp.126.com -o message-charset=utf-8 -o tls=yes -xu 发件人邮箱 -xp 你的授权码 -a append_file.txt 

查看邮件配置文件目录路径
grep AlertSc /etc/zabbix/zabbix_server.conf
### Option: AlertScriptsPath
# AlertScriptsPath=/usr/lib/zabbix/alertscripts    #目录路径

定制脚本内容

bash 复制代码
vim /usr/lib/zabbix/alertscripts/sendmail.sh
#!/bin/bash
# **********************************************************
# * 功能: 定制邮件发送脚本
# * 作者: lty
# **********************************************************
# 定制基础环境变量
email_send='你自己的.com'
email_receive=$1
email_subject=$2
email_message=$3
email_passwd='你的授权码'
smtp_server='smtp.qq.com'    #其他的smtp.129.com类似
# 定制发送邮件逻辑
if [ $# -eq 3 ]              #检查是否刚好传入 3 个参数
then
    /usr/bin/sendemail -f $email_send -t $email_receive -u $email_subject -m $email_message -s $smtp_server -o message-charset=utf-8 -o tls=yes -xu $email_send -xp $email_passwd
fi

测试
root@ubuntu10:/usr/lib/zabbix/alertscripts  ./sendmail.sh 你自己的邮箱 "test" "hello world"
Jan 05 16:20:54 ubuntu10 sendemail[6780]: Email was sent successfully!
(1)告警媒介
1)电子邮件

可以用自带的也可以自己创建一个自定义

不推荐Type的属性为Email,因为它受到smtp服务器与我们zabbix平台的限制比较多,经常

发生各种异常报错,我这里就遇到了:

failed to send email: Failure when receiving data from the peer

2)脚本

所以最好还是用前面写好的脚本

(2)设定用户组和用户

可以根据不用BU的工作权限不同来自定义

创建用户

(3)告警动作

我这里用的是脚本必须定制消息内容不然无法发送消息

事件恢复

测试

bash 复制代码
root@ubuntu11:~  redis-cli
(4)告警升级

思路:

关于告警升级主要有两个思路:

1 问题在没有指定的时间里结束,就向高一级人员发出通知。

  • 要点,高一级的人,也要接收低级别的信息

2 根据问题的不同级别,向不同的人发送告警通知

  • 多来几个trigger action 即可

定制方法与前一节实践流程一致,

  • 要点在于,不同的人员只能接收指定级别的告警通知

再创建两个用户并加入到群组中

修改Action

恢复可以给这个群组下的所有人

测试

2.微信告警

关于企业微信告警:

需要准备的资料:

企业id

部门id

应用id

secret key

需要通过令牌(token)与微信服务器进行通信

获取token:

bash 复制代码
curl -H "Content-Type: application/json" -d '{
  "corpid": "【企业微信的企业ID,替换为你自己的企业ID】", 
  "corpsecret": "【企业微信应用的秘钥,替换为你创建的应用的Secret】"
}' https://qyapi.weixin.qq.com/cgi-bin/gettoken

访问测试

bash 复制代码
curl -H "Content-Type: application/json" -d '{
  "toparty": "【接收消息的部门ID,替换为你的企业微信部门ID】", 
  "msgtype": "text",  # 消息类型:固定为text(文本消息),无需修改
  "agentid": "【企业微信应用ID,替换为你创建的告警应用的AgentID】", 
  "text": {
    "content": "【告警内容,替换为Zabbix实际告警信息(如主机、状态、时间等)】"
  }, 
  "safe": "0"  # 消息安全级别:0=不加密(默认),1=加密,无需修改
}' https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=【接口调用凭证,替换为通过gettoken获取的有效access_token】

3.钉钉告警

与微信告警的逻辑相差不大

其中有钉钉自带的消息过滤的功能:

关键字和加签(相当于要一个密码);如果两个都勾选的话,那就是 并集关系,如果取消自定义关键词,就不再受内容限制了

加签校验的特点在于: 基于时间戳的会话认证,所以我们要基于加签的信息,生成配套的时间戳和base64的秘钥生成,最后与我们的token生成标准的url地址

(四)故障自愈-nginx

在Zabbix agent和Zabbix proxy上,远程命令默认是不开启的,它们可以通过以下方式启用:

bash 复制代码
root@ubuntu11:~  vim /etc/zabbix/zabbix_agentd.conf
#
AllowKey=system.run[*]         # 新版没有该属性,可以在agent配置中添加
# DenyKey=system.run[*]        # 新版有该属性,可以根据该属性的样式配置AllowKey的属性
# EnableRemoteCommands=1       # 开启远程执行命令,此指令在zabbix5.0版本以上淘汰
UnsafeUserParameters=1         #允许远程执行命令的时候使用不安全的参数(特殊字符串,如:
                               # \ ' * ? [] {} ~ $ ! & ; ( ) < > 等 )
                               # 1表示允许,默认为0不允许

重启
root@ubuntu11:~  systemctl restart zabbix-agent.service 

1. 环境配置-zabbix服务账号

一般情况下,我们推荐采用sudo方式

bash 复制代码
root@ubuntu11:~  vim /etc/sudoers
......
# User privilege specification
root    ALL=(ALL:ALL) ALL
zabbix ALL=(ALL) NOPASSWD: ALL     # NOPASSWD: 后面存在空格

检查语法
root@ubuntu11:~  visudo -c
/etc/sudoers:解析正确
/etc/sudoers.d/README:解析正确

测试
root@ubuntu11:~  su -s /bin/bash zabbix -c "sudo systemctl restart redis"
root@ubuntu11:~  systemctl status redis
● redis-server.service - Advanced key-value store
     Loaded: loaded (/usr/lib/systemd/system/redis-server.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-01-05 19:08:40 CST; 21s ago

2.自愈的环境部署

Zabbix 6.0+ 版本需要将执行的故障自愈脚本事先创建出来,才能创建下面的故障自愈的动作

环境部署

bash 复制代码
[root@openeuler20 ~]  systemctl disable --now firewalld.service
[root@openeuler20 ~]  getenforce 
Disabled

在openeuler 主机上部署nginx环境

bash 复制代码
yum install nginx net-tools -y

启动服务
[root@openeuler20 ~]  systemctl start nginx
[root@openeuler20 ~]  systemctl enable nginx.service

zabbix软件源的选择,参考rocky9系统

bash 复制代码
[root@openeuler20 ~]  rpm -Uvh https://repo.zabbix.com/zabbix/7.0/centos/9/x86_64/zabbix-
[root@openeuler20 ~]  dnf clean all 
[root@openeuler20 ~]  dnf install zabbix-agent 

修改zabbix agent的配置

bash 复制代码
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.10           # 设定zabbix server地址
Hostname=10.0.0.20         # 设定自己的主机名字
Include=/etc/zabbix/zabbix_agentd.d/*.conf

重启服务

bash 复制代码
systemctl enable --now zabbix-agent

在server中测试

bash 复制代码
root@ubuntu10:  zabbix_get -s 10.0.0.20 -p 10050 -k "net.tcp.listen[80]"
1
root@ubuntu10:  zabbix_get -s 10.0.0.20 -p 10050 -k "net.tcp.listen[81]"
0

定制sudo配置

bash 复制代码
[root@openeuler20 ~]  vim /etc/sudoers
##
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
zabbix ALL=(ALL) NOPASSWD: ALL

语法
[root@openeuler20 ~]# visudo -c
/etc/sudoers:解析正确

测试
[root@openeuler20 ~]   su -s /bin/bash zabbix -c "sudo systemctl restart nginx"    #可以用普通用户执行命令
[root@openeuler20 ~]  systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
     Active: active (running) since Mon 2026-01-05 19:38:54 CST; 9s ago

暂时停止
systemctl stop nginx

3.zabbix界面操作

添加主机

创建一个监控项-主机方式

创建一个监控项-模板方式

定制触发器

定制策略

点击 告警-脚本-创建脚本,按照如下方式创建一个故障自愈脚本

定制告警动作

注意:告警动作生效的作用范围,仅限于 设置完成后发生的问题,历史发生的,或者正在发生的问题,不管用

测试

整体过程:

1、nginx环境

2、sudo动作配置设定

3、item(主机、模板)

4、item关联的触发器

5、zabbix脚本

6、触发器动作(触发器和zabbix脚本关联)

(六)主动监控

被动模式(默认):

由zabbix server向zabbix agent发出指令获取数据,即zabbix agent被动的去获取数据并返回给zabbix server,这也是默认的工作方式。

主动模式:

zabbix agent主动采集数据并返回给zabbix server,不再需要zabbix serve进行干预,因此主动模式在一定程度上可减轻zabbix server的压力。

zabbix server 为了能够识别接收数据的对象,所以在添加主机的时候,必须指定客户端的HostName的属性名为监控主机的名称 -- 我不是什么钱都收的,乱收钱是要被双规的。
所谓的主动模式,指的是zabbix_agentd 主动提交数据到 zabbix_server ,所以我们需要在客户端 进行定制,这里面只需要设定一个属性即可:
ServerActive=

server主机需要有一个hostname主机条目来判定谁是小弟

纯主动监控方式

用rocky-9-10.0.0.31主机来实验

官网教程:https://www.zabbix.com/cn/download?zabbix=7.0&os_distribution=rocky_linux&os_version=9&components=agent&db=&ws=

跟随教程安装即可

配置10.0.0.31的zabbix_agent

bash 复制代码
vim /etc/zabbix/zabbix_agentd.conf

grep -Ev '#|^$' /etc/zabbix/zabbix_agentd.conf
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.10
StartAgents=0              # agent数量调整为0,这个调整之后 Server= 就不管用了,因为不接收了
ServerActive=10.0.0.10     # 指定服务端地址
Hostname=10.0.0.31         # 指定个人身份标识
Include=/etc/zabbix/zabbix_agentd.d/*.conf

重启
systemctl restart zabbix-agent.service

server的zabbix页面中去添加主机

成功

1.自动监控

自动注册和自动发现都是要在主动监控的情况下去实现

基本思路

1 客户端主动向服务端发送监控数据

2 服务端设定自动注册的动作

  • 使用主机发送的 主机元数据

  • 定制其他关联操作

(1)这里我再让ubuntu-10.0.0.11也主动
bash 复制代码
root@ubuntu11:~  vim /etc/zabbix/zabbix_agentd.conf

root@ubuntu11:~  grep -Ev '#|^$' /etc/zabbix/zabbix_agentd.conf
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
AllowKey=system.run[*]
Server=10.0.0.10
StartAgents=0
ServerActive=10.0.0.10
Hostname=10.0.0.11
  UnsafeUserParameters=1
Include=/etc/zabbix/zabbix_agentd.d/*.conf
(2)定制自动注册

点击 告警-动作-自动注册动作,进入到自动注册的界面

2.自动发现

编辑配置文件,让它支持主动和被动模式

bash 复制代码
[root@rocky31 ~]  vim /etc/zabbix/zabbix_agentd.conf 
[root@rocky31 ~]  grep -Ev '#|^$' /etc/zabbix/zabbix_agentd.conf
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.10
ServerActive=10.0.0.10
Hostname=10.0.0.31
Include=/etc/zabbix/zabbix_agentd.d/*.conf
[root@rocky31 ~]  systemctl restart zabbix-agent.service
bash 复制代码
root@ubuntu11:~  vim /etc/zabbix/zabbix_agentd.conf
root@ubuntu11:~  grep -Ev '#|^$' /etc/zabbix/zabbix_agentd.conf
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.10
ServerActive=10.0.0.10
Hostname=10.0.0.11
Include=/etc/zabbix/zabbix_agentd.d/*.conf

成功

(七)分布式监控

核心组件(3 个关键角色)

Zabbix Server:主服务器,负责统一管理(配置、告警、数据展示)、存储最终的监控数据。

Zabbix Proxy:代理节点,部署在被监控的 "远程区域 / 机房",代替 Server 去采集本地设备的数据。

被监控设备:比如服务器、交换机等,和本地的 Proxy 通信,不用直接连 Server。

1.环境安装

架构

参考资料:https://www.zabbix.com/download?zabbix=7.0&os_distribution=rocky_linux&os_version=9&components=proxy&db=mysql&ws=

数据库安装(因为zabbix的源信息会与默认的软件源有些冲突,导致mysql无法安装,所以首先安装mysql)

bash 复制代码
[root@rocky30 ~]  yum install mariadb-server -y

注意:
    7.0版的zabbix支持的数据库环境版本环境:
        mariadb-server是 10.5.00-11.5.X 之间,过高和过低都不行
        MySQL/Percona是 8.0.30-9.0.X之间,过高和过低都不行

启动服务
[root@rocky30 ~]  systemctl enable --now mariadb

定制软件源

bash 复制代码
[root@rocky30 ~]  ls /etc/yum.repos.d/
bak  rocky-aliyun.repo  zabbix.repo  zabbix-tools.repo

如果存在epel.repo 文件则修改该文件
[epel]
...
excludepkgs=zabbix*

[root@rocky30 ~]  rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm

软件安装
[root@rocky30 ~]  yum install -y zabbix-proxy-mysql zabbix-sql-scripts zabbix-selinux-policy

配置数据库

bash 复制代码
[root@rocky30 ~]  mysql -uroot -p'123456'
MariaDB [(none)]> create database zabbix_proxy character set utf8mb4 collate utf8mb4_bin;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> create user zabbix@localhost identified by 'password';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> grant all privileges on zabbix_proxy.* to zabbix@localhost;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> set global log_bin_trust_function_creators = 1;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> quit;
Bye
[root@rocky30 ~]  mysql -uzabbix -ppassword -e "select user();"
+------------------+
| user()           |
+------------------+
| zabbix@localhost |
+------------------+

初始化数据库

bash 复制代码
cat /usr/share/zabbix-sql-scripts/mysql/proxy.sql | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix_proxy

修复数据库配置

bash 复制代码
set global log_bin_trust_function_creators = 0;

proxy主机禁止防火墙

bash 复制代码
[root@rocky30 ~]  systemctl disable --now firewalld.service

禁用SELINUX

bash 复制代码
[root@rocky30 ~]  sed -i 's/^SELINUX=e.*/SELINUX=disabled/'/etc/selinux/config
[root@rocky30 ~]  grep '^SELINUX' /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

重启主机
reboot

2.被动模式

proxy配置

bash 复制代码
[root@rocky30 ~]  vim /etc/zabbix/zabbix_proxy.conf
[root@rocky30 ~]  grep -Ev '#|^$' /etc/zabbix/zabbix_proxy.conf
ProxyMode=1
Server=10.0.0.10                # zabbix server端的地址
Hostname=Zabbix proxy
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
PidFile=/run/zabbix/zabbix_proxy.pid
SocketDir=/run/zabbix
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=password            # 修改密码信息
ProxyBufferMode=hybrid
ProxyMemoryBufferSize=16M
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1
Include=/etc/zabbix/zabbix_proxy.d/*.conf

开机自启动
[root@rocky30 ~]  systemctl enable --now zabbix-proxy

客户端配置

zabbix agent配置信息发送的目标主机

bash 复制代码
[root@rocky31 ~]  vim /etc/zabbix/zabbix_agentd.conf
[root@rocky31 ~]  grep '^Server' /etc/zabbix/zabbix_agentd.conf
Server=10.0.0.10,10.0.0.30                    #加入proxy的主机ip
ServerActive=10.0.0.10,10.0.0.30              #加入proxy的主机ip

重启
[root@rocky31 ~]  systemctl restart zabbix-agent.service
bash 复制代码
root@ubuntu11:~  vim /etc/zabbix/zabbix_agentd.conf 

root@ubuntu11:~  grep -Ev '#|^$' /etc/zabbix/zabbix_agentd.conf 
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
AllowKey=system.run[*]
Server=10.0.0.10,10.0.0.30                    #加入proxy的主机ip
ServerActive=10.0.0.10,10.0.0.30              #加入proxy的主机ip
Hostname=10.0.0.11
  UnsafeUserParameters=1
Include=/etc/zabbix/zabbix_agentd.d/*.conf

重启
systemctl restart zabbix-agent.service

服务端10.0.0.10配置

zabbix server 主机配置与proxy主机的信息同步

bash 复制代码
root@ubuntu10:~  vim /etc/zabbix/zabbix_server.conf
root@ubuntu10:~  grep -Ev '#|^$' /etc/zabbix/zabbix_server.conf 
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/run/zabbix/zabbix_server.pid
SocketDir=/run/zabbix
DBName=zabbix
DBUser=zabbix
DBPassword=password
JavaGateway=10.0.0.11
JavaGatewayPort=10052
StartJavaPollers=20
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000
StartProxyPollers=10                # 启动多少进程与代理进行通信
ProxyConfigFrequency=10             # 被动模式下,server多长时间与proxy同步一次信息
ProxyDataFrequency=5                # 被动模式下,server多长时间与proxy获取一次数据
StatsAllowedIP=127.0.0.1
EnableGlobalScripts=0
Include=/etc/zabbix/zabbix_server.d/*.conf

重启
systemctl restart zabbix-server.service

StartProxyPollers:

此配置项用于设定 Zabbix 服务器启动的代理轮询器(Proxy Pollers)进程数量。代理轮询器负责与 Zabbix 代理(Proxy)进行通信,从代理那里收集监控数据。将其设置为 10,意味着 Zabbix 服务器会启动 10 个代理轮询器进程,以此提升与代理通信以及数据收集的效率。

ProxyConfigFrequency:

该配置项确定了 Zabbix 服务器向 Zabbix 代理发送配置数据的频率,单位是秒。设置为 10 表示Zabbix 服务器每 10 秒向代理发送一次最新的配置信息,这样代理就能及时获取最新的监控任务和规则。

ProxyDataFrequency:

它规定了 Zabbix 服务器从 Zabbix 代理收集监控数据的频率,单位同样是秒。设置为 5 意味着Zabbix 服务器每 5 秒从代理收集一次监控数据,以保证监控数据的及时性。

zabbix界面配置

添加主机

3.主动模式

调整proxy的管理模式为 主动模式

bash 复制代码
[root@rocky30 ~]  vim /etc/zabbix/zabbix_proxy.conf
[root@rocky30 ~]# grep -Ev '#|^$' /etc/zabbix/zabbix_proxy.conf
ProxyMode=0
Server=10.0.0.10
Hostname=10.0.0.30                #这个地方的名字与下方zabbix管理界面中创建proxy中"Proxy代理地址"一致
......

重启
systemctl restart zabbix-proxy

修改代理的监控模式

添加主机

4.加密

Zabbix 使用传输层安全 (TLS) 协议 v.1.2 支持 Zabbix 服务器和代理之间的加密通信。 您可以使用基于证书和基于预共享密钥的加密 (PSK),我们这里使用 PSK来进行实践。

proxy生成秘钥

bash 复制代码
[root@rocky30 ~]  openssl rand -hex 32 > /etc/zabbix/zabbix_proxy.psk
[root@rocky30 ~]  cat /etc/zabbix/zabbix_proxy.psk
1341505e0477412ef3698271abca213269ce5b1fac453aa8790ab4e43a647318

proxy使用秘钥

bash 复制代码
配置秘钥
[root@rocky30 ~]  chown zabbix:zabbix /etc/zabbix/zabbix_proxy.psk
[root@rocky30 ~]  chmod 644 /etc/zabbix/zabbix_proxy.psk 

修改配置文件
[root@rocky30 ~]  vim /etc/zabbix/zabbix_proxy.conf
[root@rocky30 ~]  grep -Eni '^TLS' /etc/zabbix/zabbix_proxy.conf
761:TLSConnect=psk
773:TLSAccept=psk
824:TLSPSKIdentity=ZBX-PSK-01
832:TLSPSKFile=/etc/zabbix/zabbix_proxy.psk

重启
[root@rocky30 ~]  systemctl restart zabbix-proxy

zabbix界面配置

主机

六、zabbix的API接口

大多数API至少包含四种方法: get, create, update 和 delete ,分别是检索,创建,更新和删除数据,但是某些API提供一套完全不同的一组方法。

常用的内容:

user.login #用户登录

host.get(create|delete|update) #主机操作

hostgroup.get(create|delete|update) #主机组操作

item.get(create|delete|update) #监控项目操作

history.get #历史数据查询

event.get #事件查询

trigger.get #触发器查询

资源的操作涉及到的数据,遵循一个格式 JSON;这种风格的数据,获取精确的某个值,很方便

基于nginx软件部署的zabbix 的API地址 (默认情况下的)

http://${ZABBIX_SERVER}/api_jsonrpc.php

基于apache软件部署的zabbix 的API地址

http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php

官方教程:https://www.zabbix.com/documentation/7.0/zh/manual/api

(一)应用

基本环境

1.获取token

一旦您设置了前端,就可以使用远程 HTTP 请求来调用 API。为此,您需要发送 HTTP POST 请求到前端目录中的 api_jsonrpc.php 文件。

bash 复制代码
root@ubuntu10:~  curl --request POST \
  --url 'http://10.0.0.10/api_jsonrpc.php' \            #这是LNMP的写法,如果用的Apache的LAMP:--url 'http://10.0.0.10/zabbix/api_jsonrpc.php' \
  --header 'Content-Type: application/json-rpc' \
  --data '{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
      "username": "Admin",
      "password": "zabbix"
    },
    "id": 1
  }'
{"jsonrpc":"2.0","result":"d8a0584acae6c39fd16b590ceac62f7b","id":1}    #这是结果值
bash 复制代码
#!/bin/bash
# 功能:获取zabbix的token
# 作者:lty

# 定制基础环境变量
ZABBIX_SERVER='10.0.0.10'
ZABBIX_API="http://${ZABBIX_SERVER}/api_jsonrpc.php"

# 获取token的值
get_token(){
	local token_value=$(curl -s -X POST \
  -H "Content-Type: application/json-rpc" \
  -d '{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
      "username": "Admin",
      "password": "zabbix"
    },
    "id": 1
  }' "${ZABBIX_API}" | jq -r '.result')
	echo "${token_value}"
}

token_value=$(get_token)
echo "${token_value}"

2.获取主机列表

将获取的token信息定制成一个环境变量

bash 复制代码
root@ubuntu10:~  AUTHORIZATION_TOKEN="457150ecaa9832d4d0454c40a99b0e9e"
bash 复制代码
curl --request POST -s \
  --url "${ZABBIX_API}" \
  --header "Authorization: Bearer ${AUTHORIZATION_TOKEN}" \
  --header 'Content-Type: application/json-rpc' \
  -d '{
    "jsonrpc": "2.0",
    "method": "user.get",
    "params": {
      "output": "extend"
    },
    "id": 1
  }' | jq

或者用脚本

bash 复制代码
#!/bin/bash
# 功能:获取zabbix的username
# 作者:lty

# 定制基础环境变量
ZABBIX_SERVER='10.0.0.10'
ZABBIX_API="http://${ZABBIX_SERVER}/api_jsonrpc.php"

# 获取token的值
get_token(){
	local token_value=$(curl -s -X POST \
  -H "Content-Type: application/json-rpc" \
  -d '{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
      "username": "Admin",
      "password": "zabbix"
    },
    "id": 1
  }' "${ZABBIX_API}" | jq -r '.result')
	echo "${token_value}"
}

# 获取所有用户名
get_username_list(){
	#接受参数
	local token_value="$1"
	curl --request POST -s --url "${ZABBIX_API}" --header "Authorization: Bearer ${token_value}" --header 'Content-Type: application/json-rpc' -d '
	{
		"jsonrpc": "2.0",
		"method": "user.get",
		"params": {
			"output": "extend"
		},
		"id": 1
	}' | jq -r '.result[].username'
}

# 执行命令
token_value=$(get_token)
get_username_list "${token_value}"

关于zabbix API接口的总结

1、zabbix的api信息获取到地址

2、使用zabbix的登录信息,获取token

3、组合获取资源的请求

  • 获取的固定认证信息

  • 使用 xx 资源的对象数据格式

-d '接口数据格式 ------参考api'

七、zabbix高可用

可以使用Keepalived实现 Zabbix Server的高可用

从 Zabbix 6.0 版本开始,官方提供了高可用解决方案

https://www.zabbix.com/documentation/7.0/zh/manual/concepts/server/ha

https://www.zabbix.com/documentation/6.0/zh/manual/concepts/server/ha

https://www.zabbix.com/documentation/6.0/zh/manual/concepts/server/ha#implementation-details

(一)高可用环境

1.ubuntu24-10 部署HAproxy

HAProxy作为反向代理软件,相较于nginx来说,配置起来更加的简单,但是有一点需要注意:HAProxy可以通过不存在的ip地址,作为反向代理的入口。只不过需要让内核参数支持该功能

bash 复制代码
root@ubuntu10:~  echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
root@ubuntu10:~  sysctl -p
net.ipv4.ip_nonlocal_bind = 1
root@ubuntu10:~  sysctl -a | grep nonlocal
net.ipv4.ip_nonlocal_bind = 1
net.ipv6.ip_nonlocal_bind = 0

安装软件

bash 复制代码
apt install haproxy -y

定制配置

bash 复制代码
cat >>/etc/haproxy/haproxy.cfg <<-eof
frontend web_front
    bind 10.0.0.100:80
    default_backend web_back

backend web_back
    balance source
    server web01 10.0.0.10:8080 check
    server web02 10.0.0.11:8080 check

frontend db_front
    bind 10.0.0.200:3306
    mode tcp
    default_backend db_back

backend db_back
    balance source
    mode tcp
    server mysql01 10.0.0.31:3306 check
eof

启动服务

bash 复制代码
systemctl restart haproxy

2.ubuntu24-11 部署HAproxy

意:HAProxy可以通过不存在的ip地址,作为反向代理的入口。只不过需要让内核参数支持该功能

bash 复制代码
root@ubuntu11:~  echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
root@ubuntu11:~  sysctl -p
net.ipv4.ip_nonlocal_bind = 1
root@ubuntu11:~  sysctl -a | grep nonlocal
net.ipv4.ip_nonlocal_bind = 1
net.ipv6.ip_nonlocal_bind = 0

安装软件

bash 复制代码
apt install haproxy -y

定制配置

bash 复制代码
cat >>/etc/haproxy/haproxy.cfg <<-eof
frontend web_front
    bind 10.0.0.100:80
    default_backend web_back

backend web_back
    balance source
    server web01 10.0.0.10:8080 check
    server web02 10.0.0.11:8080 check

frontend db_front
    bind 10.0.0.200:3306
    mode tcp
    default_backend db_back

backend db_back
    balance source
    mode tcp
    server mysq101 10.0.0.31:3306 check

listen stats            #多了一个状态页面
    mode http
    bind 10.0.0.11:9999
    stats enable
    log global
    stats uri  /haproxy-status
    stats auth  haadmin:123456
eof

重启服务

bash 复制代码
systemctl restart haproxy

访问:http://10.0.0.11:9999/haproxy-status

3.ubuntu24-10 部署keepalived

bash 复制代码
apt install keepalived -y

定制文件

bash 复制代码
root@ubuntu10:~  cd /etc/keepalived/
root@ubuntu10:/etc/keepalived  ls
keepalived.conf.sample
root@ubuntu10:/etc/keepalived  mv keepalived.conf.sample keepalived.conf

定制配置

bash 复制代码
# 全局定义配置
global_defs {
    router_id ubuntu10       # 路由标识(唯一)
    script_user root            # 脚本执行用户
    enable_script_security      # 启用脚本安全限制
}

# 定义haproxy健康检查脚本
vrrp_script check_haproxy {
    script "/usr/bin/killall -0 haproxy"  # 检查haproxy进程是否存在
    interval 2                            # 检查间隔(秒)
    fall 2                                # 连续2次失败判定为异常
    rise 2                                # 连续2次成功判定为恢复
}

# Web VIP 实例(MASTER节点)
vrrp_instance web_vip {
    state MASTER                          # 节点角色(主节点)
    interface ens33                       # 绑定的网卡
    virtual_router_id 51                  # 虚拟路由ID(同一组需一致,范围0-255)
    priority 100                          # 优先级(值越高越优先成为主)
    nopreempt                             # 禁用抢占模式
    advert_int 1                          # VRRP通告间隔(秒)

    # 认证配置
    authentication {
        auth_type PASS                    # 认证类型(密码)
        auth_pass secret123               # 认证密码(同一组需一致)
    }

    # 虚拟IP(VIP)
    virtual_ipaddress {
        10.0.0.100                        # Web服务的VIP
    }

    # 关联健康检查脚本
    track_script {
        check_haproxy
    }
}

# DB VIP 实例(BACKUP节点)
vrrp_instance db_vip {
    state BACKUP                          # 节点角色(备节点)
    interface ens33                       # 绑定的网卡
    virtual_router_id 52                  # 虚拟路由ID(与web_vip不同)
    priority 90                           # 优先级(低于主节点)
    nopreempt                             # 禁用抢占模式
    advert_int 1                          # VRRP通告间隔(秒)

    # 认证配置
    authentication {
        auth_type PASS                    # 认证类型(密码)
        auth_pass secret456               # 认证密码(同一组需一致)
    }

    # 虚拟IP(VIP)
    virtual_ipaddress {
        10.0.0.200                        # DB服务的VIP
    }

    # 关联健康检查脚本
    track_script {
        check_haproxy
    }
}
bash 复制代码
重启服务
root@ubuntu10:/etc/keepalived  systemctl restart keepalived.service 
root@ubuntu10:/etc/keepalived  ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:d9:c1:90 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 10.0.0.10/24 brd 10.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 10.0.0.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 10.0.0.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::bc99:a81f:3743:b509/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

4.ubuntu24-11 部署keepalived

前面和10.0.0.10主机一样

bash 复制代码
# Keepalived 配置文件(ubuntu11 节点)
# 作用:为 haproxy 提供 VIP 高可用(web_vip 为备、db_vip 为主)

# 全局配置段
global_defs {
    router_id ubuntu11       # 节点唯一标识(区分不同 Keepalived 节点)
    script_user root            # 执行监控脚本的用户
    enable_script_security      # 启用脚本安全限制(防止不安全脚本执行)
}

# haproxy 进程健康检查脚本定义
vrrp_script check_haproxy {
    script "/usr/bin/killall -0 haproxy"  # 检查 haproxy 进程是否存活(killall -0 仅检测进程,不发送信号)
    interval 2                            # 检查间隔:2秒
    fall 2                                # 连续2次检查失败 → 判定进程异常
    rise 2                                # 连续2次检查成功 → 判定进程恢复
}

# Web 服务 VIP 实例(本节点为备节点)
vrrp_instance web_vip {
    state BACKUP                          # 节点角色:备节点(BACKUP)
    interface ens33                       # 绑定的网卡接口(需与本机实际网卡一致)
    virtual_router_id 51                  # VRRP 组 ID(与主节点保持一致,范围 0-255)
    priority 90                           # 优先级(低于主节点的 100,不会抢占)
    nopreempt                             # 禁用抢占模式(备节点不会主动抢占主节点)
    advert_int 1                          # VRRP 通告发送间隔:1秒

    # 认证配置(同组节点需一致)
    authentication {
        auth_type PASS                    # 认证类型:密码认证
        auth_pass secret123               # 认证密码(需与主节点保持一致)
    }

    # 虚拟 IP(VIP)配置
    virtual_ipaddress {
        10.0.0.100                        # Web 服务的 VIP 地址
    }

    # 关联健康检查脚本(监控 haproxy)
    track_script {
        check_haproxy
    }
}

# DB 服务 VIP 实例(本节点为主节点)
vrrp_instance db_vip {
    state MASTER                          # 节点角色:主节点(MASTER)
    interface ens33                       # 绑定的网卡接口
    virtual_router_id 52                  # VRRP 组 ID(与备节点保持一致)
    priority 100                          # 优先级(高于备节点的 90,优先成为主)
    nopreempt                             # 禁用抢占模式(主节点恢复后不抢占)
    advert_int 1                          # VRRP 通告发送间隔:1秒

    # 认证配置(同组节点需一致)
    authentication {
        auth_type PASS                    # 认证类型:密码认证
        auth_pass secret456               # 认证密码(需与备节点保持一致)
    }

    # 虚拟 IP(VIP)配置
    virtual_ipaddress {
        10.0.0.200                        # DB 服务的 VIP 地址
    }

    # 关联健康检查脚本(监控 haproxy)
    track_script {
        check_haproxy
    }
}

重启服务

bash 复制代码
root@ubuntu11:/etc/keepalived  systemctl restart keepalived.service 
root@ubuntu11:/etc/keepalived  ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:05:fc:21 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 10.0.0.11/24 brd 10.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 10.0.0.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::e2c9:2787:8c41:8562/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

(二)mysql环境

10.0.0.31因为是Rocky环境,所以保证Selinux和firewalld服务禁用

安装mysql环境

bash 复制代码
[root@rocky31 ~]  yum install mysql-server -y
[root@rocky31 ~]  mkdir -pv /data/mysql/logbin
mkdir: 已创建目录 '/data'
mkdir: 已创建目录 '/data/mysql'
mkdir: 已创建目录 '/data/mysql/logbin'
[root@rocky31 ~]  chown -R mysql:mysql /data/mysql/

定制配置

bash 复制代码
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
# 增加下面三行
server-id=15
log-bin=/data/mysql/logbin/mysql-bin
default_authentication_plugin=mysql_native_password
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid

启动服务
systemctl start mysqld.service

配置数据库

bash 复制代码
[root@rocky31 ~]  mysql

mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;    #创建 Zabbix 专属数据库
Query OK, 1 row affected (0.00 sec)

mysql> create user zabbix@'10.0.0.%' identified by 'password';        #创建 Zabbix 数据库用户
Query OK, 0 rows affected (0.01 sec)

mysql> grant all privileges on zabbix.* to zabbix@'10.0.0.%';         #授予 Zabbix 数据库的全权限 
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT SUPER ON *.* TO zabbix@'10.0.0.%';                    #授予 SUPER 超级权限
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> set global log_bin_trust_function_creators = 1;             #开启函数创建信任开关
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> quit;
Bye
bash 复制代码
确认有无epel源
[root@rocky31 ~] ls /etc/yum.repos.d/
bak  rocky-aliyun.repo  zabbix.repo  zabbix-tools.repo

安装软件源

bash 复制代码
[root@rocky31 ~]  rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm

安装软件

bash 复制代码
yum install -y zabbix-sql-scripts
[root@rocky31 ~]  rpm -ql zabbix-sql-scripts | grep sql.g
/usr/share/zabbix-sql-scripts/mysql/server.sql.gz
/usr/share/zabbix-sql-scripts/postgresql/server.sql.gz

加载sql数据

bash 复制代码
[root@rocky31 ~]  zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -ppassword -h10.0.0.31 zabbix
mysql: [Warning] Using a password on the command line interface can be insecure.

还原数据库配置

bash 复制代码
[root@rocky31 ~]  mysql
mysql> set global log_bin_trust_function_creators = 0;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> exit
Bye

(三) zabbix高可用

1.ubuntu24-10安装zabbix

获取最新版本的软件源

bash 复制代码
root@ubuntu10:~ wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb
root@ubuntu10:~ dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb
root@ubuntu10:~ apt update

安装zabbix server 和 前端工具以及代理agent

bash 复制代码
root@ubuntu10:~  apt install -y zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-agent

删除默认的nginx首页配置文件

bash 复制代码
root@ubuntu10:~  rm -f /etc/nginx/sites-enabled/default

定制zabbix的配置文件

bash 复制代码
vim /etc/nginx/conf.d/zabbix.conf
server {
        listen 8080;
        ...
解析:
定制http配置段内部默认的server配置段属性

修改php配置

bash 复制代码
cat >> /etc/zabbix/php-fpm.conf <<-eof
php_value[date.timezone] = Asia/Shanghai
eof

定制zabbix 配置

bash 复制代码
root@ubuntu10:~  vim /etc/zabbix/zabbix_server.conf
root@ubuntu10:~  grep -Ev '#|^$' /etc/zabbix/zabbix_server.conf
SourceIP=10.0.0.100                # 前面vip中配置的地址
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/run/zabbix/zabbix_server.pid
SocketDir=/run/zabbix
DBHost=10.0.0.200                  # 必须开启,因为默认使用的localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password                # 定制密码
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1
EnableGlobalScripts=0
HANodeName=ubuntu10                # 主机名
NodeAddress=10.0.0.10:10051        # 高可用的两个属性
Include=/etc/zabbix/zabbix_server.d/*.conf
bash 复制代码
root@ubuntu10:~  vim /etc/zabbix/zabbix_agentd.conf
root@ubuntu10:~  grep -Ev '#|^$' /etc/zabbix/zabbix_agentd.conf
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=127.0.0.1,10.0.0.10
ServerActive=127.0.0.1,10.0.0.10
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agentd.d/*.conf

重启服务

bash 复制代码
root@ubuntu10:~  systemctl restart zabbix-server zabbix-agent nginx php8.3-fpm
root@ubuntu10:~  systemctl enable zabbix-server zabbix-agent nginx php8.3-fpm

2.ubuntu24-11安装zabbix

获取最新版本的软件源

bash 复制代码
root@ubuntu11:~ wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb
root@ubuntu11:~ dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb
root@ubuntu11:~ apt update

安装zabbix server 和 前端工具以及代理agent

bash 复制代码
root@ubuntu11:~  apt install -y zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-agent

删除默认的nginx首页配置文件

bash 复制代码
root@ubuntu11:~  rm -f /etc/nginx/sites-enabled/default

定制zabbix的配置文件

bash 复制代码
vim /etc/nginx/conf.d/zabbix.conf
server {
        listen 8080;
        ...
解析:
定制http配置段内部默认的server配置段属性

修改php配置

bash 复制代码
cat >> /etc/zabbix/php-fpm.conf <<-eof
php_value[date.timezone] = Asia/Shanghai
eof

定制zabbix 配置

bash 复制代码
root@ubuntu11:/etc/keepalived  grep -Ev '#|^$' /etc/zabbix/zabbix_server.conf
SourceIP=10.0.0.100
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/run/zabbix/zabbix_server.pid
SocketDir=/run/zabbix
DBHost=10.0.0.200
DBName=zabbix
DBUser=zabbix
DBPassword=password 
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1
EnableGlobalScripts=0
HANodeName=ubuntu11
NodeAddress=10.0.0.11:10051
Include=/etc/zabbix/zabbix_server.d/*.conf
bash 复制代码
root@ubuntu11:/etc/keepalived  grep -Ev '#|^$' /etc/zabbix/zabbix_agentd.conf
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=127.0.0.1,10.0.0.11
ServerActive=127.0.0.1,10.0.0.11
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agentd.d/*.conf

3.web配置

访问10.0.0.100

相关推荐
不做菜鸟的网工4 天前
Zabbix收集H3C交换机实时配置命令 「SNMP TRAP」
zabbix
肖祥5 天前
docker安装zabbix7.4
zabbix
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习