1. 角色介绍
1.1 Ansible角色概述
Ansible角色提供了一种方式,能够以更轻松的方式重用Ansible代码。通过角色,可以将任务、变量、文件、模板和依赖资源等内容打包在一起,以标准化目录结构进行组织。这样,可以将一个角色从一个项目复制到另一个项目,而不需要复杂的调整。
1.2 角色的具体应用
通过编写良好的角色,可以在playbook中传递调整行为的变量,并设置与站点相关的主机名、IP地址、用户名、密码等具体细节信息。例如,部署数据库服务器的角色可以包括设置主机名、数据库管理员用户名和密码,以及需要安装的数据库软件包。角色的作者可以确保这些变量有合理的默认值。
1.3 Ansible角色的优点
- 角色可以分组内容,从而与他人轻松共享代码。
- 可以编写角色来定义系统类型的基本要素:Web服务器、数据库服务器、Git存储库等。
- 角色使得较大型项目更容易管理。
- 角色可以由不同的管理员并行开发。
2. 角色的目录结构
每个Ansible角色都有一个标准化的目录结构,如下所示:
子目录 | 功能 |
---|---|
defaults | 包含角色变量的默认值,这些变量的优先级最低。 |
files | 包含角色任务引用的静态文件。 |
handlers | 包含角色的处理程序定义。 |
meta | 包含角色的元数据,如作者、许可证、平台和角色依赖项。 |
tasks | 包含角色的任务定义。 |
templates | 包含Jinja2模板文件。 |
tests | 包含测试文件及测试playbook。 |
vars | 包含角色的变量定义,这些变量的优先级较高。 |
并非所有的角色都有这些目录。defaults目录下的变量优先级最低,vars目录中的变量优先级较高(没有副本最高)。
3. 安装
3.1 安装RHEL系统角色
使用以下命令安装RHEL系统角色:
yum install rhel-system-roles
安装后,RHEL系统角色位于 /usr/share/ansible/roles/
目录中:
ls -l /usr/share/ansible/roles/
total 20
...output omitted...
linux-system-roles.kdump -> rhel-system-roles.kdump
linux-system-roles.network -> rhel-system-roles.network
linux-system-roles.postfix -> rhel-system-roles.postfix
linux-system-roles.selinux -> rhel-system-roles.selinux
linux-system-roles.timesync -> rhel-system-roles.timesync
...output omitted...
每个角色的对应上游名称链接接到RHEL系统角色。这使得角色可在playbook中通过其名称来引用。
4. 使用Ansible角色
4.1 在playbook中使用角色
使用角色非常简单,如下示例展示了调用Ansible角色的一种方式:
---
- hosts: remote.example.com
roles:
- role1
- role2
对于每个指定的角色,角色任务、角色处理程序、角色变量和角色依赖项将按顺序导入到playbook中。角色中的任何 copy
, script
, template
或 include_tasks
/import_tasks
任务都可以引用角色中相关的文件。Ansible将分别在角色的 files
, templates
或 tasks
子目录中寻找它们。
4.2 自定义角色变量
以下示例展示了如何设置角色 role2
的两个变量 var1
和 var2
的值:
---
- hosts: remote.example.com
roles:
- role1
- role2
var1: val1
var2: val2
也可以使用另一种等效的YAML语法:
---
- hosts: remote.example.com
roles:
- role1
- { role: role2, var1: val1, var2: val2 }
4.3 使用示例
使用rhel-system-roles.timesync角色配置时间同步:
---
- name: Time Synchronization Play
hosts: servers
vars:
timesync_ntp_servers:
- hostname: 0.rhel.pool.ntp.org
iburst: yes
- hostname: 1.rhel.pool.ntp.org
iburst: yes
- hostname: 2.rhel.pool.ntp.org
iburst: yes
timezone: UTC
roles:
- rhel-system-roles.timesync
tasks:
- name: Set timezone
timezone:
name: "{{ timezone }}"
使用角色安装Redis:
---
- name: 利用角色安装redis
hosts: web
roles:
- redis
Redis角色目录结构:
tree
.
└── redis
├── files
│ └── redis
│ └── redis-2.8.17-centos7.x86_64.rpm
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
│ └── redis.conf.j2
└── vars
└── main.yml
4.4 覆盖角色变量
要覆盖角色中的变量,需要在 roles
下一级结构中定义。如果写在脚本中与 roles
同级,则无法覆盖。
非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。
全网第一个AI+PPT提效小册希望能对大家有帮助订阅之后有专属学习交流群
以及AI考试资料分享