awk命令之条件判断

在《运维实例:批量统计分区占用情况,并形成Excel报表》这篇文章里,我们用到了一条awk命令

$ df -hT
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda1      ext4    20G  4.9G   14G  27% /
tmpfs          tmpfs  127G     0  127G   0% /dev/shm
/dev/sda3      ext4   515G   45G  445G  10% /export
/dev/sdb       ext4   1.1T  476G  570G  46% /export/Data/jd_search

$ df -hT | grep /export | egrep -v '(bigtable)' | awk '{ print $5, $7 }'
445G /export
570G /export/Data/jd_search

$ df -hT | grep /export | egrep -v '(bigtable)' | awk 'END{ if(NR=1) print $5, $7; else if(NR=2 && $7=="/export/Data/jd_search") print $5, $7}'
570G /export/Data/jd_search

下面这条awk大意就是,如果有/export/Data/jd_search分区,则返回这个分区的剩余空间,否则就返回/export分区的剩余空间。

先说说这个END
在Unix awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。
任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

所以,下方命令可以用来统计文件的行数

$ awk 'END{print NR}' test1.sh

注意,这条命令里,如果没有END这个参数,则NR并不会输出行数。为什么,下面介绍一下NR。 继续阅读

Shell将换行符换成空格(sed)

Shell将换行符换成空格的办法,用sed和tr均可实现。

sed命令

cat country.txt | sed ':label;N;s/\n/ /;b label'

tr命令

cat country.txt | tr "\n" " "

把tab换成换行符

cat country.txt | sed 's/\t/\n/g'

awk 'BEGIN { OFS = "\n" } { $1=$1; print }' input.txt > output.txt

tr '\t' '\n' < input.txt > output.txt

参考文章:
Convert a tab-delimited file to use newlines
sed命令替换换行符

运维实例:批量统计分区占用情况,并形成Excel报表

假设有一天,你有一个任务,要统计线上所有服务器的/export分区占用情况,比如下面这一台服务器:

$ df -hT
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda1      ext4    20G  5.2G   13G  29% /
tmpfs          tmpfs  127G     0  127G   0% /dev/shm
/dev/sda3      ext4   514G  279G  209G  58% /export
/dev/sdb1      ext4   1.1T  518G  526G  50% /export/Data/jd_search

像这样一台服务器,除了有个/export分区,还有个/export/Data/jd_search(只有一部分机器有这个分区),现在要统计这2个分区的占用情况,并且最终形成Excel报表,要怎么操作呢?

1,使用批量脚本获得所有机器的/export分区占用情况
#准备远程机器列表

$ vim ip_list
10.191.172.201
10.190.143.38
10.187.110.4
10.190.49.237
10.190.198.192
10.190.163.211

使用ansible将本机的(admin用户的)key推送到所有机器上(的admin用户),实现从本机免密码登陆到所有机器

$ vim deploy_ssh_key.yml   #准备push ssh-key
- hosts: all
  remote_user: admin
  gather_facts: no

  tasks:
  - name: install ssh key
    authorized_key: user=admin
                    key="{{ lookup('file', '/home/admin/.ssh/id_rsa.pub') }}" 
                    state=present

继续阅读

运维实例:批量替换配置文件+批量重启服务

工作中遇到的一个小问题,记录一下。假设有一千台机器运行着nginx但每台机器上的nginx目录可能不太一样,比如
/export/servers/openresty-local/nginx/
/export/servers/openresty/nginx/
/export/servers/openresty-ngx-ump/nginx/
现在要替换掉nginx目录下的某个脚本,并且重启这个nginx服务。需要用到的工具有Ansbile和自己写的批量替换脚本batch_op.py

#准备远程机器列表
$ vim ip_list
10.191.172.201
10.190.143.38
10.187.110.4
10.190.49.237
10.190.198.192
10.190.163.211
#准备替换脚本
$ vim /tmp/b.sh
#!/bin/bash

if [ $(id -u) != "0" ]; then
    echo "Error: need root to run this script."
    exit 1
fi

a=`ps -ef | grep openresty | grep -v grep | awk '{ print $11 }' | cut -d\/ -f1,2,3,4`

if [ ! $a ]; then
    echo 'Error! Not found $a directory.'
elif [ -f $a/lualib/resty/nginx_diviner.lua ]; then
   cp $a/lualib/resty/nginx_diviner.lua $a/lualib/resty/nginx_diviner.lua.bak.`date +%Y%m%d%H%M%S` && \
   wget -q -O $a/lualib/resty/nginx_diviner.lua http://172.22.193.65:8003/nginx_diviner.lua && \
   chown admin:admin $a/lualib/resty/nginx_diviner.lua* && \
   $a/nginx/sbin/nginx -s reload && \
   echo "Found and replaced $a/lualib/resty/nginx_diviner.lua"
else
   echo "Not Found $a/lualib/resty/nginx_diviner.lua"
   exit 1
fi

if [ "$a" != "/export/servers/openresty" ] && [ -f /export/servers/openresty/lualib/resty/nginx_diviner.lua ]; then
   cp /export/servers/openresty/lualib/resty/nginx_diviner.lua /export/servers/openresty/lualib/resty/nginx_diviner.lua.bak.`date +%Y%m%d%H%M%S` && \
   wget -q -O /export/servers/openresty/lualib/resty/nginx_diviner.lua http://172.22.193.65:8003/nginx_diviner.lua && \
   chown admin:admin /export/servers/openresty/lualib/resty/nginx_diviner.lua && \
   echo "Extra Operation! also found and replaced /export/servers/openresty/lualib/resty/nginx_diviner.lua"
fi

继续阅读

为Nginx添加basic_auth

为Nginx添加basic_auth,意思就是访问页面的时候需要弹出来一个用户和密码验证的东西,本文基于CentOS 6

1, 安装密码生成工具htpasswd并生成用户密码文件

yum install httpd-tools               #适用centos
sudo apt-get install apache2-utils    #适用ubuntu

生成用户密码文件

$ htpasswd -c /var/www/html/.htpasswd user1  #回车会要求输入两遍密码,会清除所有用户!
$ htpasswd -bc /var/www/html/.htpasswd user1 password  #不用回车,直接指定user1的密码为password
$ htpasswd -b /var/www/html/.htpasswd user2 password   #添加一个用户,如果用户已存在,则是修改密码
$ htpasswd -D /var/www/html/.htpasswd user2  #删除用户

2, 为Nginx添加basic_auth配置

server {
	listen		80;
#	root		/tmp;
#	index		index.html index.htm;
	server_name	zhukun.net www.zhukun.net;

	location / {
		auth_basic		"input you user name and password";
		auth_basic_user_file	/export/servers/.htpasswd;
		proxy_pass http://127.0.0.1:9000;
	}
}

然后再次访问zhukun.net时便会弹出验证框要求输入用户名和密码。 继续阅读

Excel转换txt & 批量筛选IP & 批量扫描服务器信息

假设,有一个智障同事,发了一个Excel过来(里面含有多张表格),要求扫描里面所有的IP是否有网卡故障,比如下面这样的
Excel转换txt

先不说IP数量多少的问题,里面有多张表格,并且有多个列,每一列都有不少IP,IP呢,还有分为172开头的(物理机),和10开头的(Docker),看起来好像复杂死了。

这里说一下我的处理方式。

找一个Excel转换成JSON/TXT的工具(比如这个Excel To Formula View),转换以后的效果如下
Excel To Formula View 继续阅读

Linux指定yum使用proxy server

1,在第三方机器上建立一个proxy server
推荐使用这个Repo,一个其于Pyhon的小巧的HTTP/HTTPS代理服务器,体积仅有200K。

git clone https://github.com/inaz2/proxy2.git
cd proxy2
python proxy2.py 3128

这样,一个建立在3128端口上的HTTP/HTTPS代理就建立好了。

2,配置本机使用HTTP代理

$ export http_proxy=http://172.22.193.65:3128
$ export https_proxy=http://172.22.193.65:3128

然后,你会发现,yum/wget/ez_install可以正常使用了。

curl的话,可以使用如下命令使用proxy server

$ curl -L --fail https://github.com/docker/compose/releases/download/1.12.0/run.sh > ~/1.sh -x http://172.22.193.65:3128

3,解决yum提示[Errno 14] Peer cert cannot be verified or peer cert invalid
这种是由于proxy server上面的ca证书不被认可,解决方案为Adding “sslverify=false” in the ‘/etc/yum.conf’ file。

$ vim /etc/yum.conf  #添加或修改如下选项
sslverify=false

$ yum repolist all
第 5 页,共 152 页« 最新...345678...203040...最旧 »