Roles
概念
- 由来:ansible自动化运行,基础由AD-Hoc命令来完成,在命令变多时,产生了playbook进行管理任务,简单任务使用playbook可以轻松处理,但是有复杂任务时单个playbook不可以胜任了,这时需要把多个playbook进行组合,少量用include将剧本中任务互相关联即可完成,但是playbook还在增多的情况时就不方便管理了,这时引入roles对playbook进行有效组织就十分必要了
- Roles:角色,是ansible自1.2版本开始引入的新特性
- 目的:用于层次性,结构化地组织playbook,roles能够根据层次型结构自动装载变量、文件、任务、模块及触发器
- 方法:roles通过分别将放置于变量、文件、任务、模块及触发器单独的目录中,并可以便捷地include它们的一种机制
- 应用:角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中
注意区分include与import模块(虽然都是task关联使用,但是差距很大)
- import_tasks(Static):静态方法会在playbooks解析阶段将父task变量和子task变量全部读取并加载,这时候如果父与子task都定义了相同变量,子task变量为最终值,再继续执行父task时,会影响变量相关判断条件
- include_tasks(Dynamic):动态方法则是在执行play之前才会加载自己变量,即一个父与子task执行时都是只使用自己的变量,不会互相进行干扰
官方roles网站及使用工具
- Ansible Galaxy(https://galaxy.ansible.com)是一个官网提供的免费共享和下载 Ansible 角色的网站,可以帮助我们更好的定义和学习roles
ansible-galaxy
命令:默认与https://galaxy.ansible.com网站API通信,可以查找、下载各种社区开发的 Ansible 角色
目录结构
#ansible安装后默认创建目录
/usr/share/ansible/roles #主要用于存放一些系统角色
/etc/ansible/roles #默认角色路径
#可以自定义roles文件,但是要在配置文件中指定文件路径
vim ansible.cfg
[defaults] #此模块内添加参数
roles_path=~/myroles #添加路径目录参数
#自定义目录myroles,创建apache项目
[ans@node1 myroles]$ ansible-galaxy init apache
- Role apache was created successfully
#初始化项目的目录层级
[ans@node1 myroles]$ tree -C apache/
apache/ <---具体的角色项目名称,比如nginx、tomcat、php(自由设置)
├── defaults <--用于为当前角色设定默认变量,此目录应当包含一个main.yml文件
│ └── main.yml <--main.yml,类似代码中的主函数,进行统一管理
├── files <--用来存放由copy模块或script模块等模块调用的文件
├── handlers <--用于定义此角色中触发条件时执行的动作,此目录应当包含一个main.yml文件
│ └── main.yml
├── meta <--用于定义此角色的特殊设定及其依赖关系,此目录应当包含一个main.yml文件
│ └── main.yml
├── README.md <--说明文件
├── tasks <--用于定义当前角色的任务列表,此目录应当包含一个main.yml文件
│ └── main.yml
├── templates <--用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件
├── tests <--用于存放测试role本身功能的playbook和主机定义文件,在开发测试阶段比较常用,此目录应当包含一个main.yml文件和自身资源设定invetory
│ ├── inventory
│ └── test.yml
└── vars <--用于定义此角色用到的变量,此目录应当包含一个main.yml文件
└── main.yml
#官网给出的项目文件层级样例
site.yml #应该是同一目录层级的3个剧本
webservers.yml
fooservers.yml
roles/ #roels目录,可以看出与剧本是同一层级
common/ #common项目
files/ #项目中的指定文件目录
templates/
tasks/
handlers/
vars/
defaults/
meta/
webservers/ #webservers项目,common项目都在roles目录中,同一目录层级
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
roles实践
将之前写好的一个简单剧本、相关模板与变量,进行拆分迁移写入roles中
源剧本
####################### 剧本 #######################
[ans@node1 ansible]$ vim playbook.yml
- hosts: app
vars:
web_package: httpd
web_service: httpd
tasks:
- name: install apache
yum:
name: "{
{ web_package }}"
state: installed
- name: start apache
service:
name: "{
{ web_service }}"
state: started
- name: create index.html
copy:
content: "{
{ ansible_hostname }}\n"
dest: /var/www/html/index.html
- name: config apache
template:
src: files/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: restart apache
handlers:
- name: restart apache
service:
name: "{
{ web_service }}