Ansible-playbook批量添加zabbix監控項目、同步配置信息(二)

前言shell

 

在上一篇教程中咱們已經實現了使用ansible-playbook批量在遠程主機上部署zabbix客戶端並正常運行,如今咱們再次經過ansible-playbook給客戶端主機批量增長zabbix監控項目配置(建立監控項目示例:自動發現遠程主機監聽的TCP端口、監控遠程主機的TCP鏈接數狀態)。bash


Ansible-playbook 配置
服務器


在原有的基礎目錄上建立一個configure角色以及ansible的各個模塊任務目錄列表,經過ansible-playbook調用入口文件zabbix_configure.yml,使得configure可以調用各個模塊功能來完成同步全部zabbix的配置tcp

[root@ansible /etc/ansible/zabbix_rhel/zabbix_agent ]# tree roles/configure/
roles/configure/
├── files
│   └── zabbix_scripts
│       ├── discovery_tcp_port.sh
│       └── tcp_connect_status.sh
├── handlers
│   └── main.yml
├── meta
├── tasks
│   ├── 01-sync-clock.yml
│   ├── 02-allow-sudo.yml
│   ├── 03-sync-conf_files.yml
│   └── main.yml
├── templates
│   ├── Userparameter_script.conf
│   └── zabbix_agentd.conf
└── vars
    └── main.yml
 
7 directories, 10 files

[root@ansible /etc/ansible/zabbix_rhel/zabbix_agent ]# ls
roles  zabbix_configure.yml  zabbix_delete.yml  zabbix_install.yml


一、定義ansible程序入口調用文件ide


>> zabbix_configure.yml ui

---
- hosts: testhosts
  remote_user: root
  gather_facts: True
  roles:
    - configure


二、定義tasks任務列表spa


>> 同步時鐘並添加計劃任務(01-sync-clock.yml )prototype

---
  - name: Install ntpdate software
    yum: name=ntpdate state=present
 
  - name: Synchronization clock cron job
    cron:
      name: Sync clock
      job: /usr/sbin/ntpdate {{ ntpserver }} &>/dev/null && hwclock -w
      minute: 30
      hour: 7
  - name: Restart crond
    service: name=crond state=restarted
 
  - name: Running ntpdate to synchronization time
    shell: /usr/sbin/ntpdate {{ ntpserver }} && hwclock -w


>> 定義容許zabbix用戶使用sudo執行命令的task任務(02-allow-sudo.yml)3d

---
  - name: Add allow zabbix user to nopasswd exec sudo
    lineinfile:
      dest: /etc/sudoers
      regexp: "^zabbix"
      insertafter: "^root"
      line: "zabbix  ALL=(ALL)       NOPASSWD: ALL"
 
  - name: Add allow zabbix user to nopasswd exec sudo
    lineinfile:
      dest: /etc/sudoers
      regexp: "^Defaults:zabbix"
      line: "Defaults:zabbix    !requiretty"

修改zabbix用戶容許使用sudo執行命令,而且不須要輸入密碼,該task任務能夠重複執行,而且不會增長重複的配置rest


>> 定義同步全部zabbix配置文件的task任務(03-sync-conf_files.yml)

---
- name: Create zabbix scripts directory
  file: dest={{ zabbix_basedir }}/scripts state=directory owner=root group=root mode=0755 recurse=yes
 
- name: Copy zabbix monitor scripts
  copy: src=zabbix_scripts/ dest={{ zabbix_basedir }}/scripts/ owner=root group=root mode=0755
 
- name: Copy zabbix_agentd.conf file
  template: src=zabbix_agentd.conf dest={{ zabbix_basedir }}/etc/zabbix_agentd.conf
            owner=root group=root mode=0644
  notify: restart zabbix_agentd
 
- name: Copy Userparameter_script.conf file
  template: src=Userparameter_script.conf dest={{ zabbix_basedir }}/etc/zabbix_agentd.conf.d/Userparameter_script.conf
            owner=root group=root mode=0644
  notify: restart zabbix_agentd


>> 定義tasks任務列表調用接口文件(main.yml)

---
- include: 01-sync-clock.yml
- include: 02-allow-sudo.yml
- include: 03-sync-conf_files.yml


三、定義vars變量文件


在這裏定義zabbix服務端主機名或IP地址,ntp服務器地址等

# cat roles/configure/vars/main.yml
ntpserver: 10.17.87.8
zabbix_basedir: /usr/local/zabbix
zabbix_server_ip: 10.17.81.120


四、定義handlers任務文件


handlers任務在同步配置文件時重啓zabbix_agentd服務使配置生效

# cat roles/configure/handlers/main.yml 
---
- name: restart zabbix_agentd
  service: name=zabbix_agentd state=restarted


五、zabbix腳本統一放到files/zabbix_scripts/目錄下

# ls roles/configure/files/zabbix_scripts/
discovery_tcp_port.sh  tcp_connect_status.sh


>> discovery_tcp_port.sh爲自動發現客戶端主機TCP端口腳本

#!/bin/bash
#Author: HMLinux  Email: mail@huangming.org
#port_array=`netstat -tnlp | sed -e '1,2d' -e '/-/d' | awk '{print $4}' | awk -F':' '{if($NF~/^[0-9]*$/) print $NF}' | sort -n | u
niq`
port_array=`netstat -ntlp | sed -e '1,2d' -e '/-/d' | awk '{print $4" "$NF}' | awk -F'[:/ ]+' '($NF !~ /^[0-9]*$/) && ($2>18) {pri
nt $2" "$NF}' |sort -g|uniq`
tcp_ports=(`echo "$port_array"|cut -d" " -f1`)
proc_name=(`echo "$port_array"|cut -d" " -f2`)
length=${#tcp_ports[@]}
 
printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
        printf '\n\t\t{'
        printf '\n\t\t\t'
        printf "\"{#TCP_PORT}\":\"${tcp_ports[$i]}\","
        printf '\n\t\t\t'
        printf "\"{#TCP_NAME}\":\"${proc_name[$i]}\"}"
        if [ $i -lt $[$length-1] ];then
                printf ','
        fi
done
printf  "\n\t]\n"
printf "}\n"


>> tcp_connect_status.sh爲監控客戶端主機TCP鏈接狀態腳本

#!/bin/bash
#Author: HMLinux  Email: mail@huangming.org
parameter_l=$1
parameter_u=$(echo $parameter_l | tr '[:lower:]' '[:upper:]')
ptcp_status=$(/bin/netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' | awk '/'''$parameter_u'''/{print $2}')
case $parameter_l in
    listen)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    established)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    time_wait)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    syn_sent)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    syn_recv)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    closed)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    closing)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    close_wait)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    fin_wait1)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    fin_wait2)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
    lastack)
        if [ "$ptcp_status" == "" ];then
            echo 0
        else
            echo $ptcp_status
        fi
     ;;
 
     *)
        echo -e "\E[33mUsage: sh $0 [closed|closing|close_wait|syn_recv|syn_sent|fin_wait1|fin_wait2|listen|established|lastack|ti
me_wait]\E[0m"
esac


6、將zabbix相關的配置文件放到templates/目錄下

# ls roles/configure/templates/
Userparameter_script.conf  zabbix_agentd.con

>> Userparameter_script.conf配置文件,該配置文件定義zabbix監控項目鍵值與腳本路徑

# cat Userparameter_script.conf 
UserParameter=tcp.listen.port,sudo {{ zabbix_basedir }}/scripts/discovery_tcp_port.sh
UserParameter=tcp.connect.status[*],sudo {{ zabbix_basedir }}/scripts/tcp_connect_status.sh $1

>> zabbix_agentd.conf配置文件,該配置文件爲zabbix客戶端的主配置文件

Server={{ zabbix_server_ip }}
ServerActive={{ zabbix_server_ip }}:10051
Hostname={{ ansible_default_ipv4.address }}
Include={{ zabbix_basedir }}/etc/zabbix_agentd.conf.d
UnsafeUserParameters=1


七、執行zabbix_configure.yml同步zabbix配置

# ansible-playbook zabbix_configure.yml

[root@ansible /etc/ansible/zabbix_rhel/zabbix_agent ]# ansible-playbook zabbix_configure.yml 
 
PLAY [testhosts] ***************************************************************

TASK [setup] *******************************************************************
ok: [10.17.83.33]
ok: [10.17.83.34]

TASK [configure : Install ntpdate software] ************************************
ok: [10.17.83.33]
ok: [10.17.83.34]

TASK [configure : Synchronization clock cron job] ******************************
ok: [10.17.83.33]
ok: [10.17.83.34]

TASK [configure : Restart crond] ***********************************************
changed: [10.17.83.33]
changed: [10.17.83.34]

TASK [configure : Running ntpdate to synchronization time] *********************
changed: [10.17.83.33]
changed: [10.17.83.34]

TASK [configure : Add allow zabbix user to nopasswd exec sudo] *****************
ok: [10.17.83.33]
ok: [10.17.83.34]

TASK [configure : Add allow zabbix user to nopasswd exec sudo] *****************
ok: [10.17.83.33]
ok: [10.17.83.34]

TASK [configure : Create zabbix scripts directory] *****************************
ok: [10.17.83.33]
ok: [10.17.83.34]

TASK [configure : Copy zabbix monitor scripts] *********************************
ok: [10.17.83.33]
ok: [10.17.83.34]

TASK [configure : Copy zabbix_agentd.conf file] ********************************
changed: [10.17.83.33]
changed: [10.17.83.34]

TASK [configure : Copy Userparameter_script.conf file] *************************
ok: [10.17.83.33]
ok: [10.17.83.34]

RUNNING HANDLER [configure : restart zabbix_agentd] ****************************
changed: [10.17.83.33]
changed: [10.17.83.34]

PLAY RECAP *********************************************************************
10.17.83.33                : ok=12   changed=4    unreachable=0    failed=0   
10.17.83.34                : ok=12   changed=4    unreachable=0    failed=0


八、查看同步狀況


在ansible服務器上執行

>> 腳本同步

[root@ansible ~ ]# ansible testhosts -m shell -a "ls -l /usr/local/zabbix/scripts/"
10.17.83.33 | SUCCESS | rc=0 >>
total 8
-rwxr-xr-x. 1 root root  837 Jul  5 17:56 discovery_tcp_port.sh
-rwxr-xr-x. 1 root root 1937 Jul  6 18:07 tcp_connect_status.sh
 
10.17.83.34 | SUCCESS | rc=0 >>
total 8
-rwxr-xr-x. 1 root root  837 Jul  6 16:33 discovery_tcp_port.sh
-rwxr-xr-x. 1 root root 1803 Jul  5 17:21 tcp_connect_status.sh


>> 配置文件

[root@ansible ~ ]# ansible testhosts -m shell -a "cat /usr/local/zabbix/etc/zabbix_agentd.conf.d/Userparameter_script.conf"
10.17.83.34 | SUCCESS | rc=0 >>
UserParameter=tcp.listen.port,sudo /usr/local/zabbix/scripts/discovery_tcp_port.sh
UserParameter=tcp.connect.status[*],sudo /usr/local/zabbix/scripts/tcp_connect_status.sh $1
 
10.17.83.33 | SUCCESS | rc=0 >>
UserParameter=tcp.listen.port,sudo /usr/local/zabbix/scripts/discovery_tcp_port.sh
UserParameter=tcp.connect.status[*],sudo /usr/local/zabbix/scripts/tcp_connect_status.sh $1


>> 執行同步過去的監控腳本

wKiom1lfICmgwxYCAABKZ_8C5v8908.png



配置zabbix監控模版


1、建立監控TCP鏈接狀態模板

Configuration-->Templates--> Create template-->

 

Ansible Linux Templates-TCP connect status-->Items-->Create Item

wKiom1lfIF3TDiqGAAFc8ZCsMls745.png


2、建立自動發現TCP監聽端口模板

Configuration-->Templates--> Create template-->


Ansible Linux Templates-TCP listen ports-->Discovery rules--> Create discovery rule-->Discovery rules -->Item prototypes --> Create Item prototype

wKiom1lfIIqR_nScAADJElY4S7w333.png


配置Zabbix自動發現規則


Configuration-->Actions-->Create action(Discovery)


>> 建立一個名字爲Ansible-testhosts的自動發現規則(Action)

wKioL1lfIQzyqnZFAABlHKGIZUQ535.png


>> 添加自動發現IP地址範圍

wKiom1lfISzQK5DoAABI9O7Hnyc080.png


>> 添加連接的主機、監控模版(以前建立的兩個監控模版)

wKioL1lfIUrStIF5AABfxKP8lJU342.png

完成zabbix配置


在配置完上面全部步驟以後,zabbix服務端就會根據自動發現規則自動添加監控主機與監控項目


>> 查看監控數據

wKioL1lfIXfhqTbzAADzedUinD4812.png

>> 查看監控數據

wKioL1lfIZbxt_sIAAD_KzNtG_M106.png


>> 查看監控數據

wKiom1lfIbSQhvhMAADW8q1ArJU762.png

END

 

此後咱們仍然能夠繼續使用ansible管理zabbix遠程客戶端主機的配置文件、腳本同步、監控項目的添加等。

相關文章
相關標籤/搜索