返回介绍

9.6 playbook 介绍

发布于 2024-01-29 22:54:23 字数 3782 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文