如约签约了新东家,环境很不错,同事人都很随和,领导也很好说话,加班福利很赞,总而言之,新的开始,好好工作,多多挣钱。


批处理工具我最早接触的是pssh,因为它实在很简单粗暴,但是它由于太简单粗暴了,应付十台二十台机器还OK,应付五十台一百台服务器就心有余力不足了(而且xshell右键有一个“发送键入到所有会话”的功能,与pssh效果几乎一样),而且我还不太喜欢puppet,总觉得那玩意跟我八字不合,于是乎,在新头头的推荐下,我把目光放在了Ansible。


Ansible的安装很简单,在Redhat环境下直接#yum install ansible -y就行。Redhat已经将Ansible公司收购了,所以在安装上提供了不小的便利。


Ansible在安装完毕之后,会在/etc/ansible/目录下看见一个叫hosts的文件,这里是所有你要控制的服务器的ip们,可以排列写,比如:

192.168.1.122

192.168.1.133

192.168.1.144

也可以分组写,比如:

[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这个脚本,而14.37这台机器上并不一定要有。


参考资料:http://blog.csdn.net/iloveyin/article/details/46982023