一 点睛
playbook是一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主 机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。
playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步及异步方式。
官方提供了大量的例子,可以在 https://github.com/ansible/ansible-examples找到。
playbook是通过YAML格式来进行描述定义的,可以实现多台主机应用的部署,定义在webservers及dbservers组上执行特定指令步骤。
二 实例
1 代码
---
# list嵌套map,hosts是列表下面各个map的老板
- hosts: webservers
vars:
worker_processes: 4
num_cpus: 4
max_open_file: 65535
root: /data
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=nginx state=latest
- name: write the nginx config file
template: src=/srv/salt/nginx/nginx2.conf dest=/etc/nginx/nginx.conf
notify:
- restart nginx
- name: ensure nginx is running
service: name=nginx state=started
handlers:
- include: handlers.yml
2 Yaml语法
https://blog.csdn.net/kwy15732621629/article/details/81104685?utm_source=blogxgwz8
3 说明
以上playbook定制了一个简单的Nginx软件包管理,内容包括安装、配置模板、状态管理等。
三 定义主机和用户
1 点睛
在playbook执行时,可以为主机或组定义变量,比如指定远程登录用户。以下为webservers组定义的相关变量,变量的作用域只限于
webservers组下的主机。
2 实例
- hosts: webservers
vars:
worker_processes: 4
num_cpus: 4
max_open_file: 65506
root: /data
remote_user: root
3 说明
hosts参数的作用为定义操作的对象,可以是主机或组。
本示例定义操作主机为webservers组,同时通过vars参数定义了4个变量(配置模板用到),其中remote_user为指定远程操作的用户名,默认为root账号。
四 任务列表
1 点睛
所有定义的任务列表(tasks list),playbook将按定义的配置文件自上而下的顺序执行,定义的主机都将得到相同的任务,但执行的返回结果不一定保持一致,取决于主机的环境及程序包状态。建议每个任务事件都要定义一个name标签,好处是增强可读性,也便于观察结果输出时了解运行的位置,默认使用action(具体的执行动作)来替换name作为输出。
2 实例
# map嵌套list,该任务组含有3个任务
tasks:
- name: ensure apache is at the latest version
yum: pkg=nginx state=latest
# 在playbook可通过template模块对本地配置模板文件进行渲染并同步到目标主机。
- name: write the nginx config file
# 其中,“src=/home/test/ansible/nginx/nginx2.conf”为管理端模板文件存放位置,
# “dest=/etc/nginx/nginx.conf”为目标主机nginx配置文件位置,
template: src=/srv/salt/nginx/nginx2.conf dest=/etc/nginx/nginx.conf
notify:
- restart nginx
# 功能是检测Nginx服务是否为运行状态,如没有则启动。其中name标签对下面的action(动作)进行描述;
# action(动作)部分可以是 Ansible的任意模块,本例为services模块,参数使用key=value的格式,如“name=nginx”,
- name: ensure nginx is running
service: name=nginx state=started
# 在定义任务时也可以引用变量,格式如下,vhost为定义的变量
- name: create a virtual host file for {{ vhost }}
template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}
五 模板文件
1 示例
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 }};
2 说明
Ansible会根据定义好的模板渲染成真实的配置文件,模板使用YAML语法,最终生成的nginx.conf配置如下:
Ansible会根据定义好的模板渲染成真实的配置文件,模板使用YAML语法,最终生成的nginx.conf配置如下:
user nginx;
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
worker_rlimit_nofile 65506;
六 处理程序
1 点睛
当目标主机配置文件发生变化后,通知处理程序(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
1 点睛
执行playbook,可以通过ansible-playbook命令实现,格式:ansibleplaybook playbook file(.yml)[参数],如启用10个并行进程数执行playbook:
#ansible-playbook /home/test/ansible/playbooks/nginx.yml -f 10,
2 参数说明
- -u REMOTE_USER:手工指定远程执行playbook的系统用户;
- --syntax-check:检查playbook的语法;
- --list-hosts playbooks:匹配到的主机列表;
- -T TIMEOUT:定义playbook执行超时时间;
- --step:以单任务分步骤运行,方便做每一步的确认工作。