一.简述:
前面写的几篇文档基本上对ansible的常用模块及适用的场景做了些了解(系列文章,感兴趣的可以通过主页或者专栏查看)。但ansible能够实现的功能远远不止这些,其中核心部分是批量配置管理,这些功能在ad-hoc命令中并不能完全实现,故,有了playbook功能组件(实现复杂的配置管理功能)。
二. 基础语法:
ansible的playbook文件格式为YAML语法,按照层次化结构划分,ansible可分为以下部分:
a) tasks:定义任务列表(名称,模块:模块操作);
b) files:存放由copy或script等模块调用的文件;
c) template:定义Jinja2模板文件;
d) handlers:通过notify(task结束时)触发的任务操作(一般用于服务重启);
e) vars:定义变量;
另外,说下ansible比较安全的一点:ansible的modules 具有”幂等”性,意思是如果再一次地执行 moudle(比如遇到远端系统被意外改动,需要恢复),moudle 只会改变需要改变的地方.所以重复多次执行 playbook 也很安全.
三. 使用案例:
这里通过一个简单yum安装nginx的例子说明:
--- #yaml声明
- hosts: test #目前主机组(多个,隔开)
remote_user: web #用户
sudo: yes #sudo执行(也可以在特定的task中指定)
serial: 15 #playbook并发数
tasks: #task集合
- name: install nginx server
yum: name=nginx state=present #子集合yum安装nginx(state=present(创建)|absent(删除)} force=(是否强制操作删除家目录))
- name: copy nginx.conf #子集合从本地copy nginx配置文件到目标主机
template: src=/tmp/nginx.conf.j2 dest=/data/web/nginx/conf/nginx.conf
owner=web group=web mode=0644 validate='/data/web/nginx/sbin/nginx -c %s -t'
notify: #template执行没问题,触发(notify)handlers(注意名字)
- restart nginx
handlers: #待触发的handlers
- name: restart nginx
service: name=nginx state=restarted
注:validate中的%s 会自动赋值到copy的数据文件,但不是/data/web/nginx/conf/nginx.conf,而是一个临时文件,所以nginx中的配置用到相对路径的,需要注意, 例如这里,原本nginx.conf.j2中mime.type如下:
include mime.types;
再执行validate会报如下错误:
因为 -c的文件在/root/.ansible/tmp/ansible-tmp-1466396234.95-155429102630968下,所以include需要改为:
include /data/web/nginx/conf/mime.types;
# ansible-playbook nginx.yaml
PLAY [test] ********************************************************************
TASK [setup] *******************************************************************
ok: [10.5.11.18]
TASK [install nginx server] ****************************************************
changed: [10.5.11.18]
TASK [copy nginx.conf] *********************************************************
changed: [10.5.11.18]
RUNNING HANDLER [restart nginx] ************************************************
changed: [10.5.11.18]
PLAY RECAP *********************************************************************
10.5.11.18 : ok=4 changed=3 unreachable=0 failed=0
可以通过以下命令查看语法,task名称,目标主机:
# ansible-playbook nginx.yaml --syntax-check
# ansible-playbook nginx.yaml --list-task
# ansible-playbook nginx.yaml --list-hosts
也可以单独执行某一个task(比如修改了nginx.conf.j2的配置文件):
#ansible-playbook nginx.yaml --start-at-task='copy nginx.conf'
其他参数-h ............................
更多案例可参考:
https://github.com/ansible/ansible-examples
http://docs.ansible.com/ansible/playbooks_intro.html
----------------------------------------------------------------------------------------------
深耕运维行业多年,擅长linux、容器云原生、运维自动化等方面。
承接各类运维环境部署、方案设计/实施、服务代运维工作,欢迎沟通交流 !