简介
Role 是 Ansible 中一种重要的组织和管理剧本的方式。它将相关的剧本、变量、任务等内容整合到一个目录结构中,以更加清晰的方式组织和管理 Ansible 剧本。
Role 的主要特点包括:
- 规范的目录结构:Role 的目录结构是固定的,包含特定的目录和文件,使得多个人共同协作时,更容易理解和维护。
- 可重用性:Role 可以被多个剧本调用和重复使用,可以提高代码的复用率,减少代码量。
- 易于维护:Role 可以独立进行测试和调试,减少了维护成本,可以让多个人协作维护。
- 依赖管理:Role 可以在剧本中声明依赖关系,自动安装依赖的 Role,以及在需要时更新依赖。
Role 的优点:
- 简化维护:通过 Role,可以将各个模块化的任务整合到一个目录中,更加方便维护。
- 重用性:Role 可以在多个剧本中重复使用,减少代码的重复编写,提高代码复用率。
- 可拓展性:在一个 Role 中,可以定义多个任务,实现更多的功能,并且可以将 Role 作为依赖,实现更高级的功能。
Role 的缺点:
- Role 本身的开发和维护成本较高,需要考虑各种情况,以满足不同场景下的需求。
- 规范的目录结构限制了 Role 的自由度,有时候需要在目录结构上做出一些妥协。
- 一些特殊的场景下,使用 Role 可能会带来不必要的复杂度和开销,需要根据具体情况做出选择。
my_role/
├── defaults/
│ └── main.yml
├── files/
│ ├── file1
│ └── file2
├── handlers/
│ └── main.yml
├── meta/
│ └── main.yml
├── tasks/
│ └── main.yml
├── templates/
│ ├── template1.j2
│ └── template2.j2
├── tests/
│ ├── inventory
│ └── test.yml
├── vars/
│ └── main.yml
└── README.md
:::tips
每个目录和文件的作用如下:
- defaults/ 目录:存放 Role 的默认变量。Ansible 会自动加载这个目录下的 main.yml 文件作为默认变量,如果 Playbook 中没有定义该变量,则会使用该目录下的变量。
- files/ 目录:存放一些需要传输到远程节点的文件。这些文件可以在 Playbook 中使用 copy 模块或者 template 模块传输到远程节点。
- handlers/ 目录:存放处理任务的通知器(handler),它们会在任务执行成功后触发。通常用于重启服务或者重新加载配置文件等操作。
- meta/ 目录:存放与 Role 相关的元数据,例如 Role 的作者,依赖的其他 Role 等。
- tasks/ 目录:存放 Role 的主要任务。Ansible 会自动加载该目录下的 main.yml 文件,这个文件包含了需要执行的任务。
- templates/ 目录:存放 Jinja2 模板文件,可以在 Playbook 中使用 template 模块将这些模板转换为文本文件。
- tests/ 目录:存放测试 Playbook 和测试用例。可以使用 ansible-test 命令运行这些测试。
- vars/ 目录:存放 Role 的变量。Ansible 会自动加载该目录下的 main.yml 文件作为变量定义。
:::
使用案例
- 先创建一个playbooks目录,进入playbooks目录再创建playbooks的文件以及hosts主机列表文件
mkdir playbooks
cd playbooks
touch playbooks-role.yml hosts
- 在playbooks目录中创建相关的roles,有两种创建方法
- 第一个方法,使用ansible-galaxy 创建roles
cd playbooks
#创建名为nignx的roles
ansible-galaxy init nginx
1. 编写nginx的roles下的tasks的main.yml
# vim nginx/tasks/main.yml
---
- name: Get hostname
command: hostname
register: result
- name: Display hostname
debug:
var: result.stdout
- name: Add Nginx YUM repository
shell: |
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum update -y
yum makecache
- name: Install Nginx
yum:
name: nginx-{{ nginx_version }}
state: present
2. 编写nginx的roles下的defaults的main.yml
# vim nginx/defaults/main.yml
---
# defaults file for nginx
nginx_version: "1.20.2"
- 第二个方法,手动创建roles
cd playbooks
#创建名为test的role的目录和tasks任务目录
mkdir -p test/tasks
#编写tasks任务
vim test/tasks/main.yml
---
- name: 测试
shell: echo $HOSTNAME
- name: username
user:
name: test
password: "{{ 'password' | password_hash('sha512') }}"
shell: /bin/bash
createhome: yes
- 编写playbooks-role.yml文件
---
- name: Install Nginx on web servers
hosts: webservers
become: true
#引用roles
roles:
- nginx
- test
- 编写hosts主机列表文件
[webservers]
192.168.10.52
- 执行
#执行测试
ansible-playbook install_nginx.yml -i host -k --check
#确认没有问题去掉--check参数执行
ansible-playbook install_nginx.yml -i host -k