playbook 介绍

playbook 是一个不同于使用 ansible 命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。
playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步及异步方式。可以在 https://github.com/ansible/ansible-examples 找到大量的例子。playbook是通过YAML格式来进行描述定义的,可以实现多台主机应用的部署,定义在webservers及dbservers组上执行特定指令步骤。下面介绍一个基本的playbook实例:

【 /home/ansible/playbook/nginx.yml 】
---
- hosts: webservers
  vars:
    worker_processes: 4
    num_cups: 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/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


其中,
- hosts 定义主机与用户,指定了webservers组定义的主机,并定义了相关变量,变量的作用域只限于webservers组下的主机。通过 vars 参数定义了4个变量(配置模板用到),remote_user为指定远程操作的用户名,默认为root账号,支持sudo方式,通过添加sudo: yes即可。

tasks 任务列表
所有的任务列表,playbook将按定义的配置文件自上而下的顺序执行,定义的主机都将得到相同的任务,但执行的结果不一定相同,这取决于主机的环境及程序包的状态。playbook可以通过template模块对本地配置模板文件进行渲染并同步到目标主机。以nginx配置文件为例,定义如下:

tasks:
  - name: write the nginx config file
    template: src=/home/ansible/nginx/nginx2.conf dest=/etc/nginx/nginx.conf
    notify:
    - restart nginx


其中,src=/home/ansible/nginx/nginx2.conf 为管理端模板文件存放位置,dest=/etc/nginx/nginx.conf 为目标主机nginx配置文件位置。下面用一个例子来了解一下什么是模板。

【 /home/ansible/nginx/nginx2.conf 】
user        nginx
worker_processes  {{ worker_processes }};
{% if num_cups == 2 %}
worker_cpu_affinity 01 10;
{% elif num_cups >= 4 %}
worker_cpu_affinity 1000 0100 0010 0001;
{% else %}
worker_cpu_affinity 1000 0100 0010 0001;
{% endif %}
worker_rlimit_nofile {{ max_open_file }};
… …

Ansible 会根据定义好的模板渲染成真实的配置文件,模板用YAML语法,最终生成的nginx配置如下:

【 /etc/nginx/nginx.conf 】

user        nginx

worker_processes  4;
worker_cpu_affinity 1000 0100 0010 0001;
worker_rlimit_nofile 65506;
… …


当目标主机配置文件发生变化后,通知处理程序(Handlers)来触发后续的动作,比如重启nginx服务。触发是通过Handlers定义的name标签来识别的,比如下面notify中的“restart nginx” 与 handlers中的“name: restart nginx” 保持一致。

notify:    - restart nginxhandlers:    - name: restart nginx      service: name=nginx state=restarted

执行playbook

Syntax:

  ansible-playbook [options] PLAYBOOK.yml

options:

-C, --check: 测试模式, 不做任何更改, 而是尝试运行, 进行检查;-i INVENTORY, --inventory-file=INVENTORY  specify inventory host path(default=/etc/ansible/hosts) or comma separated host list. 指定主机配置文件路径;
-u REMOTE_USER, --user=REMOTE_USER:手工指定远程执行playbook的系统用户;
--list-hosts: 输出匹配的主机列表, 不执行其他操作;
--list-tags : 列出所有可用的标签;
--list-tasks: 列出所有将要执行的任务;
-t TAGS, --tags=TAGS : 只运行tags标识的任务;
--skip-tags=SKIP-TAGS : 只运行tags没有标记的任务;
--syntax-check: 对剧本执行语法检查, 但是不执行;


更多参数说明请运行 ansible-playbook --help 。


忽略错误的命令
- name: this will not be counted as a failure
command: /bin/false
ignore_errors: yes


仅执行某些tags
ansible-playbook install_io_server.yml --tags="copyconfig" -i install_io_server_ansible.txt --step --limit io_game_server

  • 发表于 2022-07-29 14:28
  • 阅读 ( 3132 )
  • 分类:Ansible

0 条评论

请先 登录 后评论
乐维君
乐维君

344 篇文章

作家榜 »

  1. 乐维君 344 文章
  2. YOHOHO 14 文章
  3. 机灵小和尚 13 文章
  4. 我是一只小菜鸡 12 文章
  5. 细雨闲花 11 文章
  6. 御前侍卫张五哥 9 文章
  7. 。。。 8 文章
  8. 小黄人 8 文章