一、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 显示
bashansible-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
- Role 是 Ansible 的模块化工具,把 "一个功能" 的代码打包成独立 "工具包",解决单文件 Playbook 臃肿、无法复用的问题;
- Role 有固定目录结构,主要关注
tasks/(任务)、vars/(变量)、templates/(模板)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 网关对数据包目标地址转换,使远程用户看似在专用网络内访问资源 。
部署流程:
准备阿⾥云主机,其中⼀台配置公⽹IP
在阿⾥云安全组中放⾏ 1194 端⼝
在有公⽹IP的阿⾥云主机上部署 OpenV Server
在 Magedu 内⽹主机上部署 OpenV Client
测试 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:
bashcurl -H "Content-Type: application/json" -d '{ "corpid": "【企业微信的企业ID,替换为你自己的企业ID】", "corpsecret": "【企业微信应用的秘钥,替换为你创建的应用的Secret】" }' https://qyapi.weixin.qq.com/cgi-bin/gettoken访问测试
bashcurl -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主机来实验
跟随教程安装即可
配置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.环境安装
架构

数据库安装(因为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



