DevOps 工具-代码部署脚本

Neo Chen (netkiller)

<openunix@163.com>

版权 2011, 2012 http://netkiller.github.com

摘要

本程序用于收集,防火墙,路由器,交换机等日志

下面是我多年积累下来的经验总结,整理成文档供大家参考:

 

Netkiller Architect 手札 Netkiller Linux 手札 Netkiller Developer 手札 Netkiller Database 手札
Netkiller Debian 手札 Netkiller CentOS 手札 Netkiller FreeBSD 手札 Netkiller Shell 手札
Netkiller Web 手札 Netkiller Monitoring 手札 Netkiller Storage 手札 Netkiller Mail 手札
Netkiller Security 手札 Netkiller PostgreSQL 手札 Netkiller MySQL 手札 Netkiller LDAP 手札
Netkiller Cryptography 手札 Netkiller Intranet 手札 Netkiller Cisco IOS 手札 Netkiller Writer 手札
Netkiller Version 手札 Netkiller Studio Linux 手札  

 

 

 

 

Bash代码  

  1. #!/bin/bash  
  2. #####################################################################  
  3. # Description: Automation Deployment Script   
  4. #              Netkiller series utilities  
  5. # Author: Neo<openunix@163.com>  
  6. # Homepage: http://netkiller.sourceforge.net/  
  7. # $Id$  
  8. #####################################################################  
  9.   
  10. if [ -z $DEPLOY_HOME ]; then  
  11.     echo 'Example: export DEPLOY_HOME=/srv/deploy'  
  12.     exit  
  13. fi  
  14. if [ -f $DEPLOY_HOME/conf/default.conf ];then  
  15.     . $DEPLOY_HOME/conf/default.conf  
  16. fi  
  17.   
  18. #================================================================================  
  19.   
  20. LOGFILE="deploy.$(date -d "today" +"%Y-%m-%d").log"  
  21. TMPDIR=$(mktemp -d --suffix=.tmp -p /tmp deploy.XXXXXX)  
  22.   
  23. #SUBVERSION=  
  24. SVN=/usr/bin/svn  
  25.   
  26. TIMEPOINT=`date '+%Y%m%d-%H%M%S'`  
  27. BACKUPDIR=$TMPDIR/backup/${TIMEPOINT}  
  28. RSYNC="rsync"  
  29. UPLOAD_DIR=$TMPDIR  
  30. REVISION=''  
  31. #================================================================================  
  32.   
  33. if [ ! -d ${TMPDIR} ]; then  
  34.     mkdir ${TMPDIR}  
  35. fi  
  36.   
  37. if [ ! -d ${BACKUPDIR} ]; then   
  38.     mkdir -p $BACKUPDIR  
  39. fi  
  40.   
  41. #pkgname=${project}-${version}-${datetime}.pkg  
  42. #tar jcvf ${pkgname} /tmp/${project} --remove-files >> deploy.log  
  43. #####################################################################  
  44.   
  45. function usage(){  
  46. echo $"Usage: $0 [OPTION] <server-id> <directory/timepoint>"  
  47. echo -ne "  
  48. OPTION:  
  49.   
  50.         deploy <domain> <host>  
  51.         revert <domain> <host> <revision>  
  52.         backup <domain> <host> <directory>  
  53.   
  54.         list  
  55.         list <domain> <host>  
  56.   
  57.         import <domain> <host> <dir>  
  58.         export <domain> <host> <dir>  
  59.       
  60.     clean <domain> <host>     
  61.     log <project> <line>  
  62.   
  63.         conf list  
  64.         conf new <project>  
  65.         conf remove <project>  
  66.         conf show <project>  
  67.         conf edit <project>        
  68.   
  69.     cron show  
  70.     cron setup  
  71.     cron edit  
  72. "  
  73.   
  74.     exit  
  75. }  
  76.   
  77. function logging(){  
  78.         local logfile="$LOGDIR/$LOGFILE"  
  79.         local timepoint=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")  
  80.         local status=$1  
  81.         local message=$2  
  82.         echo "[$timepoint] [${status}] ${message}" >> $logfile  
  83. }  
  84. #logging 'OK' 'This is test msg!!!'  
  85.   
  86. function conf(){  
  87.     local cmd=$2  
  88.     local prj=$3  
  89.     case $cmd in  
  90.         list)  
  91.             ls $SYSCONFDIR  
  92.             ;;  
  93.         new)  
  94.             read -p "Project directory: " prjdir  
  95.             if [ -z $prjdir ]; then  
  96.                 exit  
  97.             fi  
  98.             if [ -f $SYSCONFDIR/$prjdir.conf ]; then  
  99.                 echo "cannot create config $prjdir.conf': File exists"  
  100.                 exit 1  
  101.             fi  
  102.   
  103.             read -p "subversion url: $REPOSITORIES/: " svnurl  
  104.             if [ -z $svnurl ]; then  
  105.                 svnurl=$REPOSITORIES  
  106.             fi  
  107.             read -p "hostname: " host  
  108.             if [ -z $host ]; then  
  109.                 host="localhost"  
  110.                 echo "default hostname 'localhost'"  
  111.             fi  
  112.             read -p "upload mode ftp/scp/sftp/rsync: " mode  
  113.             if [ -z $mode ]; then  
  114.                 mode=ftp  
  115.             else  
  116.                 case $mode in  
  117.                     ftp)  
  118.                         mode="ftpdeploy"  
  119.                         ;;  
  120.                     scp)  
  121.                         mode="scpdeploy"  
  122.                         ;;  
  123.                     sftp)  
  124.                         mode="sftpdeploy"  
  125.                         ;;  
  126.                     rsync)  
  127.                         mode="rsync"  
  128.                         ;;  
  129.                 esac  
  130.             fi  
  131.             read -p "Create $prjdir config? [y/n]" -n 1 key  
  132.             echo  
  133.             if [ $key = 'y' ]; then  
  134.                 echo -ne "REPOSITORIES=$REPOSITORIES/$svnurl  
  135. COMMAND=$mode  
  136. HOSTNAME=$host  
  137.                 " >> $SYSCONFDIR/$prjdir.conf  
  138.             fi  
  139.             ;;  
  140.         remove)  
  141.             if [ -f $SYSCONFDIR/$prj ]; then  
  142.                 rm -rf $SYSCONFDIR/$prj  
  143.             fi  
  144.             ;;  
  145.         show)  
  146.             cat $SYSCONFDIR/$prj  
  147.             ;;  
  148.         edit)  
  149.             vim $SYSCONFDIR/$prj  
  150.             ;;  
  151.         *)  
  152.         usage  
  153.         ;;  
  154.     esac  
  155.   
  156. }  
  157.   
  158.   
  159. #####################################################################  
  160.   
  161. function config {  
  162.     local cfg=$1  
  163.     exclude_from=$PREFIX/exclude/${cfg}.lst  
  164.     include_from=$PREFIX/include/${cfg}.lst  
  165.   
  166.     if [ -f $SYSCONFDIR/${cfg}.conf ];then  
  167.         . $SYSCONFDIR/${cfg}.conf   
  168.     else  
  169.         echo "Please provide the config($SYSCONFDIR/${cfg}.conf) to deploy!"  
  170.         exit  
  171.     fi  
  172.     if [ -z "$cfg" ]; then  
  173.         echo "Please provide the path for deploy!"  
  174.         exit  
  175.     fi  
  176.   
  177.     if [ ! -f $exclude_from ]; then  
  178.         echo "Please provide a list of excluded in the $exclude_from."  
  179.         exit  
  180.     fi  
  181.     if [ ! -f $include_from ]; then  
  182.         echo "Please provide a list of included in the $include_from."  
  183.         exit  
  184.     fi  
  185. }  
  186.   
  187. function deploy() {  
  188.   
  189.     local domain=$2  
  190.     local host=$3  
  191.     local logfile=${LOGDIR}/${host}.${domain}.log  
  192.       
  193.     if [ -z $domain ]; then  
  194.         usage  
  195.     fi  
  196.       
  197.     config ${domain}/${host}  
  198.   
  199.     project=$SRCDIR/${domain}/$host.${domain}  
  200.    
  201.     SVN_OPTS=${REVISION}      
  202.     if [ -d ${project} ]; then   
  203.         $SVN update ${SVN_OPTS} $project >> $logfile  
  204.         logging 'update' ${project}  
  205.     else  
  206.         mkdir -p ${project}  
  207.         $SVN checkout ${REPOSITORY} ${project} >> $logfile  
  208.         logging 'checkout' ${project}   
  209.     fi  
  210.       
  211. #    $BINDIR/$COMMAND deploy $HOSTNAME $UPLOAD_DIR/$ver/      
  212.   
  213.     RSYNC_OPTS=" -azvP --backup --backup-dir=${BACKUPDIR} --exclude=.svn --log-file=${logfile} --exclude-from=$exclude_from --include-from=$include_from"  
  214.   
  215.     if [ -f ${LIBEXECDIR}/${domain}/${host}/before ];then  
  216.         /bin/sh ${LIBEXECDIR}/${domain}/${host}/before  
  217.     fi  
  218.   
  219.     find $SRCDIR/* -type f -name "Thumbs.db" -exec rm -rf {} \;  
  220.   
  221.     for addr in ${REMOTE}   
  222.     do  
  223.         case ${MODE} in  
  224.             FTP)  
  225.             ftpdeploy  
  226.             ;;  
  227.                     SCP)  
  228.                         scp -ar ${project}/* ${addr}:${DESTINATION}  
  229.                         ;;  
  230.                     SFTP)  
  231.                         sftpdeploy  
  232.                         ;;  
  233.                     RSYNC)  
  234.                         $RSYNC $RSYNC_OPTS $OPTION ${project}/* ${addr}::${DESTINATION}  
  235.                         ;;  
  236.                     "RSYNC+SSH")  
  237.                         $RSYNC $RSYNC_OPTS ${project}/* ${addr}:${DESTINATION}  
  238.                         ;;  
  239.                 esac  
  240.         if [ -d ${SHAREDIR}/current/${domain}/${host}/ ]; then  
  241.             cp -a ${SHAREDIR}/current/${domain}/${host}/* ${project}/  
  242.         fi  
  243.         if [ -z "${REVISION}" ]; then  
  244.             logging 'revert' "${project} => ${addr}:${DESTINATION}"  
  245.         else  
  246.             logging 'deploy' "${project} => ${addr}:${DESTINATION}"  
  247.         fi  
  248.     done  
  249.           
  250.         if [ -f ${LIBEXECDIR}/${domain}/${host}/after ];then  
  251.         #ssh ${scp} < ${LIBEXECDIR}/${domain}/${host}/after  
  252.         exit  
  253.     fi  
  254.       
  255. }  
  256.   
  257. function revert() {  
  258.   
  259.     local domain=$2  
  260.     local host=$3  
  261.     local revision=$4  
  262.       
  263.     if [ -z $domain ]; then  
  264.         usage  
  265.     fi  
  266.       
  267.     if [ -z $host ]; then  
  268.         usage  
  269.     fi  
  270.       
  271.     if [ -z $revision  ]; then  
  272.         usage  
  273.     else  
  274.     REVISION="-r ${revision}"  
  275.     fi  
  276.     #echo $domain , $host, $dir; exit  
  277.   
  278.       
  279.     deploy $@  
  280. }  
  281.   
  282. function import(){  
  283.     local domain=$2  
  284.     local host=$3  
  285.     local dir=$4  
  286.       
  287.     if [ -z $domain ]; then  
  288.         usage  
  289.     fi  
  290.       
  291.     if [ -z $host ]; then  
  292.         usage  
  293.     fi  
  294.       
  295.     if [ -z $dir ]; then  
  296.         usage  
  297.     fi  
  298.       
  299.     config ${domain}/${host}  
  300.   
  301.     $SVN import $dir ${REPOSITORY} >> $logfile  
  302. }  
  303. function export(){  
  304.   
  305.     local domain=$2  
  306.     local host=$3  
  307.     local dir=$4  
  308.       
  309.     if [ -z $domain ]; then  
  310.         usage  
  311.     fi  
  312.       
  313.     if [ -z $host ]; then  
  314.         usage  
  315.     fi  
  316.       
  317.     if [ -z $dir ]; then  
  318.         usage  
  319.     fi  
  320.       
  321.     config ${domain}/${host}  
  322.       
  323.     local logfile=${LOGDIR}/${host}.${domain}.log  
  324.       
  325.     $SVN export --force ${REPOSITORY} ${dir} >> $logfile  
  326.       
  327.     logging 'export' "${TRUNK} to ${dir}"  
  328. }  
  329.   
  330.   
  331. function timepoint {  
  332.     echo $TIMEPOINT >> timepoint.log  
  333. }  
  334.   
  335. function unstable {  
  336.     local edition=$(basename $unstable)  
  337.     svn export ${unstable} ${src}/$edition  
  338.   
  339.     for ignore in $( cat excluded.lst ); do  
  340.         rm -rf ${src}/$edition/$ignore  
  341.     done  
  342.   
  343.     $RSYNC ${src}/$edition ${destination}  
  344.   
  345.     ssh ${remote} < script/unstable  
  346. }  
  347.   
  348. function clean() {  
  349.     local domain=$2  
  350.         local host=$3  
  351.     if [ -z $domain ]; then  
  352.         usage  
  353.     fi  
  354.   
  355.     if [ -z $host ]; then  
  356.         usage  
  357.     fi  
  358.   
  359.     local project=$SRCDIR/${domain}/$host.${domain}  
  360.   
  361.     rm -rf ${project}  
  362. }  
  363.   
  364. function list {  
  365.     local domain=$2  
  366.     local host=$3  
  367.     local dir=$4  
  368.     if [ -z $domain ]; then  
  369.         ls $SRCDIR/*  
  370.     exit  
  371.     fi  
  372.   
  373.     if [ -z $host ]; then  
  374.         usage  
  375.     fi  
  376.   
  377.     config ${domain}/${host}  
  378.   
  379.     svn ls ${REPOSITORIES}/$dir #| awk -F '/' '{print $1}'  
  380.   
  381. }  
  382.   
  383. function backup() {  
  384.     local domain=$2  
  385.     local host=$3  
  386.     local dir=$4  
  387.   
  388.     if [ -z $domain ]; then  
  389.     usage  
  390.     fi  
  391.   
  392.     if [ -z $host ]; then  
  393.         usage  
  394.     fi  
  395.   
  396.     local logfile=${LOGDIR}/${host}.${domain}.log  
  397.   
  398.     config ${domain}/${host}  
  399.   
  400.     if [ -z $dir ]; then  
  401.         dir=$TMPDIR  
  402.     fi  
  403.   
  404.     for addr in ${REMOTE}  
  405.     do  
  406.     dir=$dir/${addr}  
  407.         if [ ! -d ${dir} ]; then  
  408.             mkdir -p $dir  
  409.         fi  
  410.   
  411.         $RSYNC -auzvP $OPTION ${addr}::${DESTINATION} $dir >> ${logfile}  
  412.   
  413.     logging 'backup' "rsync://${addr}::${DESTINATION} to ${dir}"  
  414.   
  415.         echo 'Backup Directory:' $dir  
  416.     exit  
  417.     done  
  418.   
  419. }  
  420. function cron(){  
  421.     local fun=$2      
  422.     case ${fun} in  
  423.         show)  
  424.             crontab -l  
  425.             ;;  
  426.         setup)  
  427.             cat $PREFIX/cron.d/crontab | crontab  
  428.             ;;  
  429.         edit)  
  430.             vim $PREFIX/cron.d/crontab  
  431.             cat $PREFIX/cron.d/crontab | crontab  
  432.             ;;  
  433.         *)  
  434.             usage  
  435.             ;;  
  436.     esac  
  437.   
  438. }  
  439.   
  440. function files {  
  441.     local project_dir=$1  
  442.     local project=$2  
  443.     if [ -z "$2"  ]; then  
  444.         echo "Please provide the project name for deploy!"  
  445.     else  
  446.         config ${project}  
  447.         exclude_from=exclude/${project}.lst  
  448.         include_from=include/${project}.lst  
  449.         $RSYNC --exclude-from=$exclude_from --include-from=$include_from ${project_dir} ${remote}  
  450.         ssh ${scp} < script/${project}   
  451.         timepoint  
  452.     fi  
  453. }  
  454.   
  455. function help {  
  456.     echo $"Usage: $0 {list|clean}"  
  457.     echo $"       $0 subversion <project>"  
  458. #    echo $"       $0 files <path> <project>"  
  459.     echo $"       $0 revert <project> <time>"  
  460. }  
  461. case "$1" in  
  462.     deploy)  
  463.         deploy $@  
  464.         ;;  
  465.     revert)  
  466.         revert $@  
  467.         ;;        
  468.     import)  
  469.         import $@  
  470.         ;;  
  471.     export)  
  472.         export $@  
  473.         ;;    
  474.     backup)  
  475.         backup $@  
  476.         ;;  
  477. #    switch)  
  478. #       switch $2  
  479. #        ;;  
  480.     cron)  
  481.         cron $@  
  482.         ;;        
  483. #    files)  
  484. #        files $2 $3  
  485. #        ;;  
  486.     clean)  
  487.         clean $@  
  488.         ;;  
  489.     list)  
  490.         list $@  
  491.         ;;  
  492.     log)  
  493.         ls -1 $LOGDIR/*  
  494.         ;;  
  495.     conf)  
  496.         conf $@  
  497.         ;;        
  498.     *)  
  499.         usage  
  500.         exit 1  
  501.           
  502. esac  
时间: 2024-09-09 19:58:16

DevOps 工具-代码部署脚本的相关文章

代码部署脚本

Deployment Installation https://github.com/netkiller/deployment.git $ git clone https://github.com/netkiller/deployment.git $ chmod 755 -R deployment $ export DEPLOY_HOME=~/deployment   export DEPLOY_HOME=/home/user/deployment 使用说明 neo@ubuntu:~/deplo

警惕文化空谈的陷阱,落地DevOps工具才是关键

恍惚间,DevOps已经被讨论十年了 本文讲的是警惕文化空谈的陷阱,落地DevOps工具才是关键,"如果系统是集中式的.环境是同质化的,从开发环境向生产环境推送程序变化的过程非常简单,不需要太多的自动化:但是今天的应用需要7×24小时运行.采用分布式架构.部署到多种环境,变更过程变得愈加复杂.难以自动化--不论在大型组织还是小型组织,施行DevOps在技术上都非常具有挑战性." 上面这段文字如果放在今天,那只是段关于DevOps的.稀松平常的讨论,但是如果它写于十年前,各位读者会不会感

【DevOps&amp;SRE活动实录】经验+案例,教你如何打造易用DevOps工具链!

6月10日,优维科技与数人云.中生代联合举办了DevOps&SRE超越传统运维之道(北京站).DevOps&SRE上海站将于7月15日举办,敬请期待! 任发科老师在此次活动中分享了<如何打造易用的DevOps工具链>,以下为演讲实录. 任发科 网名常新居士.曾任职于唯品会.会唐网.亚马逊和ThoughtWorks,是QCON,TOP100Summit,TiD优秀讲师,近年主要关注和从事DevOps工具链设计与实现,并长期从事和关注高效研发团队的组件和管理,译作有<DevO

Web Scale IT 与 6 种 DevOps 工具

新年伊始,在总结过去一年 IT 行业变化和发展的同时,不少企业更关注未来一年甚至几年的行业趋势.Gartner 于 2014 年发表了文章 Gartner Says By 2017 Web-Scale IT Will Be an Architectural Approach Found Operating in 50 Percent of Global Enterprises 表示: 截止至 2017 年,全球 50% 的企业将使用 Web Scale IT 架构. 在 2016 年年初,我们回

10年研发老兵:如何构建适合自己的DevOps工具与平台

 任发科高级研发经理  曾任职亚马逊中国SDE和SDM,十年以上企业软件架构开发和管理经验,曾负责多个大型项目的架构设计和研发.实施.运营和维护.   大家好,首先感谢社群提供这样一个分享机会,与大家共同进步学习.今天我带来的主题是<从持续部署到统一部署:系统设计思路及要点>,重点探讨DevOps以及统一部署,内容将涉及到: 分析流行运维工具如Ansible 探讨常见的运维系统的架构与实现 DevOps元数据的概念 从开发到上线的软件开发周期的各环节探索DevOps平台的产生 如何构建适合自己

Windows管理员不可错过的那些卓越DevOps工具(下)

毫无疑问,没有自动化机制的配合,DevOps将无从谈起.虽然不同企业实现DevOps的实际流程大相径庭,但基本分歧点往往始于操作系统.各类DevOps工具在Windows与Linux上的表现区别明显,特别是在可用选项方面. 在本系列文章的上一部分中,我们已经探讨了Windows阵营下的IDE与源码控制类方案.而在今天的文章里,我们将继续讨论,且主要着眼于构建与发布.配置管理和测试框架三个方面. 一.构建与发布 DevOps的前提在于以快节奏方式为用户交付高质量软件服务.为了实现这一目标,企业必须

云计算厂商的DevOps工具模型大评估

软件即服务(SaaS)可能是三大云计算业务模式中最引人注目和最具盈利能力的,因为它为客户提供了取代大部分技术支持类型成本的功能,并可直接销售给消费者.但是SaaS的成功并不是一帆风顺的.如果不使用DevOps工具和原则,那么建设和维护SaaS应用程序的任务就将快速成为云计算供应商们的运营噩梦.这些问题的最大来源在于:为部署在云计算环境中的服务实现全生命周期过程的自动化. 云计算要求新的配置策略 在云计算的早期发展阶段,SaaS部署的很多工作都必须通过手工或开发内部自动化软件来完成.对于运营商们来

Kubernetes 1.4:一个DevOps工具管理所有的容器

本文讲的是Kubernetes 1.4:一个DevOps工具管理所有的容器[编者的话]有很多的DevOps工具管理容器,但Kubernetes迅速成为其中的佼佼者. 以Docker为代表的容器技术,是IT的未来.但如何管理容器,依然是一个问题.随着技术的发展,谷歌的开源工具Kubernetes迅速成为容器管理领域的领导者.它被越来越多的机构当做容器管理领域的首选平台.Canonical.Red Hat.SUSE都认为Kubernetes将会是容器的DevOps领域的未来. 为什么这样说?Kube

你的DevOps工具多样化了吗?

大多数组织都希望能够快速地从负责IT平台的团队获得反馈.尽管IT对于企业的运作至关重要,但它要远比推动者具有更强大的业务约束力. 事实证明,关键业务应用程序开发的瀑布式方法无法解决该问题.而DevOps是一种旨在得到快速反馈的方法,开发者快速地将代码提供给运营基础设施,这样就可以使IT在问题发生时及时作出响应. 你的DevOps工具多样化了吗? 具有循序渐进.持续集成和交付的DevOps思维模式对于消费者来说非常熟悉,但是在企业环境中进行应用测试和培训时却面临着挑战.在完整的DevOps工具列表