roles介绍
角色(roles)是ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中。
角色的相关概念
每个角色都是以特定的层级目录结构进行组织:
files:
存放由copy或script模块等调用的文件。
templates:
template模块查找所需要模板文件的目录。
tasks:
用于定义任务,至少应该包含一个名为main.yml的文件(类似于java和go等编译性语言,用于指定程序的入口),其他的文件需要在此文件中通过include进行包含。
handlers:
定义处理器,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含。
vars:
定义变量,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含。
meta:
定义元数据,至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系,其他的文件需要在此文件中通过include进行包含。
default:
设定模式变量时使用此目录中的main.yml文件。
这是他的项目结构
site.yml
webservers.yml
fooservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
role存放的路径在配置文件ansible.cfg中定义
roles_path = path/roles (默认目录:/etc/ansible/roles)
创建目录结构
ansible-galaxy init apache(创建apache目录结构,即角色)
ansible-galaxy role list ##查看角色列表
playbook中使用roles
- playbook中使用roles:
---
- hosts: server2
roles:
- role: role1
- role: role2
var1: value1 ##此处变量会覆盖roles中的定义变量
...
控制任务执行顺序
---
- hosts: server2
roles:
- role: role1 ##角色任务
pre_tasks: ##角色执行前执行的play
- tasks1
tasks: ##普通任务
- tasks2
post_tasks: ##在角色和普通任务执行完毕后执行的play
- tasks3
handlers:
...
创建一个角色框架
[root@RedHat roles]# ansible-galaxy init ceshi
- Role ceshi was created successfully
[root@RedHat roles]# tree
.
└── ceshi
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
9 directories, 8 files
如果想在playbook中使用角色只需要
---
- hosts: ***
roles:
- role1
- role2
创建简易的角色任务
[root@RedHat roles]# tree //在roles中创建ceshi角色
.
├── ansible.cfg
├── ceshi
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml //任务写在这里
│ ├── templates
│ │ └── test.j2
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
├── hosts
├── inventory
└── test1.yml //test1.yml测试
[root@RedHat roles]# cat test1.yml
---
- hosts: php
roles:
- ceshi
[root@RedHat roles]# cat ceshi/tasks/main.yml
---
# tasks file for ceshi
- debug:
msg: "hello"
[root@RedHat roles]# ansible-playbook test1.yml //执行结果
PLAY [php] *******************************************************************************************
TASK [Gathering Facts] *******************************************************************************
ok: [php]
TASK [ceshi : debug] *********************************************************************************
ok: [php] => {
"msg": "hello"
}
PLAY RECAP *******************************************************************************************
php : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@RedHat roles]#
通过变量更改角色行为
编写良好的角色利用默认变量来改变角色行为,使之与相关的配置场景相符。这有助于让角色变得更为通用,可在各种不同的上下文中重复利用。
如果通过以下方式定义了相同的变量,则角色的defaults目录中定义的变量的值将被覆盖:
- 在清单文件中定义,作为主机变量或组变量
- 在playbook项目的group_vars或host_vars目录下的YAML文件中定义
- 作为变量嵌套在play的vars关键字中定义
- 在play的roles关键字中包含该角色时作为变量定义
创建test角色模板文件,引用Ansible事实和test_variable
[root@RedHat roles]# cat ceshi/templates/test.j2 //使用模板变量测试
This is the system {{ ansible_facts['hostname'] }}.
Today's date is: {{ ansible_facts['date_time']['date'] }}.
ceshi {{ ceshi_variable }}
[root@RedHat roles]# cat ceshi/defaults/main.yml
---
# defaults file for ceshi
ceshi_variable: apache
[root@RedHat roles]# ansible-playbook test1.yml
PLAY [php] *******************************************************************************************
TASK [Gathering Facts] *******************************************************************************
ok: [php]
TASK [ceshi : template] ******************************************************************************
changed: [php]
PLAY RECAP *******************************************************************************************
php : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@RedHat roles]# ansible php -a "cat /opt/test"
php | CHANGED | rc=0 >>
This is the system RedHat.
Today's date is: 2021-02-24.
ceshi apache