运维自动化之Cisco Dell 采用Python 方式实现自定义Raid 级别

#!/usr/bin/env python
#-*-coding:UTF-8-*-
"""
@Item   :  V1.0
@Author :  ShengWangQiang
@Group  :  System ITEM
@Date   :  2015-01-28
@E-mail :  [email protected]
@Funtion:

"RAID Level : Primary-1, Secondary-0, RAID Level Qualifier-0") echo "Raid Level :Raid 1";;
"RAID Level : Primary-0, Secondary-0, RAID Level Qualifier-0") echo "Raid Level :Raid 0";;
"RAID Level : Primary-5, Secondary-0, RAID Level Qualifier-3") echo "Raid Level :Raid 5";;
"RAID Level : Primary-1, Secondary-3, RAID Level Qualifier-0") echo "Raid Level :Raid 10";;

"""

import os,sys,time,socket,commands,traceback,re,fcntl,json
import struct

class DellRaid(object):
    def __init__(self):
        version = 1.0

    # Log file and save log info
    def log(self,info):
        if not os.path.exists(‘/var/log/autostack/‘):
            os.makedirs(‘/var/log/autostack/‘)
        files = open(‘/var/log/autostack/autostack.log‘,‘a‘)
        try:
            files.write(‘[%s]: %s \n‘ %(time.ctime(),info))
        except IOError:
            files.close()
        files.close()

    # Call system commands 
    def execute(self,*cmd):
        """
        execute the cmd, and return the outpurt of cmd
        simple way to get cmd output.
        """
        cmd = list(cmd)
        cmd = map(str, cmd)
        cmd_line = ‘ ‘.join(cmd)

        code, output = commands.getstatusoutput(cmd_line)
        
        if code == 0:
            self.log(output)
            self.log(cmd_line)
            return output
        else:
            self.log(traceback.format_exc())
        self.log(cmd_line)

    # Megacli create Raid 0 
    def raid_0(self,raid_type,enclosure,slot):
        try:
            raid_type = raid_type.split(‘_‘)[-1]
            sinfo = ‘,‘.join([‘%s:‘ %enclosure + str(i) for i in slot])
            self.execute( """/usr/bin/megacli -CfgLdAdd -r%s [%s] WB Direct -a0"""                          %(raid_type,sinfo))
            self.log("Raid Group %s create is oK" %raid_type)

        except:
            self.log(‘raid_0 Error %s ‘ %traceback.format_exc())

    # Megacli create Raid 1  
    def raid_1(self,raid_type,enclosure,slot):
        try:
            raid_type = raid_type.split(‘_‘)[-1]
            sinfo = ‘,‘.join([‘%s:‘ %enclosure + str(i) for i in slot])
            self.execute( """/usr/bin/megacli -CfgLdAdd -r%s [%s] WB Direct -a0"""                          %(raid_type,sinfo))
            self.log("Raid Group %s create is oK" %raid_type)
        except:
            self.log(‘raid_1 Error %s ‘ %traceback.format_exc())

    # Megacli create Raid 5 
    def raid_5(self,raid_type,enclosure,slot):
        try:
            raid_type = raid_type.split(‘_‘)[-1]
            sinfo = ‘,‘.join([‘%s:‘ %enclosure + str(i) for i in slot])
            self.execute( """/usr/bin/megacli -CfgLdAdd -r%s [%s] WB Direct -a0"""                          %(raid_type,sinfo))
            self.log("Raid Group %s create is oK" %raid_type)
        except:
            self.log(‘raid_5 Error %s ‘ %traceback.format_exc())

    # Megacli create Raid 10 
    def raid_10(self,raid_type,enclosure,slot):
        try:
            raid_type = raid_type.split(‘_‘)[-1]
            arry_slot =  self._arry_slot(enclosure,slot)
            self.execute("""/usr/bin/megacli -CfgSpanAdd -r%s %s WB Direct -a0 """                         %(raid_type,arry_slot))
            print ‘yes‘ 
            self.log("Raid Group %s create is oK" %raid_type)
        except:
            print traceback.format_exc()
            self.log(‘raid_10 Error %s ‘ %traceback.format_exc())
 
    # Array split Raid 
    def _arry_slot(self,enclosure,slot):
        bnext = iter(slot)
        count = 0
        ret = []
        try:
            for i in bnext:
                i = int(i.encode() )
                ret.append(‘-Array%i[%s:%s,%s:%s]‘%(count, enclosure,i,enclosure, bnext.next()))
                count += 1
            self.log(‘Array str %s ‘%‘ ‘.join(ret))
            return ‘ ‘.join(ret)
        except:
            self.log(traceback.format_exc())
            return ‘‘

    # Split enclosure str
    def _enclosure(self,disks):
        enclosure = dict()
        try:
            for d in disks:
                rest =d[‘enclosure‘]
            if not rest:
                rest = self._esc()
            enclosure[‘enclosure‘] = rest
        except:
            self.log(traceback.format_exc())
        
        return enclosure

    def _esc(self):
        try:
            ecs =  self.execute(""" /usr/bin/megacli   -cfgdsply -aALL |grep ‘Enclosure Device ID‘ """)
            ecs =int(ecs.split(":")[-1].strip())
            return ecs 
        except:
            self.log(traceback.format_exc())
    # Split slot str info
    def _slot(self,disks):
        slot = list()
        try:
            for d in disks:
                slot.append(d[‘slot‘])
        except:
            self.log(traceback.format_exc())

        return slot 

    # Delete Raid Group ,defautl values is ID
    def delete_raid_group(self):
        try:
            ids = self.execute("""/usr/bin/megacli  -cfgdsply -aALL |                                 grep "Number of DISK GROUPS"  """)
            for i in range(int(ids.split(‘:‘)[-1])):
                self.execute(""" /usr/bin/megacli  -CfgLdDel -L%s -a0""" %i)
                self.log("Raid Group %s delete is oK" %i)
        except:
            self.log(traceback.format_exc())

    def set_ipmit_boot(self):
        try:
            self.execute(""" /usr/bin/ipmitool chassis bootdev pxe """)
            self.log("Set Service boot pxe is ok")
        except:
            self.log(traceback.format_exc())
    def work(self,data):
        # Get Raid Group  info for Create raid live
        raid_info = dict()
        for info in range(len(data)):
            raid_info[data[info][‘raid_group‘]] = dict()
            raid_info[data[info][‘raid_group‘]][‘raid_group‘] = data[info][‘raid_group‘]
            raid_info[data[info][‘raid_group‘]][‘raid_type‘] = data[info][‘raid_type‘]
            raid_info[data[info][‘raid_group‘]][‘os_flag‘] = data[info][‘os_flag‘]
            raid_info[data[info][‘raid_group‘]][‘enclosure‘] = self._enclosure(data[info][‘disks‘])[‘enclosure‘]
            raid_info[data[info][‘raid_group‘]][‘slot‘] = self._slot(data[info][‘disks‘])

        # Delete old raid group 
        self.delete_raid_group()
        
        # Set Service boot is PXE
        self.set_ipmit_boot()

        # Create Raid Group ... 
        for m in  raid_info:
            # The os Raid is create
            if  raid_info[m][‘os_flag‘]:
                if raid_info[m][‘raid_type‘]  == ‘raid_0‘:
                    self.raid_0(raid_info[m][‘raid_type‘],
                                raid_info[m][‘enclosure‘],
                                raid_info[m][‘slot‘])
                elif raid_info[m][‘raid_type‘]  == ‘raid_1‘:
                    self.raid_1(raid_info[m][‘raid_type‘],
                                raid_info[m][‘enclosure‘],
                                raid_info[m][‘slot‘])
                elif raid_info[m][‘raid_type‘]  == ‘raid_5‘:
                    self.raid_5(raid_info[m][‘raid_type‘],
                                raid_info[m][‘enclosure‘],
                                raid_info[m][‘slot‘])
                elif raid_info[m][‘raid_type‘]  == ‘raid_10‘:
                    self.raid_10(raid_info[m][‘raid_type‘],
                                raid_info[m][‘enclosure‘],
                                raid_info[m][‘slot‘])
        
        for m in  raid_info:
            # The not is os Raid 
            if not raid_info[m][‘os_flag‘]:
                if raid_info[m][‘raid_type‘]  == ‘raid_0‘:
                    self.raid_0(raid_info[m][‘raid_type‘],
                                raid_info[m][‘enclosure‘],
                                raid_info[m][‘slot‘])
                elif raid_info[m][‘raid_type‘]  == ‘raid_1‘:
                    self.raid_1(raid_info[m][‘raid_type‘],
                                raid_info[m][‘enclosure‘],
                                raid_info[m][‘slot‘])
                elif raid_info[m][‘raid_type‘]  == ‘raid_5‘:
                    self.raid_5(raid_info[m][‘raid_type‘],
                                raid_info[m][‘enclosure‘],
                                raid_info[m][‘slot‘])
                elif raid_info[m][‘raid_type‘]  == ‘raid_10‘:
                    self.raid_10(raid_info[m][‘raid_type‘],
                                raid_info[m][‘enclosure‘],
                                raid_info[m][‘slot‘])
时间: 2024-11-05 15:56:53

运维自动化之Cisco Dell 采用Python 方式实现自定义Raid 级别的相关文章

实战:基于Python构建运维自动化平台

导语: 今天与大家一起探讨如何基于Python构建一个可扩展的运维自动化平台,也希望能与大家一起交流,共同成长. 此次分享将通过介绍OMServer.OManager具备的功能.架构设计.模块定制.安全审计.C/S结构的实现等几个方面的内容来展开. 为什么选择Python? 默认安装且跨平台 可读性好且开发效率高 丰富的第三方库(开发框架.各类API.科学计算.GUI等) 社区活跃&众多开发者. Python在腾讯的现状,根据去年内部提交组件语言统计,除去2.3.4前端技术,Python在高级编

如何基于Python构建一个可扩展的运维自动化平台

嘉宾简介 刘天斯 从事互联网运维工作已13年,目前就职于腾讯-互动娱乐部,负责游戏大数据的运营,曾就职于天涯社区,担任首席架构师/系统管理员. 热衷开源技术的研究,包括系统架构.运维开发.负载均衡.缓存技术.数据库.NOSQL.分布式存储.消息中间件.大数据及云计算.Mesos.Docker.DevOps等领域.擅长大规模集群的运维工作,尤其在自动化运维方面有着非常丰富的经验.同时热衷于互联网前沿技术的研究,活跃在国内社区.业界技术大会,充当一名开源技术的传播与分享者. 导言 受 Reboot

<zz>Ansible 运维自动化 ( 配置管理工具 )

from http://www.cnblogs.com/wangxiaoqiangs/p/5685239.html 简介: 当下有许多的运维自动化工具( 配置管理 ),例如:Ansible.SaltStack.Puppet.Fabric 等. Ansible 一种集成 IT 系统的配置管理.应用部署.执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立. Ansible 基于 Python 语言实现,由 Pa

【有感而发】从中华武术谈运维工程师以及运维自动化

从中华武术谈运维工程师以及运维自动化 任何事物都没有完美一说,但是我们可以死磕自己,追求极致... 无论我们现在是搬砖呢,砌墙呢,还是在逗自己混日子,我们需要关注的是自己的方向在哪里,而不是过于在意自己当前的所站的位置,人生不能受限于自己的意识. 平时和小伙伴们聊人生谈理想的时候,我会经常和别人讲我所认为的专业化运维工程师和运维工作的方向,有认可的也有不认可的,认可的多在努力让自己的工作越来越轻松,自己的价值越来越能得到体现,不认可者多属于一天都很忙,而且认为运维就是帮开发人员打打杂,做大量重复

运维自动化方案

运维自动化简写 自动化运维主要包括以下几个方面: 系统安装 系统优化 系统监控 日志监控和收集 应用自动化部署 代码自动化部署 自动化测试 自动化更新 自动化扩容 配置文件管理 系统自动化安装和优化系统的自动化安装和优化,可以使用到自动化工具cobbler结合kickstart完成.优点: 可以完美支持linux和VMware的esxi系统 配置简单 可配置性强 可以基于mac地址的系统安装,全程无需人工干预 可以配置脚本,在安装系统完成之后可以同于yum源和安装上必须要的客户端软件,如salt

第20章,运维自动化之ansible

更多内容请点击: Linux学习从入门到打死也不放弃,完全笔记整理(持续更新,求收藏,求点赞~~~~) http://blog.51cto.com/13683480/2095439 本章内容: 运维自动化发展历程及技术应用 ansible 命令使用 ansible 常用模块使用 YAML语法简介 ansible playbook基础 playbook 变量,tags,handlers使用 playbook模板templates playbook 条件判断 when playbook 字典 wit

运维自动化之使用Cobbler自动化部署Linux操作系统

1.Cobbler是什么? Cobbler是一个Linux安装服务器,能够快速设置好网络安装环境.它实现了许多与Linux相关的任务的自动化和组合,因此你在部署新的(操作)系统或更改已经存在的操作系统时不需要在繁多的命令和应用程序之间来回切换.Cobbler能帮助(用户.管理者)置备和管理DNS.DHCP.软件包更新.电源管理.配置管理以及更多. "Cobbler is a Linux installation server that allows for rapid setup of netw

18页PPT带你深度解读运维自动化【转】

来自地址:[http://www.opsers.org/tech/18-pages-ppt-show-you-depth-interpretation-operations-automation.html] 说实话,一个运维团队的运维能力如何,其实看一个自动化管理系统便知! ********文章较长,索引目录如下******* 一.概述 二.运维自动化的三重境界 三.运维自动化的多维解读 ******第一.基于应用变更场景的维度划分 ******第二.基于系统层次的维度划分 ******第三.基

运维自动化之puppet3分钟入门

运维自动化之puppet3分钟入门 几个月前曾因为项目需求而学了点puppet的一些知识,最近因为要给别人讲一下,也就借此博文来做一下回忆,当然了,这个puppet用起来还是很不错的,尤其对我这种懒人来说,如果你需要给多台机器安装同一款软件或是同几款软件,那么学习这个能让你事半功倍,接下来开始学习puppet.那么问题来了: 什么是puppet 本着外事问谷歌,内事问百度的原则,我在百度百科里找到了对其的定义:puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有