2024广东省职业技能大赛云计算赛项实战——Ansible部署Zabbix

Ansible部署Zabbix

前言

今年的比赛考了一道Ansible部署Zabbix的题目,要求就是用两台centos7.5的云主机,一台叫ansible,一台叫node,使用对应的软件包,通过ansible节点控制node节点安装zabbix服务。这道题还是算比较简单的题,不过也是有坑就是了。

Ansible 是一个开源的自动化工具,用于配置管理、应用程序部署、任务自动化和 IT 编排,可以简化和自动化繁琐的运维任务。

关于zabbix的了解和基础的搭建,我在这篇文章中有讲:1+X云计算运维与开发(中级)实战案例------Zabbix分布式监控系统搭建_实战案例------zabbix 分布式监控系统-CSDN博客

不了解的可以去看看,看完你就会发现Ansible部署Zabbix根本没有难点,主要就是避坑。

虚拟机使用的是自行创建的CentOS7,如果你不会,那虚拟机创建的流程可以参考我这篇文章:职业技能大赛云计算赛项实战------OpenStack搭建-CSDN博客

需要的镜像Centos7.5为CentOS-7-x86_64-DVD-1804.iso,可从阿里镜像站下载:centos-vault-7.5.1804-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com)

因为我没有镜像,也没那么多流量下载,所以我用7.4的CentOS-7-x86_64-DVD-1708替代需要用到的软件包:https://pan.baidu.com/s/1y9OckLD3HmIq40g_y-XYbQ?pwd=2s9q

提取码:2s9q

我为什么说这道题坑呢,因为当时我还没有想到把里面的文件搞到本地的方法,只能在他们那个平台做这道题,题目要求用7.5的云主机,而那个平台申请的主机全是7.9的。这就导致在后面安装软件包时出现依赖关系错误,比如安装zabbix需要php的版本为5.4.16-46,虽然在软件包里携带的zabbix软件仓库有,但7.9的系统源的版本是5.4.16-48,安装时系统默认安装更高版本的,又比如mariadb,需要的版本是5.5.56-2,但7.9的版本更高,是1:5.5.68-1,同时系统还默认安装了更高版本的mariadb-libs。最后我是通过指定7.5的系统源,再把mariadb-libs删掉做出来的。

7.5的系统源里,php的版本是5.4.16-45,mariadb则一样,是5.5.56-2,安装时默认安装最新版本,不会影响到过程

我用7.4的替代,php的版本更低,是php-5.4.16-42,也不会影响

节点规划如下:

主机名 IP/24 节点
ansible 192.168.100.21 ansible节点
node 192.168.100.22 node节点

操作过程

更改主机名

shell 复制代码
#两个节点修改好主机名
[root@localhost ~]# hostnamectl set-hostname ansible
[root@localhost ~]# bash
[root@ansible ~]# 

[root@localhost ~]# hostnamectl set-hostname node
[root@localhost ~]# bash
[root@node ~]# 

上传软件包

将我提供的软件包上传至ansible节点

解压软件包

shell 复制代码
#ansible包含了安装ansible的软件包以及依赖,我们把ansbile的软件仓库解压至/opt目录
[root@ansible ~]# tar -zxf ansible.tar.gz -C /opt
[root@ansible ~]# ls /opt/ansible/
packages  repodata
#install_zabbix.tar.gz是ansible执行任务需要用到的文件,我们把它解压到主目录即可
[root@ansible ~]# tar -zxf install_zabbix.tar.gz
[root@ansible ~]# ls install_zabbix
group_vars  install_zabbix.yaml  roles
[root@ansible ~]# ls install_zabbix/roles/zabbix/
files  handlers  meta  tasks  templates  vars
[root@ansible ~]# ls install_zabbix/roles/zabbix/files/
yum.repo  zabbix.tar.gz
#files目录存放着需要复制到目标节点的静态文件,这里包含仓库文件yum.repo和zabbix的软件包及其依赖包的压缩包,它们将在执行任务时被直接复制到node节点上
#handlers目录存放着处理器(handlers)任务,处理器会在特定条件下触发,通常用于重启服务或执行其他操作,这道题还用不到它
#meta目录包含角色的元数据,如依赖关系和其他角色相关信息,同样用不到
#tasks目录包含角色的主要任务列表,定义了角色需要执行的各种操作和配置步骤
#templates目录存放着Jinja2模板文件,这些模板可以在运行时渲染成目标节点上的配置文件,使得配置文件可以根据变量或条件动态生成
#vars目录包含角色范围内的变量,这些变量可以被任务和模板引用,用于参数化配置和操作,这里是被group_vars目录里的all文件替代了,我们也用不到

配置YUM源

shell 复制代码
#删除系统自带源
[root@ansible ~]# rm -rf /etc/yum.repos.d/*
#创建新的仓库文件
[root@ansible ~]# vi /etc/yum.repos.d/local.repo
[ansible]
name=ansible
baseurl=file:///opt/ansible
gpgcheck=0
enabled=1
#检查可用性
[root@ansible ~]# yum clean all && yum repolist
源标识                                源名称                                状态
ansible                               ansible                               22
repolist: 22
#安装ansible
[root@ansible ~]# yum -y install ansible

配置主机映射

shell 复制代码
#编辑系统的主机映射文件
[root@ansible ~]# cat >> /etc/hosts << EOF
> 192.168.100.21 ansible
> 192.168.100.22 node
> EOF
#编辑ansible的主机清单文件,可以说是ansible的主机映射文件
#我们定义一个zabbix的主机组,把node节点的ip写上
[root@ansible ~]# cat >> /etc/ansible/hosts << EOF
> [zabbix]
> 192.168.100.22
> EOF

配置免密登录

shell 复制代码
#执行ansible剧本的时候需要远程连接主机,所以我们配置ssh免密登录
[root@ansible ~]# ssh-keygen 
...
Enter file in which to save the key (/root/.ssh/id_rsa):#回车
...
Enter passphrase (empty for no passphrase):#回车
...
Enter same passphrase again:#回车
...
#将公钥复制给node节点
[root@ansible ~]# ssh-copy-id root@node
...
Are you sure you want to continue connecting (yes/no)? yes
...
root@node's password: #输入node节点密码

配置node节点

shell 复制代码
#我们做一下node节点的环境准备
#挂载好node节点的系统源
#先创建给挂载目录
[root@node ~]# mkdir /opt/centos
#挂载系统镜像
[root@node ~]# mount -o loop /dev/sr0 /opt/centos
#如果你是使用CentOS-7-x86_64-DVD-2009.iso镜像,在7.9的系统进行本实验的话,你还需要删掉系统自带的mariadb-libs,因为它的版本太高了:yum -y remove mariadb-libs

完善脚本

这道题简单的一部分原因就是我们不用从头写剧本,提供给我们的软件包已经写好了大部分,我们只需要补充关键部分即可。

shell 复制代码
#我们回到ansible节点,把ansible的文件完善一下
[root@ansible ~]# cd install_zabbix
[root@ansible install_zabbix]# 
#all文件是全局变量文件,可以通过设置值,写剧本的时候用变量替代,这里写个数据库密码的变量就行了,数据库主机名的变量没必要,就模板文件有一处用到,我们直接删掉。
[root@ansible install_zabbix]# vi group_vars/all 
DB_PASS: zabbix
#变量和值直接有空格,看清楚了
#yum.repo文件是后面我们要传给node节点的仓库文件
[root@ansible install_zabbix]# vi roles/zabbix/files/yum.repo 
[zabbix]
name=zabbix
baseurl=
gpgcheck=0
enabled=1
#我们把它补充好:
[root@ansible install_zabbix]# vi roles/zabbix/files/yum.repo 
[zabbix]
name=zabbix
baseurl=file:///root/zabbix
gpgcheck=0
enabled=1
[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
shell 复制代码
#main文件是我们安装zabbix的任务列表
[root@ansible install_zabbix]# vi roles/zabbix/tasks/main.yaml 
---
	###
  - name: selinux config
    shell: "{{item}}"
    with_items:
      - sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config

  - name: Selinux Config Setenforce
    shell: getenforce
    register: info
    #执行getenforce命令查看Selinux的执行模式,并把值赋给info

  - name: when_Selinux
    shell: setenforce 0
    when: info['stdout'] == 'Enforcing'
    #当info的值为Enforcing时,执行setenforce 0命令临时关闭selinux

  - name: firewalld
    shell: systemctl stop firewalld && systemctl disable firewalld
    ignore_errors: yes
    ###这段是关闭防火墙和Selinux的操作,不需要我们补齐
    
	#通过name的描述我们可知这里是移动系统默认源的操作,需要我们补齐
  - name: mv yum config
    shell: mv     
	#这里是复制仓库文件的地方,需要我们补齐命令,把补充完整的yum.repo移过来
  - name: copy repo 
    copy: 
	#这里则是移动zabbix软件源压缩包的地方,需要我们补齐命令,把zabbix.tar.gz移过来
  - name: Copy Repo Tar
    copy: 
	#这里是解压zabbix.tar.gz的地方,需要我们补齐
  - name: Decompression Package
    shell: 

	#这里是安装http服务并启动的地方,需要我们补齐
  - name: Yum Install httpd
    yum: 
      name:
        - httpd 
      state: 
  - name: Start Service
    systemd:
      name: httpd
      state: restarted
      enabled: yes
	
	###
  - name: Install Mariadb
    yum: 
      name: 
        - mariadb-server
        - mariadb  
      state: present
  - name: Start Service
    systemd:
      name: mariadb
      state: restarted
      enabled: yes
     ###这一段都不需要补齐,是安装数据库并启动的操作

	###
  - name: Config Mariadb User
    shell: mysqladmin -uroot password {{ DB_PASS }}
    ignore_errors: yes

  - name: Mariadb Create zabbix
    shell: mysql -uroot -p{{ DB_PASS }} -e ""
    ignore_errors: yes
    
  - name: privileages mariadb
    shell: "{{ item }}"
    with_items:
      - mysql -uroot -p{{ DB_PASS }} -e ""
      - mysql -uroot -p{{ DB_PASS }} -e ""
	###这段是配置数据库的地方,需要我们补齐命令
	###"{{ item }}"是Jinja2的模板语法,可以依次操作with_items写的的命令,而不用写两段任务。
	
	#这里是安装zabbix服务的地方,需要我们补齐需要安装的组件
  - name: Install zabbix
    yum: 
      name:
        - 
        - 
        - 
        - 
      state: present
  #这里是导入数据库文件的地方,无需补齐   
  - name: sql config mariadb
    shell: chdir=/usr/share/doc/zabbix-server-mysql-3.4.15/ zcat create.sql.gz |mysql -uroot -p{{ DB_PASS }} zabbix
    ignore_errors: yes

  #这里是设置时区的地方,无需补齐
  - name: Php Timezone
    shell: "{{item}}"
    with_items:
      - sed -i "s/^;date.timezone.*/;date.timezone=RPC/g" /etc/php.ini
      - sed -i "s/#\ php_value/php_value/g" /etc/httpd/conf.d/zabbix.conf
      - sed -i "s/date.timezone.*/date.timezone Asia\/Shanghai/g" /etc/httpd/conf.d/zabbix.conf
  
  #这里是将模板文件复制到node节点,成为其zabbix配置文件的地方,需要我们补齐目标路径
  - name: Config zabbix_server.conf
    template: src=zabbix_server.conf.j2 dest=

  #这里是重启http和zabbix服务的地方,无需我们补齐
  - name: Restart Httpd And zabbix-server
    systemd:
      name: "{{item}}"
      state: restarted
      enabled: yes
    with_items:
      - httpd
      - zabbix-server
shell 复制代码
#将其补齐后的内容如下:
---
  - name: selinux config
    shell: "{{item}}"
    with_items:
      - sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config

  - name: Selinux Config Setenforce
    shell: getenforce
    register: info

  - name: when_Selinux
    shell: setenforce 0
    when: info['stdout'] == 'Enforcing'

  - name: firewalld
    shell: systemctl stop firewalld && systemctl disable firewalld
    ignore_errors: yes

  - name: mv yum config
    shell: mv /etc/yum.repos.d/* /media/

  - name: copy repo 
    copy: src=yum.repo dest=/etc/yum.repos.d/

  - name: Copy Repo Tar
    copy: src=zabbix.tar.gz dest=/root/

  - name: Decompression Package
    shell: tar -zxf /root/zabbix.tar.gz


  - name: Yum Install httpd
    yum: 
      name:
        - httpd 
      state: present
  - name: Start Service
    systemd:
      name: httpd
      state: restarted
      enabled: yes


  - name: Install Mariadb
    yum: 
      name: 
        - mariadb-server
        - mariadb  
      state: present
  - name: Start Service
    systemd:
      name: mariadb
      state: restarted
      enabled: yes

  - name: Config Mariadb User
    shell: mysqladmin -uroot password {{ DB_PASS }}
    ignore_errors: yes

  - name: Mariadb Create zabbix
    shell: mysql -uroot -p{{ DB_PASS }} -e "create database zabbix character set utf8 collate utf8_bin;"
    ignore_errors: yes
    
  - name: privileages mariadb
    shell: "{{ item }}"
    with_items:
      - mysql -uroot -p{{ DB_PASS }} -e "grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';"
      - mysql -uroot -p{{ DB_PASS }} -e "grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';"

  - name: Install zabbix
    yum: 
      name:
        - zabbix-server-mysql
        - zabbix-web-mysql
        - zabbix-agent
      state: present
  - name: sql config mariadb
    shell: chdir=/usr/share/doc/zabbix-server-mysql-3.4.15/ zcat create.sql.gz |mysql -uroot -p{{ DB_PASS }} zabbix
    ignore_errors: yes

  - name: Php Timezone
    shell: "{{item}}"
    with_items:
      - sed -i "s/^;date.timezone.*/;date.timezone=RPC/g" /etc/php.ini
      - sed -i "s/#\ php_value/php_value/g" /etc/httpd/conf.d/zabbix.conf
      - sed -i "s/date.timezone.*/date.timezone Asia\/Shanghai/g" /etc/httpd/conf.d/zabbix.conf

  - name: Config zabbix_server.conf
    template: src=zabbix_server.conf.j2 dest=/etc/zabbix/zabbix_server.conf

  - name: Restart Httpd And zabbix-server
    systemd:
      name: "{{item}}"
      state: restarted
      enabled: yes
    with_items:
      - httpd
      - zabbix-server

#如果你了解zabbix的搭建流程,且看过我之前搭建zabbix的文章,你就会发现补充的部分,与我那篇文章的命令是一模一样的
shell 复制代码
#zabbix_server.conf.j2模板文件是我们复制给node节点当zabbix的配置文件的
#我们编辑一下先,只需要添加101行DBHost的值即可
#添加前:
[root@ansible install_zabbix]# sed -n '100,104p' roles/zabbix/templates/zabbix_server.conf.j2
DBName=zabbix
DBHost=
DBPassword=zabbix
DBSocket=/tmp/mysql.sock
#添加后:
[root@ansible install_zabbix]# sed -n '100,104p' roles/zabbix/templates/zabbix_server.conf.j2
DBName=zabbix
DBHost=localhost
DBPassword=zabbix
DBSocket=/tmp/mysql.sock

执行剧本

shell 复制代码
#首先带你们看一下剧本的内容
[root@ansible install_zabbix]# vi install_zabbix.yaml
#YAML文件的开始标记
---
#这里指定了执行这个剧本的主机组,我们前面在/etc/ansible/hosts文件里定义了zabbix主机组,里面包含了node节点
- hosts: zabbix
#这里则是指定了执行任务时使用的用户名,执行任务时会用root用户连接对方主机
  remote_user: root
#制定了要应用的角色列表,这个实验我们有且只有一个zabbix角色,ansible会找到zabbix角色下的task目录,执行里面的main.yaml任务
  roles:
    - zabbix
    
#在执行剧本前,我们使用--syntax-check检查一下剧本有没有语法错误
[root@ansible install_zabbix]# ansible-playbook install_zabbix.yaml --syntax-check
#如果显示这样就说明语法没有问题,有语法错误的话会给你指出具体错误的地方
playbook: install_zabbix.yaml
#OK,一切准备就绪,我们执行剧本
[root@ansible install_zabbix]# ansible-playbook install_zabbix.yaml
...
#执行最后会给我们一个总结报告,总共执行了20个任务,19个导致了实际更改,有1个被跳过(临时关闭selinux那里,因为我提前关了,不满足when的条件,于是跳过了)
#其他的,unreachable是主机不可达的数量。failed是任务失败的数量。rescued是被救回的任务数量,这个需要在任务中使用rescue块,在原先任务执行到一半失败了就会执行rescue块的内容,进行恢复操作,避免剧本执行中断。我们这个实验没有使用,自然就没有救回的了。ignored是被忽略的任务数量,我们在任务后面多处添加了ignore_errors: yes,如果那个任务执行失败,也会继续执行剧本,相应的这个数字也会增加。
PLAY RECAP *****************************************************************************************
192.168.100.22             : ok=20   changed=19   unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

验证实验结果

我们打开浏览器,在地址栏输入node节点ip/zabbix,如果跳转到了zabbix的安装界面,则说明我们剧本执行成功,没有任何问题了

后语

关于zabbix的一些基础使用,设置中文界面和监控主机啥的,我也在这篇文章也有提及,感兴趣的可以看一下:1+X云计算运维与开发(中级)实战案例------Zabbix分布式监控系统搭建_实战案例------zabbix 分布式监控系统-CSDN博客

ansible搭建应用考察的题目还有部署ELK、Kafka、ZooKeeper、FTP还有Mariadb的,其实只要了解了ansible,这些都不难,后续可能会再讲个ELK的。

相关推荐
爱莉希雅&&&8 分钟前
zabbix快速搭建和使用
android·linux·数据库·zabbix·监控
江华森2 小时前
Zabbix 6.4 全栈部署与运维完全指南
运维·zabbix
江南风月6 小时前
WGCLOUD监控系统的Restful Http接口一览
运维·zabbix·运维开发·prometheus
文青小兵7 小时前
Linux云计算——docker compose haibor elfk (四)
linux·服务器·docker·云计算
文青小兵8 小时前
Linux云计算——docker部分技术、命令 (一)
linux·docker·云计算
文青小兵8 小时前
Linux云计算——docker 监控(五)
linux·docker·云计算·grafana·prometheus
文青小兵9 小时前
Linux云计算——docker镜像(三)
linux·docker·云计算
文青小兵9 小时前
Linux云计算——docker 网络和部分挂载(二)
linux·docker·云计算
AOwhisky10 小时前
Ceph系列第四期:Ceph块存储(RBD)精讲
linux·运维·笔记·ceph·云计算·rbd
博客-小覃1 天前
Zabbix之华为交换机的日志记录信息操作详细教程
服务器·网络·华为·zabbix