介绍
roles可以根据一个固定的目录结构加载相关的vars,files, tasks, handlers等,可以复用和分享
目录结构
roles
<role_name>/ # 目录,代表一个角色
tasks/
main.yml # 用于定义各种tasks, 一定要有main.yml, 在这个目录下可以创建其他任务文件,在main.yml中引入这些文件
handlers/
main.yml # handlers文件
templates/
<template_name>.j2 # 模板文件, 通过template模块渲染
files/
<script>.sh # 脚本或者文件等,通过script和copy模块使用
<config>.yml
vars/
main.yml # 和role相关的变量
default/
main.yml # 默认值,优先级比vars低
meta/
main.yml # 定义依赖等
library/my_module.py # roles可以包含自定义的modules
module_utils/ # roles可以包含自定义的module_utils
lookup_plugins/ # 其他插件
<playbook_name>.yml # 通过roles属性指定使用的roles
如何查找roles
默认情况下,ansible会从以下位置查找roles
- 在collection中
- 在playbook文件相同目录下的roles目录中
~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
设置的roles_path- playbook文件所在目录
也可以直接通过绝对路径指定
---
- hosts: localhost
roles:
- role: '/path/to/role'
使用roles
- 通常用法,在play中通过roles选项指定
- 在任务中,可以通过
include_role
/import_role
指定 - 作为依赖,在
meta/main.yml
中通过dependencies
指定
play级别使用roles
---
- hosts: localhost
roles:
- role1
- roles: role2
vars:
var1: value1
tags: tag1
-
Ansible会静态引用roles,在解析阶段处理这些roles,按一下顺序执行
-
play中定义的
pre_tasks
-
pre_tasks
触发的handlers -
按列表顺序依次执行roles指定的role
meta/main.yml
中定义的依赖先运行
-
play中定义的tasks
-
roles或tasks触发的handlers
-
play中定义的
post_tasks
-
post_tasks
触发的handlers
-
-
role上指定tag,该tag会被应用到role中所有tasks上
任务级别使用roles
-
动态复用:include_role
--- - hosts: localhost tasks: - name: task1 include_role: name: role_name - name: task2 include_role: name: role_name vars: var1: var_value tags: tagA when: condition
-
静态复用:import_role
--- - hosts: localhost tasks: - name: task1 import_role: name: role_name - name: task2 import_role: name: role_name vars: var1: var_value tags: tagA when: condition
-
区别
- include_role下使用tag,是针对include本身,而import_role下使用tag,是针对引入的角色中所有的任务
role参数验证
- 从2.11开始
- 在
meta/argument_specs.yml
定义规格
# meta/argument_specs.yml
---
argument_specs:
# tasks/main.yml entry point
main: # 对应main名称
short_description: 简单描述
description:
- 多行描述
- 多行描述
author:
- 作者
options: # 选项,也成为参数或者变量
变量名:
type: "int | str | list | dict" # 变量类型, 当为list时,需要指定elements
version_added: 指定加入的版本
required: false | true # 是否必需
default: 默认值
choices:
- 选项
description:
- 变量描述
options: # 再定义dict中的变量
var_str:
type: "str"
required: true
description: "The string value"
var_list:
type: "list"
elements: "str"
required: true
description: "A list of string values."
var_list_with_dicts:
type: "list"
elements: "dict"
required: false
default:
- kind: "kind1"
required: true
time: 60
- kind: "kind2"
time: 5
description: "A list of dicts with a defined structure and with default a value."
options:
kind:
type: "str"
choices:
- "a"
- "b"
required: false
description: "A string value with a limited list of allowed choices."
required:
type: "bool"
required: false
default: false
description: "Whether the kind of food requires boiling before consumption."
time:
type: int
required: true
description: "Time to prepare."
# tasks/alternate.yml entry point
alternate: # 对应任务文件除去后缀的名称
short_description: 简单描述
description:
- 详细描述
options:
var1:
type: "int"
required: false
default: 1024
description: "The integer value, defaulting to 1024."
在一个play多次运行一个role
---
- hosts: localhost
roles:
- role1
- role2
- role1 # role1只会执行一次
通过以下方式可以执行多次
-
传不同的参数
--- - hosts: localhost roles: - role: role1 message: first - role: role1 message: second
-
在
meta/main.yml
中设置allow_duplicates: true
role依赖
在meta/main.yml
中定义,依赖会被先执行
---
dependencies:
- role: role1
vars:
var1: value1
- role: role2
vars:
var2: value2