ansible基础-roles
一 简介
注:本文demo使用ansible2.7稳定版
在我看来,role是task文件、变量文件、handlers文件的集合体,这个集合体的显著特点是:可移植性和可重复执行性。
实践中,通常我们以部署某个服务为单元作为一个role ,然后将这些服务单元(role)放在一个roles目录下。主playbook文件通过调用roles目录下的role,来实现各种灵活多变的部署需求。
本节主要为大家介绍下roles的目录结构、引用方法及其他特性。
二 创建与目录结构
2.1 创建roles
通常创建一个role的方法有两种:
命令mkdir和touch行手动创建
使用ansible-galaxy自动初始化一个role
命令行手动创建方式就无需多说了,即需要哪个目录和文件就用「mkdir」和「touch」命令创建出来。
我个人比较喜欢使用「ansible-galaxy」命令创建,创建完后再删除我不需要的目录,这样可以避免因手误创建出错的问题。
例如,我想使用「ansible-galaxy init」命令创建一个名字为role_A 的role,可以这样写:
➜ lab-ansible ansible-galaxy init role_A
- role_A was created successfully
创建后的目录结构如下:
➜ lab-ansible tree role_A
role_A
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml directories, files
使用「ansible-galaxy」命令自动创建的role是最全的目录结构,根据需求,可以删除不用的目录文件。
2.2 目录结构
我们以上面创建的「role_A」为例,介绍下各目录文件的作用:
- tasks : 用于存放role_A的主要任务,也可以添加其他task文件,供main.yaml调用,从而实现更加复杂的部署功能。
- handlers : 用于存放触发执行( hanlders )的任务。
- defaults : 用于存放默认变量,优先级最低,变量优先级可参考《ansible基础-变量》。
- vars : 用于存放变量文件,role_A中任务和模版里用到的变量可以在这里定义。
- files :用于存放需要拷贝到目的主机的文件,例如,作为「copy」模块src参数的默认根目录。
- template : 用于存放模版文件,格式为.j2,文件内容要符合Jinja2语法规则,通常使用「template」模块部署服务的配置文件。
- meta : 用于存放role依赖列表,这个知识点后面会详细阐述。
- tests : 用于存放测试role本身功能的playbook和主机定义文件,在开发测试阶段比较常用。
role中各个目录下的main.yaml文件很重要,这是ansible默认加载的YAML文件。
三 role的引用与执行
3.1 roles语句引用
比较常用的方法,我们可以使用「roles:」语句引用role :
---
- hosts: node1
roles:
- role_A
或者
---
- hosts: node1
roles:
- name: role_A
- name: role_A
或者
---
- hosts: node1
roles:
- role: role_A
- role: role_A
或者使用绝对路径:
---
# playbooks/test.yaml
- hosts: node1
roles:
- role: /root/lab-ansible/roles/role_A
引入的同时添加变量参数:
---
# playbooks/test.yaml
- hosts: node1
roles:
- role: role_A
vars:
name: Maurice
age:
引入的同时添加tag参数:
---
# playbooks/test.yaml
- hosts: node1
roles:
- role: role_B
tags:
- tag_one
- tag_two
# 等价于上面
- { role: role_B, tags:['tag_one','tag_two'] }
根据需求,我们在playbook中引用不同的role,引用后的效果也很好理解:ansible会把role所包含的任务、变量、handlers、依赖等加载到playbook中,顺次执行。
检索路径
上面介绍了使用「roles」语句的引用方法,那么ansible去哪找这些role呢?
在不使用绝对路径的情况下,ansible检索role的默认路径有:
- 执行ansible-playbook命令时所在的当前目录
- playbook文件所在的目录及playbook文件所在目录的roles目录
- 当前系统用户下的~/.ansible/roles目录
- /usr/share/ansible/roles目录
- ansible.cfg 中「roles_path」指定的目录,默认值为/etc/ansible/roles目录
注:上面的检索路径是在centos操作系统下测试出来的结果。
3.2 include和import引用
在后来版本(ansible>=2.4)中,ansible引入了「import_role」(静态)和「include_role」(动态)方法:
---
# playbooks/test.yaml
- hosts: node1
tasks:
- include_role:
name: role_A
vars:
name: maurice
age:
- import_role:
name: role_B
比较于「roles」语句,「import_role」和「include_role」的优点如下:
- 可以在task之间穿插导入某些role,这点是「roles」没有的特性。
- 更加灵活,可以使用「when」语句等判断是否导入。
关于include_role(动态)和import_role(静态)的区别,可以参考笔者之前的文章《ansible中include_tasks和import_tasks》。
也正是因为「include_task」是动态导入,当我们给「include_role」导入的role打tag时,实际并不会执行该role的task。
举个
ansible基础-roles的更多相关文章
- ansible基础-理解篇
1. 介绍 要说现在的部署工具,ansible可以说家喻户晓了. ansible是一个开源软件,用于软件供应.配置管理.应用部署.ansible可以通过SSH.remote PowerShell.其他 ...
- ansible基础-安装与配置
一 安装 1.1 ansible架构 ansible是一个非常简单的自动化部署项目,由python编写并且开源.用于提供自动化云配置.配置文件管理.应用部署.服务编排和很多其他的IT自动化需求. an ...
- ansible基础-Jinja2模版 | 过滤器
Jinja2模版介绍 注:本文demo使用ansible2.7稳定版 在ansible基础-变量的「8.2 模版使用变量」章节中关于模版与变量也有所提及,有兴趣的同学可以去回顾一下. ansible通 ...
- ansible基础-playbooks
1. playbooks介绍 如果说ansible的modules是工具,inventory配置文件是原材料,那么playbook就是一封说明书,这里会记录任务是如何如何执行的,当然如果你愿意,这里也 ...
- Git+Gitlab+Ansible的roles实现一键部署Nginx静态网站(一)--技术流ken
前言 截止目前已经写了<Ansible基础认识及安装使用详解(一)--技术流ken>,<Ansible常用模块介绍及使用(二)--技术流ken><Ansible剧本介绍及 ...
- ansible基础-ansible角色的使用
ansible基础-ansible角色的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们建议把多个节点都会用到的功能将其定义模块,然后谁要用到该模块就直接调用即可!而在a ...
- ansible基础-playbook剧本的使用
ansible基础-playbook剧本的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.YAML概述 1>.YAML的诞生 YAML是一个可读性高,用来表达数据序 ...
- 003.Ansible基础使用
一 Ansible命令用法 Ansible命令行执行方式有:Ad-Hoc.Ansible-playbook两种,Web方式其官方提供付费产品Tower.Ad-Hoc主要用于临时命令的执行,Ansibl ...
- Git+Gitlab+Ansible的roles实现一键部署Nginx静态网站(4)
前言 截止目前已经写了<Ansible基础认识及安装使用详解(一)–技术流ken>,<Ansible常用模块介绍及使用(二)–技术流ken><Ansible剧本介绍及使用 ...
随机推荐
- javaweb c3p0连接oracle12c
最近在搞javaweb,在连接池上碰到了一系列的问题,在Junit测试时,oracle12c报错: ORA-28040: 没有匹配的验证协议 百度解决:修改 $ORACLE_HOME/network/ ...
- jsp中一个标签两种方式绑定两个click事件导致未执行的问题
近日,在开发过程中,写了一个标签 <li id="a1" onclick="doSomething()">...</li> 在js页面中 ...
- iOS UIView Class Translation
类 UIView 一个管理屏幕上矩形区域内容的对象. 概述 Views 是你应用的用户界面最基础的组成部分.UIView类定义了对于所有 views 的共有的行为.一个 view 对象在它的边界矩 ...
- Angular结构型指令,模块和样式
结构型指令 *是一个语法糖,<a *ngIf="user.login">退出</a>相当于 <ng-template [ngIf]="use ...
- 杂记:Python 两坑
近日写代码又遇到两个 Python 的坑,觉得值得记录. 递归传参问题 Python 里传参的实现是 assignment,但由于 Python 里都是对象,除了几个基本类型,assignment 基 ...
- Codeforces 581F Zublicanes and Mumocrates 树形dp
Zublicanes and Mumocrates dp[ i ][ j ][ k ] 表示 以 i 为根的子树, 占领 i 的 是 j 并且第一个人占了 i 子树的 k 个叶子节点的最小值. 然后随 ...
- angular简介
1.angular简介 一款非常优秀的前端高级 JS 框架 由 Misko Hevery 等人创建 2009 年被 Google 公式收购,用于其多款产品 有一个全职的开发团队继续开发和维护这个库 有 ...
- Pytoch机器学习乱玩(一):数学建模作业,体重与心率
动物心率与体重的模型 动物消耗的能量p主要用于维持体温,而体内热量通过其表面积S散失,记动物体重为w,则\(P \propto S \propto w^{\alpha}\).又\(P\)正比于血流量\ ...
- BUAA面向对象设计与构造——第一单元总结
BUAA面向对象设计与构造——第一单元总结 第一阶段:只支持一元多项式的表达式求导 1. 程序结构 由于是第一次接触面向对象的编程,加之题目要求不算复杂,我在第一次作业中并没有很好利用面向对象的特点, ...
- git修改远程仓库关联
公司搬移, 作为git仓库的服务器IP地址变了. 本地代码挺多,重新检出太占时间,可以修改一个什么配置让我本地仓库和新的远程仓库建立关联吗, 答案是肯定的! 方法有很多,这里简单介绍几种: 以下均以项 ...