拿來就用的腳本案例!(三)
作者:JackTian
來源:公眾號(hào)「杰哥的IT之旅」
ID:Jake_Internet
轉(zhuǎn)載請(qǐng)聯(lián)系授權(quán)(微信ID:Hc220088)
大家好,我是杰哥(鴿)。
之前給大家分享了《7 個(gè)非常實(shí)用的 Shell 拿來就用腳本實(shí)例!》和《超硬核!11 個(gè)非常實(shí)用的 Python 和 Shell 拿來就用腳本實(shí)例!》兩篇文章。
得到了多位讀者朋友的留言說:簡直太實(shí)用了。
最近工作中,又碰到了幾個(gè)實(shí)際場景并運(yùn)用了腳本,大致包括:Zabbix 自動(dòng)發(fā)現(xiàn)監(jiān)控 URL、阿里云短信接口、每周刪除 Elasticsearch X 個(gè)月前的索引,具體如下:
1
Zabbix自動(dòng)發(fā)現(xiàn)監(jiān)控URL

此腳本用于監(jiān)控 URL,自動(dòng)發(fā)現(xiàn)文件或其他存儲(chǔ)的 URL。
1.1 URL自動(dòng)發(fā)現(xiàn)腳本
from?os.path?import?abspath,?dirname,?join
import?json
import?sys
reload(sys)
sys.setdefaultencoding('utf-8')
#?URL存儲(chǔ)文件
#?每一行格式為(可寫多行):應(yīng)用名稱 URL地址?注釋
URL_FILE_PATH?=?join(dirname(abspath(__file__)),?'web_url_list')
#?輸出結(jié)果,zabbix官方定義的格式
data?=?{'data':?[]}
with?open(URL_FILE_PATH,?'r')?as?read_f:
????#?讀取URL文件,并進(jìn)行分割,組成官網(wǎng)定義數(shù)據(jù)
????for?line?in?read_f:
????????if?line:
???????????name?=?line.split()[0]
???????????url?=?line.split()[1]
???????????description?=?line.split()[2]
???????????data['data'].append({"{#NAME}":?name,?"{#URL}":?url,?"{#DESCRIPTION}":?description})
print?json.dumps(data)
1.2 URL測(cè)試腳本
from?sys?import?argv
import?requests
#?獲取URL狀態(tài)
def?get_url(url,?timeout=5):
????#?多數(shù)情況下返回200即為訪問成功,提前測(cè)試好自己的URL訪問返回狀態(tài)碼
????try:
????????request_obj?=?requests.get(url,?timeout=timeout)
????????status_code?=?request_obj.status_code
????except?Exception?as?e:
????????status_code?=?99999
????print(status_code)
url?=?argv[1]
get_url(url)
1.3 zabbix 配置自定義 key
UserParameter=discovery_web_url,?/bin/python?/opt/zabbix_scripts/web_url/url_discovery.py?
UserParameter=url_get[*],?/bin/python?/opt/zabbix_scripts/web_url/url_get_status.py?$1
1.4 zabbix WEB 端配置
配置自動(dòng)發(fā)現(xiàn)

添加監(jiān)控項(xiàng)、觸發(fā)器原型


2
阿里云短信接口

根據(jù)官網(wǎng)樣例配置短信發(fā)送
2.1 阿里云配置
簽名配置:控制臺(tái)-短信服務(wù)-國內(nèi)消息-簽名配置

模板配置:控制臺(tái)-短信服務(wù)-國內(nèi)消息-模板配置

自己定義好變量,如果告警信息過長(默認(rèn)是35個(gè)字符),提交工單解除限制。
AccessKey配置:頭像-AccessKey管理

2.2 發(fā)送腳本
#coding=utf-8
???from?aliyunsdkcore.client?import?AcsClient
???from?aliyunsdkcore.request?import?CommonRequest
???from?sys?import?argv
???LOG_FILE_PATH?=?'/tmp/zabbix-sms.log'
???def?sendSms(phone_numbers,?subject,?alert_message):
???????#?AccessKet
???????client?=?AcsClient('AccessKey?ID',?'Secret')
???????alert_message?=?subject?+?alert_message
???????#?官方定義的格式,具體含義沒有研究
???????request?=?CommonRequest()
???????request.set_accept_format('json')
???????request.set_domain('dysmsapi.aliyuncs.com')
???????request.set_method('POST')
???????request.set_protocol_type('https')?#?https?|?http
???????request.set_version('2017-05-25')
???????request.set_action_name('SendSms')
???????request.add_query_param('PhoneNumbers',?phone_numbers)
???????#?簽名名稱
???????request.add_query_param('SignName',?"XXXX")
???????#?模板code
???????request.add_query_param('TemplateCode',?"XXXX")
???????#?傳遞的參數(shù)
???????request.add_query_param('TemplateParam',?"{\"alert_message\":\"%s\"}"?%?alert_message)
???????response?=?client.do_action(request)
???????return?response
???def?writeLog(message,?response,?log_file_path):
???????with?open(log_file_path,?'a')?as?a_file:
???????????a_file.write(message?+?'?|?'?+?response)
???if?__name__?==?'__main__':
???????phone_numbers?=?argv[1]
???????subject?=?argv[2]
???????alert_message?=?argv[3]
???????#?手機(jī)號(hào)、主題、告警信息
???????#?由zabbix端傳遞過來的
???????res?=?sendSms('130XXXXXXXX',?subject,?alert_message)
???????writeLog(subject?+?alert_message,?res,?LOG_FILE_PATH)
2.3 zabbix WEB 端配置
報(bào)警媒介

用戶配置報(bào)警媒介

動(dòng)作中應(yīng)用即可
3
每周刪除Elasticsearch X個(gè)月前的索引

索引格式示例:index-2021.11.21
#!/bin/bash
#?Filename???:??delete_es_indices.sh
#?Date???????:??2021/11/21
#?Author?????:??xxx?
#?Email??????:??xxx
#?Crontab????:??10?00?*?*?6?/bin/bash?$BASE_PATH/delete_es_indices.sh?>/dev/null?2>&1
#?Notes??????:??將腳本加入crontab中,每周六0點(diǎn)10分執(zhí)行
# Description:??每周刪除Elasticsearch X個(gè)月前的索引,索引格式示例:index-2021.04.11
check_args(){
????if?[?"$#"?-ne?2?];then
????????echo?"Usage:?$0?[ES_URL]?[DEL?DAYS]"
????????echo?"ES_URL示例:http://1.1.1.1:9200,DEL DAYS:表示要?jiǎng)h除多少天前的索引。"
????????exit?1
????fi
}
#?刪除索引函數(shù)
DeleteIndices(){
????indices="$1"
????time="$(echo?$indices?|?awk?-F'-'?'{print?$NF}')"
????delete_time="$(date?-d?"-${DELETE_DAYS_AGO}?day"?+'%Y-%m-%d')"
????#?過濾時(shí)間是不是?2021.04.11?格式的,如果不是就退出函數(shù)
????if?!?echo?"$time"?|?egrep?-o?"[0-9]{4}\.[0-9]{2}\.[0-9]{2}"?&>/dev/null;then
????????return???
????fi
????#?轉(zhuǎn)換為unix好時(shí)間,date識(shí)別不了2021.11.21日志,所以轉(zhuǎn)換為2021-11-21
????format_time=$(date?-d?"$(echo?$time?|?tr?'.'?'-')"?+'%s')
????format_delete_time=$(date?-d?"$delete_time"?+'%s')
????#?如果索引時(shí)間小于要?jiǎng)h除的時(shí)間并且索引名字不是monitor開頭的,則刪除
????if?[[?"$format_time"?-lt?"$format_delete_time"?&&?!?"$indices"?=~?^monitor.*?]];then
????????curl?-XDELETE?"$ES_IP/$indices"
????fi
}
main(){
????check_args?$@
????#?ES?URL
????ES_IP="$1"
????#?刪除多少天前的索引
????DELETE_DAYS_AGO="$2"
????curl?$ES_IP/_cat/indices?|?awk?'{print?$3}'?|?while?read?line
????do
????????DeleteIndices?$line
????done
}
main?$@
以上,就是今天分享的全部內(nèi)容了。
希望大家通過這些案例能夠?qū)W以致用,結(jié)合自身的實(shí)際場景進(jìn)行運(yùn)用,從而提高自己的工作效率。
如果你有更多腳本實(shí)例,也歡迎大家留言分享或通過本文進(jìn)行留言說說你具體的腳本實(shí)例需求,如果實(shí)例過多的話,下次杰哥在整一篇合集腳本文章實(shí)例來跟大家分享。
推薦閱讀
Shell編程-控制結(jié)構(gòu) | 基礎(chǔ)篇
7 個(gè)非常實(shí)用的 Shell 拿來就用腳本實(shí)例!
超硬核!11 個(gè)非常實(shí)用的 Python 和 Shell 拿來就用腳本實(shí)例!

