playbook 介绍
playbook 是一个不同于使用 Ansible 命令行执行方式的模式,其功能更强大灵活。简单来说,playbook 是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。playbook 可以定制配置,可以按指定的操作步骤有序执行,支持同步及异步方式。官方提供了大量的例子,可以在 https://github.com/ansible/ansible-examples 找到。playbook 是通过 YAML 格式来进行描述定义的,可以实现多台主机应用的部署,定义在 webservers 及 dbservers 组上执行特定指令步骤。下面为读者介绍一个基本的 playbook示例:
Unresolved include directive in modules/ROOT/pages/section02/ch09/ch9-06.adoc - include::example$/第九章/ansible/playbooks/nginx.yml[]
以上 playbook 定制了一个简单的 Nginx 软件包管理,内容包括安装、配置模板、状态管理等。下面详细对该示例进行说明。
定义主机与用户
在 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 或更高版本才引入。
任务列表
所有定义的任务列表(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 模板文件可以让大家对模板的定义有个基本的概念。
user nginx;
worker_processes {{ worker_processes }};
{% if num_cpus == 2 %}
worker_cpu_affinity 01 10;
{% elif num_cpus == 4 %}
worker_cpu_affinity 1000010000100001;
{% elif num_cpus >= 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000
0100000010000000;
{% else %}
worker_cpu_affinity 1000010000100001;
{% endif %}
worker_rlimit_nofile {{ max_open_file }};
… …
Ansible 会根据定义好的模板渲染成真实的配置文件,模板使用 YAML 语法,详细见9.1节,最终生成的 nginx.conf 配置如下:
user nginx;
worker_processes 4;
worker_cpu_affinity 1000010000100001;
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
执行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 来获得。