playbooks翻译成中文叫剧本,和saltstack里面的state差不多,都是在管理端定义好的一条条的策略。
playbooks和前面玩的命令行执行的有啥区别呢? 其实playbooks里面真正干活的,还是一个个的模块,不过命令行的那个好比单兵作战,而playbooks是有组织有纪律的集团军作战。
mark个ansible一个官方例子地址
https://github.com/ansible/ansible-examples
https://github.com/ansible/ansible-examples/blob/master/language_features/ansible_pull.yml
下面看一个简单的例子:
1 ---
2 - hosts: 192.168.137.130
3 remote_user: '`uservar`'
4 vars:
5 software:
6 - httpd
7 - ntpdate
8 tasks:
9 - name: run this command and ignore the result
10 shell: hostname
11 ignore_errors: True
12 register: result
13 - debug: msg='`result`.`stdout`'
14
15 - name: install ntpdate and httpd
16 yum: name=`item` state=installed
18 with_items:
19 - '`software`'
20 tags: init
21
22 - name: guarantee and httpd are running
23 service: name=httpd state=started
25
26 - name: transfer httpd configure file to remote
27 template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
28 notify:
29 - restart httpd
30 when: result.stdout == 'lvs02'
31
32 handlers:
33 - name: restart httpd
34 service: name=httpd state=restarted
简单描述一下,每一行是做什么的?
第1行,起始标志,写不写无所谓,官网写了
第2行,定义这个play要作用的主机,多个主机或者多个组的话,用":"分开,也可以用咱们前面的那种正则的形式匹配主机。
第3行,定义了此play在remote端执行时,使用哪个用户执行。楼主这里用一个变量表示,待会可以在命令行输入此变量
第4到7行,可以在play里面定义变量,显然这个变量是局部的,只能在此play里使用。
第8行,task起始标志,可以在里面定义1个或多个task
第9行,为task定义一个name,这样我们执行的时候,会很直观的在终端上打印,不定义name也ok,执行的时候,ansible会默认打印一个action的提示,这样的话,不利于我们观察task执行过程。
第10行,就是真正干活的模块了,shell和command模块,后面的参数,直接写就OK,而其他模块的参数,都要遵循key=value的形式,如第16行和23行。还有就是,ansible里的模块,好像命令行和playbooks里面都是通用的,不像salt-stack里面,命令行的模块和state里面模块是完全分离,不能混用的。
第11行,表示上面的这个模块执行的结果,如果不为0,不加ignore_errors话,出现错误,playbook就不执行了。 加上ignore_errors的话,出现错误,会忽略并继续执行。 当然也可以在shell,command模块中, 使用 shell: /bin/123 || /bin/true的形式。
第12行,register,把上一个模块执行的结果,保留在result(名字可以任意)这个变量里面,result变量常用的有result.stdout,result.err,result.rc等属性。这一特性,说明ansible能够保留前面task执行的结果,在后面的task里面可以利用这一结果。
第13行,debug,打印的意思。。。把result的stdout给打印出来。 debug后面要遵循,msg=''这种结构
17行,使用sudo,这个sudo只针对当前task有效,想要对全局有效的话,要放到hosts,remote_user等一列。
第18,19,20行,使用ansible内置的循环结构,循环变量用`item`表示,循环列表在with_items里面。楼主,这里用第5-7行定义的变量,来表示循环列表。
第20行,设置标签,当playbooks执行的时候,将只执行tags所对应的task
27行,使用模板,传送httpd.conf文件,也可以用copy模块传送普通文件
28,29行和32-34行是配套使用的,handler相当于触发器的,当我们在28行notify之后,待整个tasks全部执行完毕,notify里面的东西也就是"restart httpd",就会去32行handlers里面,去匹配同一名字的handler,并执行匹配到的task。 handler主要用在服务的重启,或者关机
看一下,这个playbooks的执行结果。
在命令行使用变量。使用-e参数,就OK了,'uservar=lixc'就是在web.yml里面定义的romote_user
ansible]# ansible-playbook web.yml -e 'uservar=root'
执行20行init这个标签对应的task
ansible]# ansible-playbook web.yml -e 'uservar=root' --tags init