当单个playbook文件越来越大的时候,我们就需要重新来组织Playbooks了。我们可以将一个大的playbook拆成若干个小的playbook文件,然后通过include的方式,在主配置文件中将这些零碎的小文件包含进来,这叫做playbook的包含。我们也可以按照一定的规则将执行的某一类型任务放在一个目录里,并在这个目录中再次对这个playbook按照tasks,handlers,files,templates,vars等类型划分成若干文件,将对应文件存放在对应的目录中,这种组织方式就叫做playbook的roles。

一、Playbook的包含

playbook的包含其实就是使用include关键字

1、tasks包含

示例1:

一个task文件foo.yml示例如下:

# possibly saved as tasks/foo.yml

- name: placeholder foo

command: /bin/foo

- name: placeholder bar

command: /bin/bar

在另一个task文件bar.yml中包含foo.yml:

tasks:

- include: tasks/foo.yml

也可以在include的时候,带入变量:

tasks:

- include: wordpress.yml user=timmy

- include: wordpress.yml user=alice

- include: wordpress.yml user=bob

通过如下方式带入变量:

tasks:

- { include: wordpress.yml, user: timmy, ssh_keys: [ 'keys/one.txt', 'keys/two.txt' ] }

再给一个例子:

tasks:
  - include: wordpress.yml
    vars:
        remote_user: timmy
        some_list_variable:
          - alpha
          - beta
          - gamma

2、handlers包含

handlers包含与tasks的包含大体类似,直接给例子:

handlers1.yml内容如下:

# this might be in a file like handlers/handlers.yml

- name: restart apache

service: name=apache state=restarted

handlers.yml包含handlers1.yml示例:
handlers:

- include: handlers/handlers.yml

3、混合包含

include也可以用于将一个playbook导入到另一个playbook中:

- name: this is a play at the top level of a file

hosts: all

remote_user: root

tasks:

- name: say hi

tags: foo

shell: echo "hi..."

- include: load_balancers.yml

- include: webservers.yml

- include: dbservers.yml

二、角色(roles)

1、创建role

创建role的步骤如下:

1)创建以roles命令的目录

2)在roles目录中分别创建角色名称命名的目录,如websrvs等

3)在每个角色命名的目录中分别创建files、handlers、meta、tasks、teamplates和vars目录,用不到的目录可以创建为空目录,也可以不创建。

4)在playbook文件中,调用各角色

roles文件组织结构示例:

group_vas/

site.yml

webservers.yml

roles/

common/

files/

templates/

tasks/

handlers/

vars/

defaults/

meta/

webservers/

files/

templates/

tasks/

handlers/

vars/

defaults/

meta/

roles各目录的作用及可用的文件:

files:存放由copy或script等模块调用的文件

tempaltes:Jinja2模板文件

tasks:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表,些文件可以使用include包含其它的位于此目录中的task文件

handlers:至少包含一个main.yml文件,用于定义此角色用到的各handler,在handler中使用include包含的其他handler文件也应该位于此目录

vars:应当包含一个main.yml文件,用于定义此角色用到的变量

meta:应当包含一个main.yml文件,用于定义此角色的特殊设定及依赖关系等

default:为当前角色设定默认变量时使用些目录,包含一个main.yml文件

2、引用roles

基本引用的方法:

- hosts: webservers

roles:

- common

- webserver

也可以通过如下方法引用时带入变量:

- hosts: webservers

roles:

- common

- { role: foo_app_instance, dir: '/opt/a',  port: 5000 }

- { role: foo_app_instance, dir: '/opt/b',  port: 5001 }

还可以在引用时使用条件语句:

- hosts: webservers

roles:

- { role: some_role, when: "ansible_os_family == 'RedHat'" }

下面也是一个带入变量的示例:

- hosts: webservers

roles:

- role: database

database_name: {{ db_name }}

database_user: {{ db_pass }}

- role: webserver

live_hostname: web1

domains:

- example.com

- www.example.com

3、pre_tasks和post_tasks

如果在执行一个role时,需要在其前或其后依然要执行某些任务,我们可以使用pre_tasks及post_tasks来声明。pre_tasks是在role之前执行,而post_tasks则在role之后执行:

- name: deply webservers

host: webservers

vars_files:

- secrets.yml

pre_tasks:

- name: update yum cache

yum: update_cache=yes

roles:

- role: apache

database_host: {{ hostvars.db.ansible_eth0.ipv4.address }}

domains:

- exampel.com

- www.example.com

post_tasks:

- name: print something

shell: echo "The roles have been updated!"

4、role的依赖

如果当前role在执行前需要依赖另一个role,我们可以在roles的meta目录中的main.yml中定义role的依赖关系。

示例1:

#roles/webservers/meta/main.yml

dependencies:

- { role: common, some_parameter: 3 }

- { role: apache, port: 80 }

- { role: postgres, dbname: blarg, other_parameter: 12 }

示例2:

dependencies:

- {role: ntp, ntp_server=ntp.ubuntu.com}

- {role: web}

- {role: memcached}

5、Ansible Galaxy

ansible-galaxy是一个工具,我们可以利用它快速的创建一个标准的roles目录结构,还可以通过它在https:/galaxy.ansible.com上下载别人写好的roles,直接拿来用。

通过ansible-galaxy初始化一个roles的目录结构,方法如下:

ansible-galaxy init /etc/ansible/roles/websrvs

安装别人写好的roles:

ansible-galaxy install -p /etc/ansible/roles bennojoy.mysql

列出已安装的roles:

ansible-galaxy list

查看已安装的roles信息:

ansible-galaxy info bennojoy.mysql

卸载roles:

ansible-galaxy remove bennojoy.mysql

本文出自 “无名小卒” 博客,请务必保留此出处http://breezey.blog.51cto.com/2400275/1757832

Ansible10:Playbook的角色与包含【转】的更多相关文章

  1. Ansible10:Playbook的角色及包含

    目录 说明 一.Playbook的包含 1.tasks包含 2.handlers包含 3.混合包含 二.角色(roles) 1.创建role 2.引用roles 3.pre_tasks和post_ta ...

  2. Ansible11:变量详解【转】

    一.在Inventory中定义变量 详见<Ansible2:主机清单> 二.在Playbook中定义变量 1.通过vars关键字定义: vars: http_port: 80 server ...

  3. Ansible之playbook

    简介 playbook是一个非常简单的配置管理和多主机部署系统.可作为一个适合部署复杂应用程序的基础.playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式.playbook是 ...

  4. Ansible playbook roles

    1  概述 角色(roles):如果我们使用playbook写成一个文件,这个文件会很大,但是不方便组织,我们可以分组,把playbook根据功能,如handler,tasks等分门别类的放在在各自的 ...

  5. devops工具-Ansible进阶playbook&roles

    一.playbook介绍     playbook 是 Ansible 管理配置.部署应用的核心所在,一个playbook由有多“play组成”,而一个play实际就是一个task,每个task是由多 ...

  6. ansible基础-ansible角色的使用

    ansible基础-ansible角色的使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们建议把多个节点都会用到的功能将其定义模块,然后谁要用到该模块就直接调用即可!而在a ...

  7. Ansible Playbook Variables

    虽然自动化存在使得更容易使事情重复,但所有的系统可能不完全一样. 在某些系统上,您可能需要设置一些与其他操作略有不同的行为或配置. 此外,一些观察到的远程系统的行为或状态可能需要影响如何配置这些系统. ...

  8. Ansible_描述角色结构

    一.利用角色构造ansible playbook 1.What's 角色 1️⃣:Ansible角色提供了一种方法,让用户能以通用的方式更加轻松地重复利用Ansible代码. 我们可以在标准化目录结构 ...

  9. centos下安装ansible自动化工具(超详细,包含基本使用)

    ansible官网:https://www.ansible.com 众所周知,ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef ...

随机推荐

  1. SQL中判断字符串中包含字符的方法

    通过2个函数CHARINDEX和PATINDEX以及通配符的灵活使用 函数:CHARINDEX和PATINDEX CHARINDEX:查某字符(串)是否包含在其他字符串中,返回字符串中指定表达式的起始 ...

  2. 伪分布重新格式化hdfs

    重新格式化hdfs系统的方法: (1)查看hdfs-ste.xml: <span style="font-size:18px;"><property> &l ...

  3. Linux服务器导入导出SVN项目

    导出项目: # svnadmin dump /var/svn/pro1 > /mydata/pro1.backup 导入项目: 新建项目仓库: # svnadmin create /var/sv ...

  4. GreenPlum学习之(Share-nothing)架构

    当今世界是一个信息化的世界,我们的生活中无论是生活.工作.学习都离不开信息系统的支撑.而信息系统的背后用于保存和处理最终结果的地方就是数据库.因此数据库系统就变得尤为重要,这意味着如果数据库如果面临问 ...

  5. loadrunner 计数器

    http://wenku.baidu.com/link?url=oN2kBiABHE1xJmbmZdOmlTCz0sJ8aL3i-hVGiBjAtw-epUW7qrk4f2mAqdOeK5xXw8Sk ...

  6. 《JS权威指南学习总结--6.8对象的三个属性》

    内容要点: 每一个对象都有与之相关的原型(prototype).类(class)和可扩展性 一.原型属性 1.对象的原型属性是用来继承属性的,这个属性是如此重要,以至于我们经常把 "0的原型 ...

  7. PAT 团体程序设计天梯赛-练习集 L2-009. 抢红包

    没有人没抢过红包吧…… 这里给出N个人之间互相发红包.抢红包的记录,请你统计一下他们抢红包的收获. 输入格式: 输入第一行给出一个正整数N(<= 104),即参与发红包和抢红包的总人数,则这些人 ...

  8. php基础(六)Include

    本文内容来自http://www.w3school.com.cn/php/php_file.asp 服务器端包含 (SSI) 用于创建可在多个页面重复使用的函数.页眉.页脚或元素. include ( ...

  9. 浙江大学Pat 1036 题解

    1036. Boys vs Girls (25) This time you are asked to tell the difference between the lowest grade of ...

  10. HDU 2614 Beat(DFS)

    题目链接 Problem Description Zty is a man that always full of enthusiasm. He wants to solve every kind o ...