Playbook—Roles(角色)和Include语句

简介

上篇文章中写到的playbook使用yml文件来写入一大篇的执行任务,但是在日常的主机管理中,希望一些任务是可以被重复调用的,所以需要重新组织这些文件。

基本上使用include语句引用task文件的方法,可允许你将一个配置策略分解到更小的文件中。使用include语句引用的tasks是将tasks从其他文件拉取过来。因为handlers也是tasks,所以你也可以使用include语句去引用handlers文件

Playbook同样可以使用include引用其他yml文件中的task。这时被引用的task会插入当前的yml文件中来执行,当前的yml文件中就有了一个更长的task列表

可以从理解如何使用include开始,这样会更容易理解roles的概念。

include的使用

假如你希望在多个yml中重复使用同一个task列表,你可以使用include做到

如:普通的task列表是这样的

# possibly saved as tasks/foo.yml
- name: placeholder foo
  command: /bin/foo

- name: placeholder bar
  command: /bin/bar

以上这个文件名为foo.yml,在另一个yml中的task调用此文件,如

tasks:
  - include: tasks/foo.yml # 调用文件所在的路径

也可以在yml文件中的handlers中调用,如要做一个重启apache的handlers如下:

# handlers/handlers.yml

- name: restart apache
  service: name=apache state=restarted

使用include来调用handlers.yml文件中的东西

- hosts: dbservers
  remote_user: root
  tasks:
    - name: 
      template: src=template.j2 dest=/etc/foo.conf
      notify:
        - restart apache 
        # 这里会自动识别文件的更改,使用notify来调用handlers指定文件中名为restart apache的模块
  handlers:
    - include: tasks/foo.yml

Roles

已经对tasks和handlers掌握,怎样组织playbook才是最好的方式呢,简单的回答就是roles,Roles基于一个已知的文件结构,自动加载tasks、handlers、vars(变量)等等。基于Roles对内容进行分组

目录结构

/etc/ansible/
├── site.yml
├── dbservers.yml
├── webservers.yml
└── roles
    ├── common
    │   ├── defaults 
    │   ├── files
    │   │   ├── *.conf
    │   │   ├── *.sh
    │   │   └── *.tar.gz
    │   ├── handlers
    │   │   └── main.yml
    │   ├── meta
    │   │   └── main.yml
    │   ├── tasks
    │   │   ├── *.yml
    │   │   └── main.yml
    │   ├── templates
    │   │   ├── *.j2
    │   └── vars
    │       └── main.yml
    └── nginx
        ├── defaults
        ├── files
        ├── handlers
        ├── meta
        ├── tasks
        ├── templates
        └── vars

一个playbook如下:

- hosts: webservers
  roles:
    - common
    - nginx

在目录结构中,nginx就是roles角色,而common可以理解为通用的文件,在此处存放

  • tasks/main.yml-角色执行的主要任务列表
  • handlers/main.yml-处理程序,可以在此角色之内或之外使用
  • defaults/main.yml-角色的默认变量
  • var/main.yml-角色的其他变量
  • files/main.yml-角色的部署文件
  • template/main.yml-角色部署的模板.j2
  • meta/main.yml-角色的元数据,包括角色依赖性

在这两个角色中分别指定了一些行为:

  • 如果roles/nginx/tasks/main.yml存在,其中列出的tasks将被添加play中
  • 如果roles/handlers/main.yml存在,其中列出的handlers将被添加到play中
  • 如果roles/nginx/var/main.yml存在,其中列出的variables将被添加到play中
  • 如果roles/meta/main.yml存在,其中列出的“角色依赖”将被添加到roles列表中
  • 所有copy模块可以引用roles/nginx/files/中的文件,不需要指明文件路径
  • 所有script模块可以引用roles/nginx/files/中的脚本文件,不需要指明文件路径
  • 所有template模块可以引用roles/nginx/templates/中的文件,不需要指明文件路径
  • 所有include可以引用roles/nginx/tasks/中的文件,不需要指明文件的路径

如果在一个playbook中同时使用了roles和tasks,roles的优先级最高

ansible中文权威指南

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0