4.0 Playbook复用

import_playbook

import_playbook 顾名思义,直接导入整个playbook,用法很简单,直接把已经有的playbook包含进去即可,形成一个总的playbook,执行总的playbook即会按照顺序执行单个playbook

cat import_playbook.yml
- import_playbook: 1_base.yaml
- import_playbook: 2_backup_rsync.yaml
- import_playbook: 3_nfs_share.yaml
- import_playbook: 4_nfs_lsyncd.yaml
- import_playbook: 5_1_mysql_master.yaml
- import_playbook: 5_2_mysql_slave.yaml
- import_playbook: 6_webservers_nginx_php_webapps.yaml
- import_playbook: 7_webservers_tomcat_jpress.yaml

直接复用整个playbook,可以一定程度的节省我们的工作量,如准备一个base.yml,做一些配置网络、配置主机名等操作,给它包含组合到想要的playbook里去,当然粒度还是比较粗糙,后面我们介绍任务(task)级别的复用

参考示例:https://gitee.com/as4k/ysansible/blob/master/reuse/import_playbook/import_playbook.yml

import_tasks

cat import_tasks.yml
---
- hosts: all
  become: yes

  vars_files:
    - vars.yml

  pre_tasks:
    - name: Update apt cache if needed.
      apt: update_cache=yes cache_valid_time=3600

  handlers:
    - import_tasks: handlers/handlers.yml

  tasks:

    - import_tasks: tasks/common.yml
    - import_tasks: tasks/apache.yml
    - import_tasks: tasks/php.yml
    - import_tasks: tasks/mysql.yml
    - import_tasks: tasks/composer.yml
    - import_tasks: tasks/drush.yml
    - import_tasks: tasks/drupal.yml

    - name: hello2
      debug:
        msg: "hello2"

可以看到这样的粒度比较细,方便控制,这样我们在书写playbook的时候,如果发现某些task反复出现在很多playbook里面,即可考虑抽出来放到一个单独的文件里,以方便维护、复用

参考示例:https://gitee.com/as4k/ysansible/tree/master/reuse/import_tasks

include_tasks

include_tasks 跟 import_tasks 类似,但是可以实现一些”动态包含”的功能,如下

- include_tasks: setup-RedHat.yml
  when:
    - not php_install_from_source
    - ansible_os_family == 'RedHat'

- include_tasks: setup-Debian.yml
  when:
    - not php_install_from_source
    - ansible_os_family == 'Debian'

import_tasks 和 include_tasks 的区别

简单来说import_tasks是静态包含,这种包含就相当于直接把相关内容写到playbook里一样,include_tasks是动态包含,在执行时才去加载,一般使用import_tasks比较多,关于这两者的详细区别,如果感兴趣,可参考下面的官方文档

https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse.html

当然复用或者说组织大批playbook的最佳方案是我们马上要讲到的 Roles 角色