前言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
>> 執行同步過去的監控腳本
配置zabbix監控模版
1、建立監控TCP鏈接狀態模板
Configuration-->Templates--> Create template-->
Ansible Linux Templates-TCP connect status-->Items-->Create Item
2、建立自動發現TCP監聽端口模板
Configuration-->Templates--> Create template-->
Ansible Linux Templates-TCP listen ports-->Discovery rules--> Create discovery rule-->Discovery rules -->Item prototypes --> Create Item prototype
配置Zabbix自動發現規則
Configuration-->Actions-->Create action(Discovery)
>> 建立一個名字爲Ansible-testhosts的自動發現規則(Action)
>> 添加自動發現IP地址範圍
>> 添加連接的主機、監控模版(以前建立的兩個監控模版)
完成zabbix配置
在配置完上面全部步驟以後,zabbix服務端就會根據自動發現規則自動添加監控主機與監控項目
>> 查看監控數據
>> 查看監控數據
>> 查看監控數據
END
此後咱們仍然能夠繼續使用ansible管理zabbix遠程客戶端主機的配置文件、腳本同步、監控項目的添加等。