- 本书赞誉
- 前言
- 第一部分 基础篇
- 第1章 系统基础信息模块详解
- 第2章 业务服务监控详解
- 第3章 定制业务质量报表详解
- 第4章 Python 与系统安全
- 第二部分 高级篇
- 第5章 系统批量运维管理器 pexpect 详解
- 第6章 系统批量运维管理器 paramiko 详解
- 第7章 系统批量运维管理器Fabric详解
- 第8章 从零开发一个轻量级 WebServer
- 第9章 集中化管理平台 Ansible 详解
- 第10章 集中化管理平台 Saltstack 详解
- 第11章 统一网络控制器 Func 详解
- 第12章 Python 大数据应用详解
- 第三部分 案例篇
- 第13章 从零开始打造 B/S 自动化运维平台
- 第14章 打造 Linux 系统安全审计功能
- 第15章 构建分布式质量监控平台
- 第16章 构建桌面版 C/S 自动化运维平台
9.6 playbook 介绍
playbook是一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步及异步方式。官方提供了大量的例子,可以在https://github.com/ansible/ansible-examples找到。playbook是通过YAML格式来进行描述定义的,可以实现多台主机应用的部署,定义在webservers及dbservers组上执行特定指令步骤。下面为读者介绍一个基本的playbook示例:
【/home/test/ansible/playbooks/nginx.yml】
--- - hosts: webservers vars: worker_processes: 4 num_cpus: 4 max_open_file: 65506 root: /data remote_user: root tasks: - name: ensure nginx is at the latest version yum: pkg=nginx state=latest - name: write the nginx config file template: src=/home/test/ansible/nginx/nginx2.conf dest=/etc/nginx/nginx.conf notify: - restart nginx - name: ensure nginx is running service: name=nginx state=started handlers: - name: restart nginx service: name=nginx state=restarted
以上playbook定制了一个简单的Nginx软件包管理,内容包括安装、配置模板、状态管理等。下面详细对该示例进行说明。
9.6.1 定义主机与用户
在playbook执行时,可以为主机或组定义变量,比如指定远程登录用户。以下为webservers组定义的相关变量,变量的作用域只限于webservers组下的主机。
- hosts: webservers vars: worker_processes: 4 num_cpus: 4 max_open_file: 65506 root: /data remote_user: root
hosts参数的作用为定义操作的对象,可以是主机或组,具体定义规则见9.3.1节内容。本示例定义操作主机为webservers组,同时通过vars参数定义了4个变量(配置模板用到),其中remote_user为指定远程操作的用户名,默认为root账号,支持sudo方式运行,通过添加sudo:yes即可。注意,remote_user参数在Ansible 1.4或更高版本才引入。
9.6.2 任务列表
所有定义的任务列表(tasks list),playbook将按定义的配置文件自上而下的顺序执行,定义的主机都将得到相同的任务,但执行的返回结果不一定保持一致,取决于主机的环境及程序包状态。建议每个任务事件都要定义一个name标签,好处是增强可读性,也便于观察结果输出时了解运行的位置,默认使用action(具体的执行动作)来替换name作为输出。下面是一个简单的任务定义示例:
tasks: - name: make sure nginx is running service: name=nginx state=running
功能是检测Nginx服务是否为运行状态,如没有则启动。其中name标签对下面的action(动作)进行描述;action(动作)部分可以是Ansible的任意模块,具体见9.5节,本例为services模块,参数使用key=value的格式,如“name=httpd”,在定义任务时也可以引用变量,格式如下:
tasks: - name: create a virtual host file for {{ vhost }} template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}
在playbook可通过template模块对本地配置模板文件进行渲染并同步到目标主机。以nginx配置文件为例,定义如下:
- name: write the nginx config file template: src=/home/test/ansible/nginx/nginx2.conf dest=/etc/nginx/nginx.conf notify: - restart nginx
其中,“src=/home/test/ansible/nginx/nginx2.conf”为管理端模板文件存放位置,“dest=/etc/nginx/nginx.conf”为目标主机nginx配置文件位置,通过下面nginx模板文件可以让大家对模板的定义有个基本的概念。
【/home/test/ansible/nginx/nginx2.conf】
user nginx; worker_processes {{ worker_processes }}; {% if num_cpus == 2 %} worker_cpu_affinity 01 10; {% elif num_cpus == 4 %} worker_cpu_affinity 1000 0100 0010 0001; {% elif num_cpus >= 8 %} worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; {% else %} worker_cpu_affinity 1000 0100 0010 0001; {% endif %} worker_rlimit_nofile {{ max_open_file }}; … …
Ansible会根据定义好的模板渲染成真实的配置文件,模板使用YAML语法,详细见9.1节,最终生成的nginx.conf配置如下:
user nginx; worker_processes 4; worker_cpu_affinity 1000 0100 0010 0001; worker_rlimit_nofile 65506; … …
当目标主机配置文件发生变化后,通知处理程序(Handlers)来触发后续的动作,比如重启nginx服务。Handlers中定义的处理程序在没有通知触发时是不会执行的,触发后也只会运行一次。触发是通过Handlers定义的name标签来识别的,比如下面notify中的“restart nginx”与handlers中的“name:restart nginx”保持一致。
notify: - restart nginx handlers: - name: restart nginx service: name=nginx state=restarted
9.6.3 执行playbook
执行playbook,可以通过ansible-playbook命令实现,格式:ansible-playbook playbook file(.yml)[参数],如启用10个并行进程数执行playbook:
#ansible-playbook /home/test/ansible/playbooks/nginx.yml -f 10,
其他常用参数说明:
-u REMOTE_USER:手工指定远程执行playbook的系统用户;
--syntax-check:检查playbook的语法;
--list-hosts playbooks:匹配到的主机列表;
-T TIMEOUT:定义playbook执行超时时间;
--step:以单任务分步骤运行,方便做每一步的确认工作。
更多参数说明运行ansible-playbook-help来获得。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论