ansible的Roles规范

本文介绍了Ansible的Roles概念及其目录结构,详细讲解了如何创建、修改和在Playbook中调用Roles。还探讨了如何控制Tasks执行顺序,并展示了rhel-system-roles的安装和目录结构。此外,文章还涵盖了ansible-galaxy命令行工具的使用,包括搜索、安装和管理Roles的方法。

什么是Roles

roles类似于开发框架,能极大的提高代码复用
在这里插入图片描述

role的目录结构

# 查看role的目录结构
[student@workstation]$ tree role_A
role_A
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

在这里插入图片描述

在这里插入图片描述


role目录结构详解

在这里插入图片描述

创建Roles

使用ansible-galaxy创建roles
在这里插入图片描述


创建一个名称为test的role

# 创建名称为test的role
[student@workstation roles]$ ansible-galaxy init test
- test was created successfully

# 查看test的role结构
[student@workstation roles]$ tree test
test
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

修改Role

在这里插入图片描述


在Playbook中调用Role

要在ansible.cfg中配置roles_path

# roles_path配置
roles_path=./roles:/usr/share/ansible/roles:/etc/ansible/roles 

在这里插入图片描述
在这里插入图片描述


向role中传递变量

- hosts: remotenode
  roles: 
  	- role: role1
  	- role: role2
 	  var1: var1	#role2的var1变量
 	  var2: var2	#role2的var2变量

控制tasks执行顺序

pre_tasks > role_task > play_task > post_task

  • 对于playbook中的每个play,task执行是按照task顺序的,在task执行完毕之后,handlers将会被执行。
  • 当role被添加进play的时候,role的task是被添加到所有的playbook的task之前的,如果第二个role添加了,它的task被添加在第一个role之后。
  • role的handlers一样是在role的play之下。每个play定义了一个handlers列表,role的handlers被添加到handlers列表的最前端,之后的handlers是在play下定义的handlers。
  • 在某些场景下,在roles之前执行某些play的task是必须的,为了支持这种场景,你可以使用pre_tasks,在pre_tasks定义的task可以在role之前被执行。如果在pre_tasks中定义的task通知了handler,那么这些hander也会比在role中的handlers提前运行。
  • play也支持post_tasks,post_tasks在正常定义的play中的tasks之后执行。

rhel-system-roles介绍

系统roles就是红帽官方写的roles

  • rhel-system-roles.kdump(稳定)
  • rhel-system-roles.network(稳定)
  • rhel-system-roles.selinux(稳定)
  • rhel-system-roles.timesync(稳定)
  • rhel-system-roles.postfix(测试版)
  • rhel-system-roles.firewall(开发阶段)
  • rhel-system-roles.tuned(开发阶段)

安装rhel-system-roles

# 安装rhel-system-roles
yum install rhel-system-roles -y

查看rhel-system-roles目录结构

# 查看rhel-system-roles目录结构
[student@workstation]$ ls -l /usr/share/ansible/roles/
total 0
lrwxrwxrwx.  1 root root  23 Jan 14  2019 linux-system-roles.kdump -> rhel-system-roles.kdump
lrwxrwxrwx.  1 root root  25 Jan 14  2019 linux-system-roles.network -> rhel-system-roles.network
lrwxrwxrwx.  1 root root  25 Jan 14  2019 linux-system-roles.postfix -> rhel-system-roles.postfix
lrwxrwxrwx.  1 root root  25 Jan 14  2019 linux-system-roles.selinux -> rhel-system-roles.selinux
lrwxrwxrwx.  1 root root  26 Jan 14  2019 linux-system-roles.timesync -> rhel-system-roles.timesync
drwxr-xr-x.  9 root root 173 Nov  5 00:15 rhel-system-roles.kdump
drwxr-xr-x.  8 root root 196 Nov  5 00:15 rhel-system-roles.network
drwxr-xr-x.  6 root root 114 Nov  5 00:15 rhel-system-roles.postfix
drwxr-xr-x.  7 root root 139 Nov  5 00:15 rhel-system-roles.selinux
drwxr-xr-x. 10 root root 188 Nov  5 00:15 rhel-system-roles.timesync

查看项目结构

# 查看项目结构
[student@workstation rhel-system-roles.kdump]$ tree
.
├── COPYING
├── defaults
│   └── main.yml
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.html
├── README.md
├── semaphore
├── tasks
│   ├── main.yml
│   └── ssh.yml
├── templates
│   ├── kdump.conf.j2
│   └── kdump.j2
├── tests
│   ├── roles
│   │   └── kdump -> ../..
│   ├── tests_default.yml
│   └── tests_ssh.yml
└── vars
    └── main.yml

ansible-galaxy命令行用法

在这里插入图片描述


ansible-galaxy搜索role

# 搜索config_mysql的role
ansible-galaxy search config_mysql

ansible-galaxy安装role

# ansible-galaxy安装role
ansible-galaxy install alikins.mysql

使用requirements.yml文件安装role

创建requirements.yml文件

# 从 Ansible Galaxy 安装role
- src: dfarrell07.opendaylight

# 从 GitHub 安装role
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight

# 从特定 git 分支安装role
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: origin/master

# 在 GitHub 的特定标签处安装role
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: 1.0.0

# 在 GitHub 的特定提交处安装role
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: <commit hash>

使用ansible-galaxy install -r安装role

# 使用ansible-galaxy安装role
ansible-galaxy install -r requirements.yml

ansible-galaxy安装role集合

# 安装role集合 -p 是安装到哪个目录
ansible-galaxy collection install nginxinc.nginx_core -p .

ansible-galaxy查看role详情

# ansible-galaxy查看role详情
[jp root ~]# ansible-galaxy info alikins.mysql

Role: alikins.mysql
        description: MySQL server for RHEL/CentOS and 

下载roles

在这里插入图片描述


ansible-galaxy管理下载的role

# 查看下载的role
## 要在ansible.cfg指定role_path的路径
[jp root ~]# ansible-galaxy list
- alikins.mysql, 0.99.2

# 删除下载的role
[jp root ~]# ansible-galaxy remove alikins.mysql
- successfully removed alikins.mysql

## 再查看role列表,已经没有alikins.mysql了
[jp root ~]# ansible-galaxy list
# /root/.ansible/roles
# /usr/share/ansible/roles
# /etc/ansible/roles

项目示例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


练习题:第五题

在这里插入图片描述
解题方法:
在这里插入图片描述


练习题:第七题

在这里插入图片描述
解题方法:

---
- name: 调用负载均衡role
  hosts: balancers
  roles:
    - balancer
# 注意还要调用一次apache这个role才会执行成功
- name: 调用phpinfo role
  hosts: webservers
  roles:
    - phpinfo
    - apache
<think>根据用户提供的信息,用户在使用Ansible时遇到了角色“linux-system-roles.timesync”找不到的问题。错误信息表明Ansible在指定的roles路径中找不到该角色。我们需要逐步解决这个问题。 ### 问题分析 1. **角色路径配置问题**:Ansible默认在`/etc/ansible/roles`和当前项目目录下的`roles`文件夹中查找角色。如果角色安装在其他位置,需要确保路径已正确配置。 2. **角色未安装**:用户可能尚未安装`linux-system-roles.timesync`角色。 3. **角色名称错误**:角色名称可能输入错误,或者需要包含命名空间(如`linux-system-roles.timesync`)。 ### 解决步骤 #### 1. **确认角色是否已安装** 使用`ansible-galaxy list`命令查看已安装的角色列表: ```bash ansible-galaxy list ``` 如果列表中包含`linux-system-roles.timesync`,则说明角色已安装,但路径可能未正确配置。否则需要安装。 #### 2. **安装角色** 通过`ansible-galaxy`从Ansible Galaxy仓库安装角色: ```bash ansible-galaxy install linux-system-roles.timesync ``` 默认安装路径为`~/.ansible/roles`(用户家目录下)。 #### 3. **配置角色路径** - **方法1:修改`ansible.cfg`** 在Ansible配置文件(通常是`/etc/ansible/ansible.cfg`或项目目录下的`ansible.cfg`)中设置`roles_path`: ```ini [defaults] roles_path = /path/to/your/roles:~/.ansible/roles:/usr/share/ansible/roles ``` 将`~/.ansible/roles`(或其他自定义路径)添加到`roles_path`中。 - **方法2:命令行指定路径** 在运行Playbook时通过`--roles-path`参数指定: ```bash ansible-playbook playbook.yml --roles-path=~/.ansible/roles ``` #### 4. **验证角色路径** 确保Playbook中引用角色的方式正确: ```yaml - hosts: all roles: - role: linux-system-roles.timesync # 直接使用角色名 # 或使用完整路径 - role: /absolute/path/to/linux-system-roles.timesync ``` #### 5. **检查角色名称** - 官方角色名称为`linux-system-roles.timesync`,确保无拼写错误。 - 若使用源码安装,需确认角色目录名符合规范(如`linux-system-roles.timesync`)。 ### 完整示例 假设角色安装在`~/.ansible/roles`,配置`ansible.cfg`: ```ini [defaults] roles_path = ~/.ansible/roles:/etc/ansible/roles ``` 然后运行Playbook: ```bash ansible-playbook your_playbook.yml ``` ### 常见问题排查 - **权限问题**:确保运行Ansible的用户有权限读取角色目录。 - **多环境隔离**:若使用虚拟环境,需确认角色安装在正确环境中。 ### 引用说明 [^1]: 引用中展示了Ansible的`ping`模块使用示例,说明节点通信正常,但未涉及角色加载问题。 [^2]: 引用显示Kubernetes节点状态,与Ansible无关,可忽略。 §§相关问题§§ 1. 如何自定义Ansible角色安装路径? 2. Ansible Galaxy有哪些常用命令? 3. 如何为Ansible Playbook调试角色加载问题?</think>### 问题分析:Ansible角色 'linux-system-roles.timesync' 未找到 该错误表明Ansible在指定路径中无法定位角色文件。可能原因包括: 1. **角色未安装**:未通过`ansible-galaxy`安装该角色 2. **路径配置错误**:角色安装路径未包含在`ansible.cfg`的`roles_path`中 3. **名称不匹配**:Playbook中引用的角色名与实际目录名不一致 --- ### 解决方案分步指南 #### 步骤1:安装缺失角色 通过Ansible Galaxy官方仓库安装角色: ```bash ansible-galaxy install linux-system-roles.timesync ``` * 默认安装路径:`~/.ansible/roles/` * 验证安装: ```bash ansible-galaxy list | grep timesync # 应输出:- linux-system-roles.timesync, (版本号) ``` #### 步骤2:配置角色路径 修改Ansible配置文件(优先级从高到低): 1. **项目级配置**(推荐): 在Playbook同级目录创建/修改`ansible.cfg`: ```ini [defaults] roles_path = ~/.ansible/roles:./roles:/usr/share/ansible/roles # 多个路径用冒号分隔 ``` 2. **用户级配置**: `~/.ansible.cfg`(当前用户生效) 3. **系统级配置**: `/etc/ansible/ansible.cfg`(需sudo权限) #### 步骤3:检查Playbook引用 确保Playbook中角色名称与目录名完全匹配: ```yaml roles: - role: linux-system-roles.timesync # 必须与安装目录名一致 # 参数配置... ``` #### 步骤4:路径强制指定(备用方案) 在Playbook中直接指定绝对路径: ```yaml roles: - role: /home/user/.ansible/roles/linux-system-roles.timesync ``` --- ### 验证方案 1. 执行临时命令检查角色加载: ```bash ansible localhost -m include_role -a name=linux-system-roles.timesync ``` 2. 成功时返回: ```json localhost | SUCCESS => { "changed": false, "include_variables": {...} } ``` --- ### 常见问题排查 | 现象 | 解决方案 | |------|----------| | `Permission denied` | 执行`chmod +x ~/.ansible/roles` | | 网络安装失败 | 添加`-p 指定路径`参数手动安装:<br>`ansible-galaxy install -p /my/roles linux-system-roles.timesync` | | 企业环境限制 | 离线下载角色包:<br>1. 访问[Galaxy页面](https://galaxy.ansible.com/linux-system-roles/timesync)<br>2. 下载.tar.gz<br>3. 解压到roles_path目录 | > **重要提示**:Linux系统角色需目标系统支持`chrony`或`ntpd`,请先确认受控节点已安装相关服务[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

教Linux的李老师

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值