后续此博客不再更新,欢迎大家搜索关注微信公众号“测开之美”,测试开发工程师技术修炼小站,持续学习持续进步。
例行化的工作,像复杂的配置管理、机械化的环境部署,可以用Ansible的playbook(剧本)功能。临时需要在远端机器执行命令时,可以使用Ansible的ad-hoc command(临时执行命令)功能。执行临时命令前,需要先配置Ansible管理的远端机器列表,我们先不深入机器管理的细节,以前一篇博文中定义的机器列表为例:
[example] a.example.com b.example.com在example组的机器上打印hello,Ansible主机以10并发处理任务:
$ ansible example -a "/bin/echo hello" -f 10 a.example.com | CHANGED | rc=0 >> hello b.example.com | CHANGED | rc=0 >> hello-f表示Ansible主机与远端机器连接的并发数,默认是5,修改ansible.cfg中forks项的配置可以修改并发数。 默认的command模块不支持Shell的管道、重定向、变量替换、;、&等特性,shell模块支持这些特性,例如:
$ ansible example -m shell -a 'echo $TERM' a.example.com | CHANGED | rc=0 >> xterm-256color b.example.com | CHANGED | rc=0 >> xterm-256color使用ad-hoc command,要注意Shell中单、双引号的使用,双引号相当于参数传递给ansible命令行前先在主机的Shell中替换了变量的值。 特别地,shell模块的creates参数指向一个文件,当文件已经存在时,shell模块参数中命令不会被执行。 ad-hoc command其实是对Ansible各种模块的调用,下面介绍一些常用的模块,这些模块在playbook中也会经常用到。
copy模块可以scp文件到远端机器:ansible example -m copy -a 'src=hosts dest=$HOME/mars/',如果目标目录dest不存在,Ansible会自动创建这个目录。ansible example -m copy -a 'src=hosts dest=$HOME/mars'会把执行ansible命令时当前目录的hosts文件拷贝到远端机器的$HOME目录,并重命名为mars(注意mars后面/的不同)。 file模块可以修改远端机器上的文件的权限和所有者属性,修改文件权限、所属者、所属组:ansible example -m file -a 'dest=/home/map/mars/hosts mode=611 owner=mars group=mars'。 创建目录(类似mkdir -p):ansible example -m file -a 'dest=$HOME/mars/test mode=744 owner=mars group=mars state=directory'。 递归地删除目录和文件:ansible example -m file -a 'dest=$HOME/mars/test state=absent'。
yum和apt模块分别支持远端机器yum和apt包管理器的操作。以yum为例: 安装软件:ansible example -m yum -a 'name=openssh state=present' 安装软件的指定版本:ansible example -m yum -a 'name=openssh-5.3p1 state=present' 安装软件的最新版本:ansible example -m yum -a 'name=openssh state=latest'。 卸载软件:ansible example -m yum -a 'name=acme state=absent' 如果使用的包管理器没有对应的Ansible模块,可以使用shell模块或者开发自己的模块。
user模块支持远端机器的用户管理。例如,创建用户:ansible example -m user -a 'name=mars3 group=mars create_home=yes home=/home/mars3 shell=/bin/bash password=saO3weE80EO9k state=present system=yes' -u mars --become --ask-become-pass,其中password是由如下Python程序生成的加密后的字符串:
import crypt crypt.crypt('123123', 'salt') #第一个参数是密码,第二个参数是加的盐删除用户:ansible example -m user -a 'name=mars3 state=absent' -u mars --become --ask-become-pass
git模块支持检出Git代码库,要求远端机器安装Git,版本>=1.7.1。需要提前在远端机器配置ssh公私钥,例如:ansible example -m git -a 'repo=ssh://mars@example.com:8000/test-project dest=$HOME/temp/ version=HEAD' -u mars。 git模块适用于Python、PHP等脚本语言应用的部署。
service模块支持管理服务状态。例如,启动服务:ansible example -m service -a 'name=crond state=started',重启服务:ansible example -m service -a 'name=sshd state=restarted',停止服务:ansible example -m service -a 'name=httpd state=stopped'。
长期运行的服务一般在后台运行,然后可以定期检查服务的运行状态。进程启动后,可以设置进程的超时时间(-B,单位为秒)和进程状态检查的轮询时间(-P,单位为秒,设置为0表示不轮询状态),如果进程在-B规定的时间内未正常对出,Ansible会报错并杀死进程:
$ ansible a.example.com -a 'watch ls' -B 3600 -P 0 -vvv ansible 2.7.0 … {"started": 1, "_ansible_suppress_tmpdir_delete": true, "finished": 0, "results_file": "/home/map/.ansible_async/70171713335.893", "ansible_job_id": "70171713335.893"}\r\n …我在ansible命令中加了-vvv参数查看ansible_job_id,由于实际显示太多所以用….代替了部分真实输出。 也可以用async_status主动同步服务状态,例如:
$ ansible a.example.com -m async_status -a 'jid=70171713335.893' a.example.com | SUCCESS => { "ansible_job_id": "70171713335.893", "changed": false, "finished": 0, "started": 1 }Ansible的参数(fact)指动态发现的远端系统的变量值,通常用来做不同机器的不同任务用。可以通过setup模块获取:ansible example -m setup。
至此,你已经可以使用Ansible完成简单的运维任务了,不过合格的运维还要掌握Ansible最强大的功能:playbook。在学习playbook前,我们先回过头来补充一下Ansible的机器资源列表的配置知识。
