记录一下学习日常⑨(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

相关推荐
saoys2 小时前
Opencv 学习笔记:文字图像预处理(二值化 + 闭运算优化)
笔记·opencv·学习
wdfk_prog2 小时前
[Linux]学习笔记系列 -- compiler
linux·笔记·学习
星火开发设计2 小时前
从公式到应用:卷积公式全面解析与实战指南
学习·算法·机器学习·概率论·知识·期末考试·卷积公式
实战项目2 小时前
云原生中间件的消息队列性能优化
学习
咒法师无翅鱼2 小时前
【西电机器学习】学习笔记(基础部分)
笔记·学习
光羽隹衡2 小时前
机器学习——词向量转化和评论判断项目分析
人工智能·学习·机器学习
专注于大数据技术栈2 小时前
java学习--LinkedList
java·开发语言·学习
实战项目2 小时前
基于Wi-Fi 6的物联网多设备连接
学习
秋深枫叶红2 小时前
嵌入式第四十六篇——51单片机基础——UART通信
嵌入式硬件·学习·51单片机