792 字
4 分钟

Ansible Role

常规的ansible playbook,其中可能涉及到上传多份文件到远程主机,这样一来,配置文件,剧本等内容都放在一个文件夹内,非常混乱,不便于管理。
Ansible Role可以将单个剧本拆分为多个子文件,更便于维护,修改和使用。

Ansible Role介绍#

role主要的作用是可以单独的通过一个有组织的结构、通过单独的目录管理如变量、文件、任务、模块、以及处理任务等,并且可以通过include导入使用这些目录。
roles主要依赖于目录的命名和摆放,默认tasks/main.yml是所有任务的人口,使用roles的过程也可以认为是目录规范化命名的过程。
roles每个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行所有定义的任务;

配置文件#

role目录被定义在ansible配置文件/etc/ansible/ansible.cfg中:

[root@master-61 /etc/ansible]#cat ansible.cfg | grep roles_path
#roles_path = /etc/ansible/roles

目录规划#

一个完整的roles是由task、handlers、files、vars、templates、meta等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用。
参见:https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html#role-directory-structure

Ansible Role定义了八个主要的标准目录,每个ansible role playbook中至少包含其中一个目录,使用不到的目录可以省略。目录结构如下:

Terminal window
.
├── ansible.cfg
├── hosts
└── roles
└── commom
├── defaults
├── files
├── handlers
├── library
├── meta
├── tasks
├── templates
└── vars

作用:

  • tasks/main.yml 角色执行的任务的主要列表。
  • handlers/main.yml 处理程序,可以在此角色内部或外部使用。
  • library/my_module.py 可在此角色中使用的模块
  • defaults/main.yml- 角色的默认变量,或者说变量的默认值;具有最低的优先级,可以被主动覆盖。
  • vars/main.yml- 角色的其他变量(有关更多信息,请参阅使用变量)。
  • files/main.yml- 角色部署的文件。
  • templates/main.yml- 角色部署的模板。
  • meta/main.yml- 角色的元数据,包括角色依赖项。

实践#

将之前的部署nfs的playbook以role的方式重写

roles文件结构#

Terminal window
.
├── ansible.cfg
├── deploy_nfs.yml
├── hosts
├── roles
│   ├── deploy_nfs
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── vars
│   │   └── main.yml
│   └── web_mount
│   ├── tasks
│   │   └── main.yml
│   └── vars
│   └── main.yml
└── web_mount.yml

nfs服务端#

tasks/main.yml#

- name: 01 - install apps
yum:
name: "{{ item }}"
state: installed
loop: "{{ apps }}"
- name: 02 - start and enable apps
systemd:
name: "{{ item }}"
state: started
enabled: true
loop: "{{ apps }}"
- name: 03 - setup nfs configuration
shell:
cmd: "echo '/data 172.16.1.0/24(rw,sync,all_squash)' >> /etc/exports"
notify:
- start nfs
- name: 04 - change wordpress file user and group
file:
path: "{{ target_path }}"
state: directory
owner: nfsnobody
group: nfsnobody
recurse: true

vars/main.yml#

apps:
- nfs-utils
- rpcbind
target_path: /data

handlers/main.yml#

- name: start nfs
systemd:
name: nfs
state: started
enabled: true

role启动文件deploy_nfs.yml#

该文件和roles目录平级

- hosts: nfs
roles:
- deploy_nfs

nfs服务端(web主机组)#

tasks/main.yml#

- name: 01 - install apps
yum:
name: "{{ item }}"
state: installed
loop: "{{ apps }}"
- name: 02 - start and enable apps
systemd:
name: "{{ item }}"
state: started
enabled: true
loop: "{{ apps }}"
- name: 03 - create mount directory
file:
path: "{{ mount_path }}"
state: directory
- name: 04 - mount
mount:
src: 172.16.1.31:/data
path: "{{ mount_path }}"
fstype: nfs
state: mounted

vars/main.yml#

apps:
- nfs-utils
- rpcbind
mount_path: /www

role启动文件web_mount.yml#

- hosts: web
roles:
- web_mount

支持与分享

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

赞助
Ansible Role
https://white-festa.net/posts/ansible-role/
作者
常世常暗
发布于
2022-10-11
许可协议
CC BY-NC-SA 4.0
最后更新于 2022-10-11,距今已过 1169 天

部分内容可能已过时

评论区

目录