在 Ansible 中,Roles(角色) 是一种模块化、结构化的组织方式,用于将复杂的 Playbook 拆分为多个独立的 “功能单元”(如 “部署 Nginx”“配置数据库”“安装 ELK” 等)。它通过固定的目录结构,将任务、变量、模板、文件等按功能分类存放,让代码更清晰、更易复用和维护,尤其适合大型项目、团队协作或需要跨项目复用的场景。
为什么需要 Roles?
jsroles/
└── elasticsearch/ # 角色名称(比如“部署 Elasticsearch”的角色)
├── tasks/ # 核心任务(必须有,存放要执行的任务列表)
│ └── main.yml # 任务入口文件(Ansible 会自动加载)
├── handlers/ # 处理器(存放被 notify 触发的任务,如重启服务)
│ └── main.yml
├── vars/ # 角色专属变量(优先级较高,通常不允许用户修改)
│ └── main.yml
├── defaults/ # 角色默认变量(优先级较低,允许用户在外部覆盖)
│ └── main.yml
├── templates/ # 模板文件(带变量的配置文件,如 elasticsearch.yml.j2)
├── files/ # 静态文件(无需渲染的文件,如证书、脚本)
└── meta/ # 角色元信息(如作者、依赖关系)
└── main.yml
js# 创建项目根目录
mkdir -p ~/nginx_role_demo
cd ~/nginx_role_demo
# 创建Roles及子目录(nginx为角色名)
mkdir -p roles/nginx/{tasks,handlers,templates,defaults,files}
# 最终目录结构如下
tree .
.
├── roles/
│ └── nginx/ # 角色名:部署Nginx
│ ├── tasks/ # 任务列表(核心)
│ ├── handlers/ # 处理器(重启服务等)
│ ├── templates/ # 模板文件(带变量)
│ ├── defaults/ # 默认变量(可被覆盖)
│ └── files/ # 静态文件(可选)
└── deploy_nginx.yml # 主Playbook:调用角色
jsvi /root/nginx_role_demo/roles/nginx/defaults/main.yml
定义 Nginx 端口、首页标题等默认值:
ymlnginx_port: 80 # 默认端口
page_title: "Default Web Page" # 默认首页标题
firewall_service: "firewalld" # 防火墙服务名(CentOS默认firewalld)
模板文件以.j2为后缀,通过{{ 变量名 }}引用变量:
jsvi /root/nginx_role_demo/roles/nginx/templates/nginx.conf.j2
jsserver {
listen {{ nginx_port }}; # 监听端口(引用defaults中的变量)
server_name _;
root /usr/share/nginx/html;
index index.html;
# 日志配置
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
用{{ ansible_hostname }}(Ansible 内置变量,获取主机名)和自定义标题:
jsvi /root/nginx_role_demo/roles/nginx/templates/index.html.j2
js
<!DOCTYPE html>
<html>
<head>
<title>{{ page_title }}</title>
</head>
<body>
<h1>Welcome to {{ page_title }}!</h1>
<p>Hostname: {{ ansible_hostname }}</p> <!-- 显示当前主机名 -->
<p>Deployed by Ansible Roles.</p>
</body>
</html>
jsvi /root/nginx_role_demo/roles/nginx/tasks/main.yml
定义安装、配置、启动等步骤:
yml# 任务1:安装Nginx
- name: 安装Nginx服务
yum:
name: nginx
state: present # 确保已安装
tags: install # 打标签,方便单独执行
# 任务2:复制Nginx配置文件(用templates目录的模板)
- name: 配置Nginx监听端口
template:
src: nginx.conf.j2 # 从templates目录加载模板
dest: /etc/nginx/conf.d/default.conf # 远程目标路径
mode: 0644 # 文件权限
notify: 重启Nginx # 配置文件变化时,触发handlers重启服务
tags: config
# 任务3:替换默认首页(用templates目录的模板)
- name: 部署自定义首页
template:
src: index.html.j2
dest: /usr/share/nginx/html/index.html
mode: 0644
tags: page
# 任务4:配置防火墙允许Nginx端口访问
- name: 防火墙允许{{ nginx_port }}端口
firewalld:
port: "{{ nginx_port }}/tcp"
permanent: yes # 永久生效
immediate: yes # 立即生效(无需重启防火墙)
state: enabled
tags: firewall
# 任务5:确保Nginx服务启动并开机自启
- name: 启动Nginx服务
service:
name: nginx
state: started
enabled: yes # 开机自启
tags: service
仅在被notify触发时执行:
jsvi /root/nginx_role_demo/roles/nginx/handlers/main.yml
js# roles/nginx/handlers/main.yml
- name: 重启Nginx
service:
name: nginx
state: restarted
在项目根目录创建 Playbook,指定目标主机并调用nginx角色,可覆盖默认变量:
jsvi /root/nginx_role_demo/deploy_nginx.yml
js# ~/nginx_role_demo/deploy_nginx.yml
- name: 使用Roles部署Nginx服务
hosts: elk1 # 目标主机组(对应hosts文件中的elk1)
remote_user: root # 远程执行用户
roles:
- role: nginx # 调用roles/nginx角色
vars:
# 覆盖默认变量:端口改为8080,首页标题改为"ELK Web Server"
nginx_port: 8080
page_title: "ELK Web Server"
在控制机项目目录下执行命令:
jscd ~/nginx_role_demo
ansible-playbook deploy_nginx.yml
只要看到都是绿色就没问题了,


验证
jscurl 192.168.183.112:8080
本文作者:松轩(^U^)
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!