先说说playbooks是什么吧?
翻译成中文叫剧本,剧本是干嘛的?想必大伙都知道,剧本是咱们演电影,演电视剧的时候,大伙都要根据剧本来,然后把电影,电视剧给演好。
OK,ansible里的playbooks其实和salt-stack里面的state差不多,都是在管理端定义好的一条条的策略。
那这个策略是干啥用的呢?策略是想要让我们远端的机器达到一种什么样的状态,比如说咱们刚装好的一台机器上,啥都没有。这时候我们在策略里面定义,apache是installed的,mysql也是installed的。
咱们这样定义好了,然后执行一下playbooks。客户端就会达到我们定义的这种installed状态。
显然,如果咱们想要演好一部大戏,一个好的剧本是必不可少的。
playbooks和咱们前面玩的命令行执行的有啥区别呢? 其实playbooks里面真正干活的,还是一个个的模块,不过命令行的那个好比单兵作战,而playbooks是有组织有纪律的集团军作战。
OK,下面看看怎么玩playbooks吧。
mark个ansible一个官方例子地址
https://github.com/ansible/ansible-examples
https://github.com/ansible/ansible-examples/blob/master/language_features/ansible_pull.yml
看一下,楼主的一个简单的小例子吧
简单描述一下,每一行是做什么的?
第1行,起始标志,写不写无所谓,官网写了
第2行,定义这个play要作用的主机,多个主机或者多个组的话,用":"分开,也可以用咱们前面的那种正则的形式匹配主机。
第3行,定义了此play在remote端执行时,使用哪个用户执行。楼主这里用一个变量表示,待会可以在命令行输入此变量
第4到8行,可以在play里面定义变量,显然这个变量是局部的,只能在此play里使用。
第9行,task起始标志,可以在里面定义1个或多个task
第10行,为task定义一个name,这样我们执行的时候,会很直观的在终端上打印,不定义name也ok,执行的时候,ansible会默认打印一个action的提示,这样的话,不利于我们观察task执行过程。
第11行,就是真正干活的模块了,shell和command模块,后面的参数,直接写就OK,而其他模块的参数,都要遵循key=value的形式,如第17行和23行。还有就是,ansible里的模块,好像命令行和playbooks里面都是通用的,不像salt-stack里面,命令行的模块和state里面模块是完全分离,不能混用的。
第12行,表示上面的这个模块执行的结果,如果不为0,不加ignore_errors话,出现错误,playbook就不执行了。 加上ignore_errors的话,出现错误,会忽略并继续执行。 当然也可以在shell,command模块中, 使用 shell: /bin/123 || /bin/true的形式。
第13行,register,把上一个模块执行的结果,保留在result(名字可以任意)这个变量里面,result变量常用的有result.stdout,result.err,result.rc等属性。这一特性,说明ansible能够保留前面task执行的结果,在后面的task里面可以利用这一结果。
第14行,debug,打印的意思。。。把result的stdout给打印出来。 debug后面要遵循,msg=''这种结构
18行,使用sudo,这个sudo只针对当前task有效,想要对全局有效的话,要放到hosts,remote_user等一列。
第17,19,20行,使用ansible内置的循环结构,循环变量用{{item}}表示,循环列表在with_items里面。楼主,这里用第5-8行定义的变量,来表示循环列表。
第21行,设置标签,当playbooks执行的时候,将只执行tags所对应的task
28行,使用模板,传送jinja2文件,也可以用copy模块传送普通文件
29,30行和33-35行是配套使用的,handler相当于触发器的,当我们在28行notify之后,待整个tasks全部执行完毕,notify里面的东西也就是"restart apache2",就会去32行handlers里面,去匹配同一名字的handler,并执行匹配到的task。 handler主要用在服务的重启,或者关机
看一下,这个playbooks的执行结果吧。
在命令行使用变量。使用-e参数,就OK了,'uservar=lixc'就是楼主在web.yml里面定义的romote_user
执行21行init这个标签对应的task
本文出自 “小城运维” 博客,转载请与作者联系!