Caso de guión para uso (3)

Hola a todos, mi nombre es Jack (paloma).

Compartí con ustedes "¡ 7 ejemplos muy prácticos de scripts de Shell!" " y " Súper Hardcore! ¡11 ejemplos útiles de secuencias de comandos de Python y Shell! "dos artículos.

Recibí un mensaje de muchos lectores y amigos diciendo: Es tan práctico.

En mi trabajo reciente, encontré varios escenarios reales y usé scripts, que incluyen: Zabbix descubre automáticamente las URL de monitoreo, la interfaz de SMS de Alibaba Cloud y elimina los índices de Elasticsearch hace X meses cada semana. Los detalles son los siguientes:

1. Zabbix descubre automáticamente las URL de monitoreo

Este script se usa para monitorear URL, descubrir automáticamente archivos u otras URL almacenadas.

1.1 Script de detección automática de URL

from os.path import abspath, dirname, join
import json
import sys


reload(sys)
sys.setdefaultencoding('utf-8')

# URL存储文件
# 每一行格式为(可写多行):应用名称 URL地址 注释
URL_FILE_PATH = join(dirname(abspath(__file__)), 'web_url_list')

# 输出结果,zabbix官方定义的格式
data = {'data': []}

with open(URL_FILE_PATH, 'r') as read_f:
    # 读取URL文件,并进行分割,组成官网定义数据
    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 Guión de prueba de URL

from sys import argv
import requests

# 获取URL状态
def get_url(url, timeout=5):
    # 多数情况下返回200即为访问成功,提前测试好自己的URL访问返回状态码
    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 configurar clave personalizada

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 configuración WEB zabbix

  • Configurar la detección automática

inserte la descripción de la imagen aquí

  • Agregue elementos de monitoreo, active prototipos

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

2. Interfaz de SMS en la nube de Alibaba

Configure el envío de SMS según el ejemplo del sitio web oficial

2.1 Configuración de la nube de Alibaba

  • Configuración de Firma: Consola - Servicio SMS - Mensaje Nacional - Configuración de Firma

inserte la descripción de la imagen aquí

  • Configuración de plantillas: consola - servicio SMS - noticias nacionales - configuración de plantillas

inserte la descripción de la imagen aquí

Defina las variables usted mismo.Si el mensaje de alarma es demasiado largo (35 caracteres por defecto), envíe una orden de trabajo para eliminar la restricción.

  • Configuración de AccessKey: Gestión de Avatar-AccessKey

inserte la descripción de la imagen aquí

2.2 Enviar guión

#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")
       # 传递的参数
       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]
       # 手机号、主题、告警信息
       # 由zabbix端传递过来的
       res = sendSms('130XXXXXXXX', subject, alert_message)
       writeLog(subject + alert_message, res, LOG_FILE_PATH)

2.3 configuración WEB zabbix

  • medio de alarma

inserte la descripción de la imagen aquí

  • Medios de alarma configurables por el usuario

inserte la descripción de la imagen aquí

  • Se puede aplicar en acción.

3. Eliminar índices de Elasticsearch hace X meses cada semana

Ejemplo de formato de índice: 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点10分执行
# Description:  每周删除Elasticsearch X个月前的索引,索引格式示例: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:表示要删除多少天前的索引。"
        exit 1
    fi
}


# 删除索引函数
DeleteIndices(){
    indices="$1"
    time="$(echo $indices | awk -F'-' '{print $NF}')"
    delete_time="$(date -d "-${DELETE_DAYS_AGO} day" +'%Y-%m-%d')"

    # 过滤时间是不是 2021.04.11 格式的,如果不是就退出函数
    if ! echo "$time" | egrep -o "[0-9]{4}\.[0-9]{2}\.[0-9]{2}" &>/dev/null;then
        return   
    fi

    # 转换为unix好时间,date识别不了2021.11.21日志,所以转换为2021-11-21
    format_time=$(date -d "$(echo $time | tr '.' '-')" +'%s')
    format_delete_time=$(date -d "$delete_time" +'%s')

    # 如果索引时间小于要删除的时间并且索引名字不是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 $@

Eso es todo por el intercambio de hoy.

Espero que todos puedan aplicar lo que han aprendido a través de estos casos y aplicarlos en combinación con sus propios escenarios reales, para mejorar la eficiencia de su trabajo.

Si tiene más instancias de secuencias de comandos, también puede dejar un mensaje para compartir o dejar un mensaje a través de este artículo para hablar sobre sus necesidades específicas de instancias de secuencias de comandos. Si hay demasiadas instancias, la próxima vez Jiege compartirá con usted una colección completa. de instancias de artículos de guiones.

Supongo que te gusta

Origin blog.csdn.net/jake_tian/article/details/121559424
Recomendado
Clasificación