使用Jenkins和Python脚本实现ECS服务自动重启与DingDing通知
  ndCIWJ3N86Az 2023年12月08日 28 0

引言:

在持续集成和持续部署(CI/CD)中,Jenkins作为一个强大的自动化工具,可以集成AWS SDK和Python脚本,实现ECS服务的自动重启并通过DingDing机器人发送通知。本文将介绍如何搭建这个自动化流程,并将其整合到Jenkins中。

一、前期准备:

1. 配置AWS凭证:

确保Jenkins中配置了AWS凭证,以便能够访问ECS和Secrets Manager服务。

2. 创建DingDing机器人:

在DingDing中创建一个机器人,获取机器人的Token,用于发送通知。

二、编写Python脚本:

创建一个名为 ecs_restart_notification.py 的Python脚本,该脚本使用AWS SDK和DingDing机器人Token执行ECS服务的重启和通知。

#!/usr/bin/python3
import boto3
import os
import requests
import json

def get_secret(secret_name, region_name):
    """
    从AWS Secrets Manager获取指定的secret。
    """
    session = boto3.session.Session()
    client = session.client(service_name='secretsmanager', region_name=region_name)
    get_secret_value_response = client.get_secret_value(SecretId=secret_name)
    return json.loads(get_secret_value_response['SecretString'])

def send_dingding_message(service_name, token):
    """
    向DingDing发送一条消息,通知服务重启成功。
    """
    headers = {'Content-Type': 'application/json'}
    data = {
        "msgtype": "markdown",
        "markdown": {
            "title": f"Restart {service_name} Success",
            "text": f"<font face='黑体' color='#00EC00'>Restart {service_name} Success</font>\n"
        }
    }
    response = requests.post(f"https://oapi.dingtalk.com/robot/send?access_token={token}", headers=headers, data=json.dumps(data))
    print(response.text)

def restart_services(cluster_name, service_names, task_definition, token):
    """
    重启指定的ECS服务,并向DingDing发送通知。
    """
    client = boto3.client('ecs')
    for service_name in service_names:
        client.update_service(
            cluster=cluster_name,
            service=service_name,
            taskDefinition=task_definition,
            forceNewDeployment=True
        )
        send_dingding_message(service_name, token)

def get_task_definition(cluster_name, service_name):
    """
    获取指定服务的任务定义。
    """
    client = boto3.client('ecs')
    response = client.describe_services(
        cluster=cluster_name,
        services=[service_name]
    )
    return response['services'][0]['taskDefinition']

def get_task_name(task_definition):
    """
    从任务定义的ARN中获取任务名称。
    """
    return task_definition.split('/')[-1].split(':')[0]

# 从环境变量获取集群名称和服务名称列表
cluster_name = 'govee-test'
service_names = os.environ['SERVICE_NAMES'].split(',')
service_name = service_names[0]  # 获取第一个服务名称以获取任务定义

task_definition = get_task_definition(cluster_name, service_name)
task_name = get_task_name(task_definition)

# 从Secrets Manager获取DingDing token
secrets = get_secret('base', 'us-east-1')
token = secrets['BUILD1_TOKEN']

restart_services(cluster_name, service_names, task_name, token)
注解:
  1. get_secret 函数: 通过AWS Secrets Manager获取指定的Secret,并将其解析为JSON格式。
  2. send_dingding_message 函数: 向DingDing机器人发送Markdown格式的消息,用于通知服务重启成功。
  3. restart_services 函数: 使用AWS SDK的update_service方法重启指定的ECS服务,并调用发送通知的函数。
  4. get_task_definition 函数: 获取指定ECS服务的任务定义。
  5. get_task_name 函数: 从任务定义的ARN中提取任务名称。
  6. 环境变量: 通过Jenkins Pipeline或其他方式设置的环境变量,包括ECS集群名称和服务名称列表。
  7. 获取任务定义和任务名称: 通过调用相关函数获取ECS服务的任务定义和任务名称。
  8. 获取DingDing Token: 通过调用get_secret函数获取DingDing机器人的Token。
  9. 重启服务并发送通知: 调用restart_services函数实现ECS服务的重启,并通过DingDing机器人发送通知。

三、在Jenkins中创建Pipeline:

在Jenkins中创建一个Pipeline,将上述Python脚本整合到Jenkins的CI/CD流程中。以下是一个简单的Pipeline示例:

pipeline {
    agent any

    environment {
        SERVICE_NAMES = 'your-service-names'  // 替换为实际的服务名称
    }

    stages {
        stage('Restart ECS Service') {
            steps {
                script {
                    // 安装所需的Python库
                    sh 'pip install boto3 requests'
                    
                    // 执行Python脚本
                    sh './ecs_restart_notification.py'
                }
            }
        }
    }
}

确保将上述Pipeline中的 your-service-names 替换为实际的服务名称。

注解:
  • environment 部分:定义了Jenkins Pipeline中的环境变量,包括ECS服务的名称。
  • stage('Restart ECS Service') 部分:定义了Jenkins Pipeline中的一个阶段,用于执行ECS服务的重启。

四、运行Jenkins Pipeline:

运行Jenkins Pipeline,观察Jenkins的控制台输出,确保Python脚本成功执行,ECS服务重启并通过DingDing机器人发送了通知。

五、总结:

通过整合Jenkins、Python脚本、AWS SDK和DingDing机器人,我们建立了一个自动化流程,实现了ECS服务的自动重启和通知。这种自动化流程有助于提高运维效率,及时发现并解决潜在的问题,保障服务的稳定性。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月08日 0

暂无评论

推荐阅读
  BBJ6jozQQLol   2023年12月07日   20   0   0 Jenkins
  Yoru5qB4TSKM   2023年12月10日   33   0   0 服务器重启IP
ndCIWJ3N86Az