如何写出健壮的 Bash 脚本

许多人用Shell脚本完成一些简单任务,而且变成了他们生命的一部分。不幸的是,shell脚本在运行异常时会受到非常大的影响。在写脚本时将这类问题最小化是十分必要的。本文中我将介绍一些让bash脚本变得健壮的技术。

使用set -u

你因为没有对变量初始化而使脚本崩溃过多少次?对于我来说,很多次。

1
2
3
chroot=$1
...
rm -rf $chroot/usr/share/doc

Ansible基础-Playbook入门

Paste_Image.png

1
2
3
4
难度指数: 4星(满星5星)
技术指数: 5星(满星5星)
理论指数: 4星(满星5星)
面向人群: 自动化运维&运维开发

1. Playbook简介

像很多其它配置文件管理方法一样,Ansible使用一种比较直白的方法来描述自己的任务配置文件。
Ansible 的任务配置文件被称之为“playbook”,我们可以称之为“剧本”。每一出剧本(playbook)中都包含一系列的任务,这每个任务在ansible中又被称为一出“戏剧”(play)。一个剧本(playbook)中包含多出戏剧(play),这很容易理解。

为了便于理解,再给大家举个栗子~

collectd

Introduction

Collecting and visualizing data is an important way to make informed decisions about your servers and projects.

In a previous guide, we discussed how to install and configure Graphite to visualize data on our servers. However, we didn’t have a good way of collecting or even passing data into Graphite.

In this guide, we’ll discuss the installation and use of collectd, a system statistics gatherer that can collect and organize metrics about your server and running services.

We will show you how to install and configure collectd to pass data into Graphite to render. We will assume that you have Graphite up and running on an Ubuntu 14.04 server as we showed you in the last guide.

Deploy Graphite with Grafana on Ubuntu 14.04(Part Ⅰ)

Graphite是一款企业级的监控工具,其采用Django框架,可以运行在廉价的硬件资源之上。Graphite采用简单的文本协议和绘图功能可以方便地使用在任何操作系统上。本文将以Ubuntu 14.04为系统环境,就Graphite与Grafana的安装与协作做详细介绍。

Before You Begin / 热身准备

1. Familiarize yourself with our Getting Started guide and complete the steps for setting your Linode’s hostname and timezone.
本文原文来自Linode官网,所以会看到Linode字样,不用理会,把它当成你的主机的就可以了

Python日期自然月加减实操

这段代码用于对数据库中两个表中不同形式的时间字段进行月份变更操作,月份的变更以自然月形式形式进行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/python
# By Gavin
# Date: 20190909
# Decription: 实现日期的自然月相加减,比如8月31号加一个月是9月30,而不是9月31号或10月1号
import time
import MySQLdb
import math,datetime

def _add_month_interval(dt,inter):
m=dt.month+inter-1
y=dt.year
y=dt.year+int(m/12)
m=m % 12 +1
return (y,m)

def add_month_interval(dt,inter):
y,m=_add_month_interval(dt,inter)
y2,m2=_add_month_interval(dt,inter+1)
maxD=( datetime.date(y2,m2,1)-datetime.timedelta(days=1) ).day
d= dt.day<=maxD and dt.day or maxD
#return datetime.date(y,m,d)
return(y,m,d)

def add_year_interval(dt,inter):
return add_month_interval(dt,inter*12)
# 上面三个函数与业务无关,可直接嫁接使用

# inter为需要变更的月数,需要加一个月就写1,减两个月就写-2
def update_metric(inter):
conn=MySQLdb.connect(host='localhost',user='root',passwd='root',db='gavin',port=3306)
cur=conn.cursor()
cur.execute('select date from metric_impressions order by date desc')
#此时获取到的结果为元组
results = cur.fetchall()
#将元组转换为列表
result=list(results)
for now_date in result:
# now_date[0]格式形如:2016-09-21 12:03:23
timeArray = time.strptime(str(now_date[0]), "%Y-%m-%d %H:%M:%S")
# time.strptime处理过的数据结构(元组)不能被重新赋值
# 所以这里需要将其转化为列表
timeArray = list(timeArray)
dt = datetime.date(timeArray[0],timeArray[1],timeArray[2])
timeArray[0],timeArray[1],timeArray[2] = add_month_interval(dt,inter)
new_date = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
print "new_date:{} now_date:{}".format(new_date, now_date[0])
sql = 'update metric_impressions_hour set date="{}" where date="{}"'.format(new_date, now_date[0])
cur.execute(sql)
conn.commit()
conn.close()

def update_compaign(inter):
conn=MySQLdb.connect(host='localhost',user='root',passwd='root',db='gavin',port=3306)
cur=conn.cursor()
cur.execute('select data_date from campaign order by data_date desc')
results = cur.fetchall()
result=list(results)
for now_date in result:
# now_date[0]格式形如:20160921
timeArray = time.strptime(str(now_date[0]), "%Y%m%d")
timeArray = list(timeArray)
dt = datetime.date(timeArray[0],timeArray[1],timeArray[2])
timeArray[0],timeArray[1],timeArray[2] = add_month_interval(dt,inter)
new_date = time.strftime("%Y%m%d", timeArray)
print "new_date:{} now_date:{}".format(new_date, now_date[0])
sql = 'update campaign_stats set data_date="{}" where data_date="{}"'.format(new_date, now_date[0])
print sql
cur.execute(sql)
conn.commit()
conn.close()

update_compaign(1)