ansible的role角色

2664 字
13 分钟
ansible的role角色

一、role角色概念#

Role 本质是按固定目录规范组织 Ansible 任务、变量、文件、模板等资源的集合。Ansible 会自动识别这些目录并加载对应内容,无需手动指定路径。

(简单理解就是role角色的概念就是将原本糅合在一个yaml文件里的模块任务分别拆分归类到各自的目录当中)

1.1 role角色标准目录结构#

Terminal window
roles/ # 所有角色的根目录(可自定义,建议默认)
├── 第一个角色名/ # 单个角色的目录(比如nginx、mysql)
├── defaults/ # 【默认变量】优先级最低,可被用户覆盖
└── main.yml # 变量定义文件(必须命名为main.yml)
├── files/ # 【静态文件】无需模板渲染的文件(如二进制包、静态配置)
├── handlers/ # 【处理器】触发式任务(如重启服务、重载配置)
└── main.yml
├── meta/ # 【元数据】角色依赖、作者、版本等信息
└── main.yml
├── tasks/ # 【核心任务】角色要执行的具体操作(必须有main.yml)
└── main.yml
├── templates/ # 【Jinja2模板】需要变量渲染的配置文件(如nginx.conf.j2)
├── tests/ # 【测试用例】角色的测试脚本(可选)
├── inventory # 测试用清单
└── test.yml # 测试用Playbook
└── vars/ # 【自定义变量】优先级高,一般为角色内部固定变量
└── main.yml
├── 第二个角色名/ # 角色的目录(比如nginx、mysql)
├── defaults/ # 【默认变量】优先级最低,可被用户覆盖
└── main.yml # 变量定义文件(必须命名为main.yml)
├── files/ # 【静态文件】无需模板渲染的文件(如二进制包、静态配置)
├── handlers/ # 【处理器】触发式任务(如重启服务、重载配置)
└── main.yml
├── meta/ # 【元数据】角色依赖、作者、版本等信息
└── main.yml
├── tasks/ # 【核心任务】角色要执行的具体操作(必须有main.yml)
└── main.yml
├── templates/ # 【Jinja2模板】需要变量渲染的配置文件(如nginx.conf.j2)
├── tests/ # 【测试用例】角色的测试脚本(可选)
├── inventory # 测试用清单
└── test.yml # 测试用Playbook
└── vars/ # 【自定义变量】优先级高,一般为角色内部固定变量
└── main.yml

role文件夹下可以有多个角色,playbook通过role参数调用不同的角色

1.1.1 快捷创建标准目录#

ansible-galaxy init命令自动生成标准化目录(避免手动建目录出错):

Terminal window
# 创建nginx角色,指定存放路径为/etc/ansible/roles/nginx
ansible-galaxy init /etc/ansible/roles/nginx

1.1.2 目录优先级#

vars/main.yml > defaults/main.yml:vars 里的变量优先级更高,一般用于角色内部固定值;defaults 用于可被用户覆盖的默认值。

角色内变量 小于 Playbook 中定义的变量 小于 命令行-e传递的变量:用户可灵活覆盖角色默认配置。

1.2 编写role核心文件#

1.2.1 defaults/main.yml(默认变量,可被覆盖)#

定义 Nginx 的默认端口、文档根目录等可配置项:

/etc/ansible/roles/nginx/defaults/main.yml
nginx_port: 80 # 默认监听80端口
nginx_docroot: /usr/share/nginx/html # 默认文档根目录
nginx_conf_path: /etc/nginx/nginx.conf # 配置文件路径

1.2.2 vars/main.yml(角色内部固定变量)#

定义无需用户修改的固定值(如包名、服务名):

/etc/ansible/roles/nginx/vars/main.yml
nginx_package: nginx # Nginx包名
nginx_service: nginx # Nginx服务名

1.2.3 tasks/main.yml(核心执行任务)#

编写安装、配置、启动 Nginx 的具体步骤:

/etc/ansible/roles/nginx/tasks/main.yml
# 1. 安装Nginx(CentOS用yum,Ubuntu可换apt)
- name: 安装Nginx软件包
yum:
name: "{{ nginx_package }}" # 变量放在vars/main.yml
state: present # 确保包存在
become: yes # 提权执行
# 2. 渲染并拷贝Nginx配置模板
- name: 拷贝Nginx配置模板
template:
src: nginx.conf.j2 # 模板文件(放在templates目录)
dest: "{{ nginx_conf_path }}" # 目标路径
mode: 0644 # 文件权限
become: yes
notify: 重启Nginx # 配置变更时触发处理器
# 3. 创建文档根目录
- name: 创建Nginx文档根目录
file:
path: "{{ nginx_docroot }}"
state: directory # 确保目录存在
mode: 0755
become: yes
# 4. 启动并启用Nginx服务
- name: 启动并设置Nginx开机自启
service:
name: "{{ nginx_service }}"
state: started # 启动服务
enabled: yes # 开机自启
become: yes

1.2.4 handlers/main.yml(处理器:触发重启)#

配置变更后重启 Nginx,仅在任务触发时执行:

/etc/ansible/roles/nginx/handlers/main.yml
- name: 重启Nginx
service:
name: "{{ nginx_service }}"
state: restarted
become: yes

1.2.5 templates/nginx.conf.j2(Jinja2 配置模板)#

编写带变量的 Nginx 配置模板(简化版):

/etc/ansible/roles/nginx/templates/nginx.conf.j2
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen {{ nginx_port }} default_server; # 渲染默认端口变量
listen [::]:{{ nginx_port }} default_server;
root {{ nginx_docroot }}; # 渲染文档根目录变量
index index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
}

1.3 编写 Playbook 调用 Role#

  1. 创建site.yml文件,指定目标主机并调用 nginx 角色:
Terminal window
# site.yml,名字无固定,任意即可,只是用于调用role角色的一个yml文件
# 调用的site.yml文件与roles目录之间也无层级要求,但一般是放于同级目录下
# 若site.yml与role目录之间完全独立,那么可以在ansib.cfg指定查找role目录(多个路径,冒号分割)
# 或在调用时指定role目录的绝对路径
- hosts: webservers # 目标主机组(需在inventory中定义)
become: yes # 全局提权
roles:
- role: nginx # 调用roles/nginx角色
# 可选:覆盖默认变量(比如把端口改成8080)
nginx_port: 8080
when: ansible_os_family == "RedHat" # 仅RedHat系(CentOS)执行,(可选操作)
  1. 执行Playbook
Terminal window
# -i 指定inventory清单文件,--ask-become-pass 提权密码(可选)
ansible-playbook -i inventory site.yml --ask-become-pass

1.4 将playbook拆解成为role角色案例#

使用案例:此为安装rsync的一个playbook文件

- hosts: test
vars:
user_id: '666'
rsync_user: 'www'
tasks:
# 1.创建www用户和组
- name: 01_create_group
group:
name: "{{ rsync_user }}"
gid: "{{ user_id }}"
# 2.创建www用户
- name: 02_create_user
user:
name: "{{ rsync_user }}"
gid: "{{ user_id }}"
group: "{{ rsync_user}}"
create_home: no
shell: /sbin/nologin
# 3.创建数据目录且授权
- name: 03_createUdata
file:
path: "{{ item }}"
state: direcotry
owner: "{{ rsync_user }}"
group: "{{ rsync_user}}"
mode: "755"
loop:
- /data
- /backup
# 4.安装rsync软件
- name: 04_install_rsync
yum:
name: rsync
state: latest
# 5.复制配置文件与密码文件
- name: 05_copy_config
copy:
src: "{{ item.src }}"
dest: /etc/
mode: "{{ item.mode }}"
notify:
- restart_rsyncd
loop:
- { src:/script/rsyncd.conf,mode:'644'}
- { src:/script/rsync.passwd,mode:'600'}
# 6.启动服务
- name: 06_start_rsync
systemd:
name: rsyncd
state: started
enabled: yes
# 7.重启服务
handlers:
- name: restart_rsyncd
systemd:
name: rsyncd
state: restarted

1.4.1 创建标准目录#

Terminal window
# 创建install_rsync角色,指定存放路径为./roles/install_rsync
ansible-galaxy init ./roles/install_rsync
# 展示目录结构
[root@mater-22 ~/ansible_role]#tree
.
└── roles
└── install_rsync
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
└── main.yml

1.4.2 拆分tasks部分#

最先拆分tasks部分,然后根据task里面所需的配置再进行创建

Terminal window
# 这是原playbook的tasks部分
tasks:
# 1.创建www用户和组
- name: 01_create_group
group:
name: "{{ rsync_user }}"
gid: "{{ user_id }}"
# 2.创建www用户
- name: 02_create_user
user:
name: "{{ rsync_user }}"
gid: "{{ user_id }}"
group: "{{ rsync_user}}"
create_home: no
shell: /sbin/nologin
# 3.创建数据目录且授权
- name: 03_createUdata
file:
path: "{{ item }}"
state: direcotry
owner: "{{ rsync_user }}"
group: "{{ rsync_user}}"
mode: "755"
loop:
- /data
- /backup
# 4.安装rsync软件
- name: 04_install_rsync
yum:
name: rsync
state: latest
# 5.复制配置文件与密码文件
- name: 05_copy_config
copy:
src: "{{ item.src }}"
dest: /etc/
mode: "{{ item.mode }}"
notify:
- restart_rsyncd
loop:
- { src:/script/rsyncd.conf,mode:'644'}
- { src:/script/rsync.passwd,mode:'600'}
# 6.启动服务
- name: 06_start_rsync
systemd:
name: rsyncd
state: started
enabled: yes

将其编辑到tasks的main.yml文件里

Terminal window
vim ./roles/install_rsync/tasks/main.yml
# 查看内容
[root@mater-22 ~/ansible_role]#cat ./roles/install_rsync/tasks/main.yml
---
# tasks file for ./roles/install_rsync
- name: 1.创建www用户组
group:
name: "{{rsync_user}}"
gid: "{{user_id}}"
- name: 2.创建www用户
user:
name: "{{rsync_user}}"
uid: "{{user_id}}"
group: "{{rsync_user}}"
create_home: no
shell: /sbin/nologin
- name: 3.创建数据目录并配置权限
file:
path: "{{item}}"
state: directory
owner: "{{rsync_user}}"
group: "{{rsync_user}}"
mode: 755
loop:
- /data
- /backup
- name: 4.安装rsync软件
yum:
name: rsync
state: latest
- name: 5.复制配置文件和密码文件
copy:
src: "{{item.src}}"
dest: /etc/
mode: "{{item.mode}}"
notify:
- restart_rsyncd
loop:
- {src:rsyncd.conf,mode:'644'}
- {src:rsync.passwd,mode:'600'}
- name: 6.启动服务
systemd:
name: rsyncd
state: started
enabled: yes

原playbook的tasks拆分后基本没什么变化,只有在调用配置文件和密码文件时的路径进行修改

1.4.3 拆分var变量部分#

在task中使用了变量,因此需要编辑var目录下的文件

Terminal window
# 原playbook里面的var变量如下
vars:
user_id: '666'
rsync_user: 'www'

将其编辑到vars目录下的main.yml下

Terminal window
vim ./roles/install_rsync/vars/main.yml
# 查看内容
[root@mater-22 ~/ansible_role]#cat ./roles/install_rsync/vars/main.yml
---
# vars file for ./roles/install_rsync
user_id: '666'
rsync_user: 'www'

1.4.4 拆分files部分#

在task任务中使用了文件,那么就需要将所需要的文件放入到files目录下

Terminal window
cd ./roles/install_rsync/files/
# 创建配置文件
vim rsyncd.conf
#粘贴如下内容
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connection = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = yes
auth users = myuser
secrets file = /etc/rsync.passwd
[backup]
comment = backup_dir
path = /backup
[data]
comment =date_dir
path = /data
# 保存退出
# 创建密码文件
vim rsync.passwd
# 粘贴如下文件
myuser:123456
# 保存退出

1.4.5 拆分handlers部分#

在原playbook中使用了handlers触发式任务,并且通过notify触发

Terminal window
# 原playbook的handlers部分:
handlers:
- name: restart_rsyncd
systemd:
name: rsyncd
state: restarted

将其编辑到handlers目录下的main.yml下

Terminal window
vim ./roles/install_rsync/handlers/main.yml
# 查看内容
[root@mater-22 ~/ansible_role]#cat ./roles/install_rsync/handlers/main.yml
---
# handlers file for ./roles/install_rsync
- name: restart_rsyncd
systemd:
name: rsyncd
state: restarted

至此,原playbook所需的任务、文件、变量等都已拆分到各个目录下,最后只需创建一个playbook调用该role角色即可

1.4.6 创建调用role角色的playbook#

这里直接在与roles目录同级下创建playbook,但调用的playbook的位置并没有要求

Terminal window
[root@mater-22 ~/ansible_role]#touch install_rsync.yml
[root@mater-22 ~/ansible_role]#tree -L 1
.
├── install_rsync.yml
└── roles
1 directory, 1 file
#================================
# 编辑文件
vim install_rsync.yml
# 查看内容
[root@mater-22 ~/ansible_role]#cat install_rsync.yml
- hosts: test
roles:
- install_rsync

1.4.6.1 执行这个playbook#

Terminal window
# 测试是否有错误
ansible-playbook -C install_rsync.yml
# 真实使用
ansible-playbook install_rsync.yml
Terminal window
# 成功执行
[root@mater-22 ~/ansible_role]#ansible-playbook install_rsync.yml
PLAY [test] **************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************
ok: [10.1.1.32]
ok: [10.1.1.31]
TASK [install_rsync : 创建www用户组] ******************************************************************************************************
changed: [10.1.1.31]
changed: [10.1.1.32]
TASK [install_rsync : 创建www用户] *******************************************************************************************************
changed: [10.1.1.31]
changed: [10.1.1.32]
TASK [install_rsync : 创建数据目录并配置权限] ***************************************************************************************************
changed: [10.1.1.32] => (item=/data)
changed: [10.1.1.31] => (item=/data)
changed: [10.1.1.31] => (item=/backup)
changed: [10.1.1.32] => (item=/backup)
TASK [install_rsync : 安装rsync软件] *****************************************************************************************************
changed: [10.1.1.32]
changed: [10.1.1.31]
TASK [install_rsync : 复制配置文件和密码文件] ***************************************************************************************************
changed: [10.1.1.32] => (item={u'src': u'rsyncd.conf', u'mode': u'644'})
changed: [10.1.1.31] => (item={u'src': u'rsyncd.conf', u'mode': u'644'})
changed: [10.1.1.32] => (item={u'src': u'rsync.passwd', u'mode': u'600'})
changed: [10.1.1.31] => (item={u'src': u'rsync.passwd', u'mode': u'600'})
TASK [install_rsync : 启动服务] **********************************************************************************************************
changed: [10.1.1.32]
changed: [10.1.1.31]
RUNNING HANDLER [install_rsync : restart_rsyncd] *************************************************************************************
changed: [10.1.1.32]
changed: [10.1.1.31]
PLAY RECAP ***************************************************************************************************************************
10.1.1.31 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
10.1.1.32 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

ansible的role角色
https://2233941.xyz/posts/ansible的role角色/
作者
lumifly
发布于
2026-08-04
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
lumifly
不逐世间万丈星河,自守一隅细碎明光
✨ 今日一言
" 加载中... "
——
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
本年还剩 -- --%
本月还剩 -- --%
本周还剩 -- --%
距离--
--
--
天气预报
站点统计
文章
24
分类
1
标签
15
总字数
136,852
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.12.1
文章许可
CC BY-NC-SA 4.0

文章目录