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'

wKiom1lcmY-AB330AACS2xWi1AM300.png-wh_50


执行20行init这个标签对应的task

ansible]# ansible-playbook web.yml -e 'uservar=root' --tags init

wKioL1lcmouwzvwYAAA1T6EmW5g594.png-wh_50