• 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节点
    ansible192.168.100.21ansible节点
    node192.168.100.22node节点

    操作过程

    更改主机名

    #两个节点修改好主机名
    [root@localhost ~]# hostnamectl set-hostname ansible
    [root@localhost ~]# bash
    [root@ansible ~]# 
    
    [root@localhost ~]# hostnamectl set-hostname node
    [root@localhost ~]# bash
    [root@node ~]# 
    

    上传软件包

    将我提供的软件包上传至ansible节点
    在这里插入图片描述

    解压软件包

    #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源

    #删除系统自带源
    [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
    

    配置主机映射

    #编辑系统的主机映射文件
    [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
    

    配置免密登录

    #执行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节点

    #我们做一下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
    

    完善脚本

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

    #我们回到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
    
    #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
    
    #将其补齐后的内容如下:
    ---
      - 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的文章,你就会发现补充的部分,与我那篇文章的命令是一模一样的
    
    #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
    

    执行剧本

    #首先带你们看一下剧本的内容
    [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的。

  • 相关阅读:
    【无标题】
    Redis的主从复制,哨兵和Cluster集群
    [附源码]Python计算机毕业设计Django校园订餐管理系统
    一文简单了解函数类型
    蓝桥杯 题库 简单 每日十题 day4
    【C++】命名空间和using namespace std的注意事项
    【Verycapture】离线文字提取,视频录制
    网络安全(黑客)自学
    【重识云原生】第四章云网络4.7.9节——NFV
    Puppeteer记录操作过程及优秀的开源插件(五)
  • 原文地址:https://blog.csdn.net/kuuuugua/article/details/139782761