开篇的废话
批处理工具我最早接触的是pssh,因为它实在很简单粗暴,但是它由于太简单粗暴了,应付十台二十台机器还OK,应付五十台一百台服务器就心有余力不足了(而且xshell右键有一个“发送键入到所有会话”的功能,与pssh效果几乎一样),而且我还不太喜欢puppet,总觉得那玩意跟我八字不合,于是乎,在新头头的推荐下,我把目光放在了Ansible。
Ansible的安装很简单,在Redhat环境下直接yum install -y ansible
就行。Redhat已经将Ansible公司收购了,所以在安装上提供了不小的便利。
Ansible在安装完毕之后,会在/etc/ansible/
目录下看见一个叫hosts的文件,这里是所有你要控制的服务器的ip们,可以排列写,比如:
1
2
3192.168.1.122
192.168.1.133
192.168.1.144
也可以分组写,比如:
1
2
3
4
5
6
7[aliyun]
10.22.33.44
10.22.33.45
[jinshanyun]
121.23.45.66
121.23.45.67
121.23.45.68:2222 (这个不是使用ssh默认的22端口,就需要特别指出)
默认情况下,Ansible会把命令全用于这个hosts文件,比如
ansible all -m ping -u ashin
这句话意思是整个hosts里的机器以ashin账户启动,而且都要ping 一下当前本机。
具体语句
怎么连接主机与要控制的远程机器请按之前写的“http://chenx1242.blog.51cto.com/10430133/1763978”一文进行操作,这里先说几个命令语句:
1)ansible all -m shell -a "/bin/echo hello"
对hosts里所有的机器一起使用”输出hello这个文字”。-m shell可以忽略不写,但是不是shell而是其他的模块就要写出来;
2)ansible aliyun -m copy -a "src=~/projects/tests/t.py dest=~"
把hosts里aliyun组的机器的/projects/tests/t.py复制到~目录下;
[注意!]copy模块不支持变量路径,也就是说如果目标服务器的部署路径不同,copy不会很智能的去访问.bash_profile来得到用户的自定义变量,写变量替换路径是不会达到目的的。
3)ansible jinshanyun[0:9] -i -m file -a "dest=~/tests state=absent"
把hosts里jinshanyun组中从0~9这十台机器的/tests文件夹删除掉,absent是“缺席,不在”的意思;
4)ansible 192.168.1.133 -m ping
这句话=ping 192.168.1.133
;
5)ansible v1 -m service -a "name=mysql state=started" -u ashin --sudo -K
以用户名为ashin登陆hosts里所有v1组的机器,然后检查mysql是否是started状态,若不是就start,同时要输入root的密码作为确认;
6)ansible 10.11.22.* -m user -a "name=foo password=foo" --sudo -K
hosts文件里所有10.11.22开头的机器,都要添加一个新的用户名foo,同时密码是foo,并且输入root密码确认身份;
7)ansible v1:!v2 -m apt -a "name=git state=latest"
检查所有属于v1组同时还不属于v2组的机器里的git文件是否是最新版本;
8)ansible webservers:&dbservers -a "/sbin/reboot" -f 10 --sudo -K
重新启动既是webservers组又是dbservers组的所有机器;
9)ansible webservers -m raw -a 'yum -y install python-simplejson'
用ansible去链接低版本的centos时,就乎出现“ansible requires a json module, none found! ”的错误,需要远程机安装samplejson包。raw模块是靠底层ssh的通讯,不依靠python的模块,所以如果碰到低版本的系统,如果command和shell模块无法使用,可以先用这条命令安装完需要的包。
10)ansible all -m synchronize -a "src=/chenshuo/1.sh dest=/chenshuo delete=yes"
synchronize原意是“同步”,而这个模块是分发模块,这句话的意思是把控制端的/chenshuo/1.sh分发给host文件里的所有ip服务器,delete=yes意思是以控制端服务器的文件为准。
11)ansible 10.168.194.89 -m synchronize -a "mode=pull src=/chenshuo/nba.txt dest=/chenshuo/a.txt"
将10.168.194.89这台服务器上的/chenshuo/nba.txt拉到控制服务器的/chenshuo文件夹下,顺便改名叫a.txt。
12)ansible all -m get_url -a "url=https://pypi.python.org/packages/56/2b/9c9c113fb88082950067a42cc99e3c61f1df72035f89bb0bdf0a60308ca0/pexpect-4.1.0.tar.gz#md5=562a1a21f2a60b36dfd5d906dbf0943e dest=/chenshuo"
把那一大串网址的下载连接下载到host文件里的所有ip的/chenshuo文件夹下。
13)ansible 10.117.14.37 -m script -a "/chenshuo/free.sh"
在10.117.14.37上执行操作端的free.sh,注意操作端必须要有free.sh这个脚本,而10.117.14.37这台机器上并不一定要有。