自动化运维-Ansible05-角色(roles)
- roles是ansilbe 1.2版本引入的新特性,用于层次性、结构化地组织playbook。
- roles能够根据层次型结构自动加载变量文件、tasks以及handlers等。只要在playbook中使用include指令引入即可。
- 通常角色都存放在/etc/ansible/roles/,但也可以在其他目录。
1、ansible-galaxy命令
- ansible-galaxy:可以简单的理解为Github或PIP的功能,是Ansible官方一个分享role的功能平台。可以通过ansible-galaxy命令很简单的实现role的分享和安装。
- ansible-galaxy命令可以根据下载量和关注量等信息,查找和安装优秀的Roles。
- Roles下载地址:https://galaxy.ansible.com
//执行各种角色和收集相关的操作。 ]# ansible-galaxy -h usage: ansible-galaxy [-h] [--version] [-v] TYPE ... positional arguments: TYPE collection 管理Ansible Galaxy集合。 role 管理Ansible Galaxy角色。 ]# ansible-galaxy role -h usage: ansible-galaxy role [-h] ROLE_ACTION ... positional arguments: ROLE_ACTION info 查看指定role的详细信息。 list 列出本地已下载的Roles。 init 使用role的基本结构初始化新role。 search 通过标签、平台、作者或关键字搜索Galaxy数据库。 install 从file(s)、URL(s)或Ansible Galaxy安装role(s) remove 删除本地已下载的Roles。 delete 从Galaxy中移除角色。它不会删除或更改实际的GitHub存储库。 import 导入一个角色 setup 管理Galaxy和给定源代码之间的集成。 ]# ansible-galaxy collection -h usage: ansible-galaxy collection [-h] COLLECTION_ACTION ... positional arguments: COLLECTION_ACTION init 使用集合的基本结构初始化新的集合。 build 构建一个Ansible集合神器,可以发布到Ansible Galaxy。 publish 向Ansible Galaxy发布一个收藏品。 install 从file(s)、URL(s)或Ansible Galaxy安装集合
2、自定义角色
2.1、角色的目录结构
- 每个角色,以特定的层级目录结构进行组织:
- nginx/:目录名nginx就是角色名,至少要有一个tasks任务,其他目录都是可选的
- files/:存放由copy或script模块等调用的文件。
- templates/:存放模板文件。template模块查找所需要模板文件的目录,最好以.j2结尾
- tasks/:存放task任务列表。至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行引用。
- handlers/:存放handler触发器列表。至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行引用。
- vars/:存放自定义变量列表。至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含。
- meta/:定义当前角色的特殊设定及其依赖关系。至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行引用。
- default/:设定默认变量时使用此目录中的main.yml文件。
- nginx/:目录名nginx就是角色名,至少要有一个tasks任务,其他目录都是可选的
2.2、自定义nginx角色
- main函数:
- roles/x/tasks/main.yml:主函数,包括在其中的所有任务将被执行。
- roles/x/handlers/main.yml:所有包括其中的handlers将被执行。
- roles/x/vars/main.yml:所有包括在其中的变量将在roles中生效。
- roles/x/meta/main.yml:roles所有依赖将被正常登入。
- roles/x/{files,templates,tasks}/(dir depends on task):所有文件、模板都可存放在这里,放在这里最大的好处是不用指定绝对路径。
1、实现nginx角色的规划
- (1)创建一个系统组:nginx
- (2)创建一个系统用户:nginx
- (3)安装应用(yum):nginx
- (4)复制模板(tmplate):nginx.conf.j2
- (5)启动服务:service
- (6)重启服务:service
2、创建目录结构
mkdir -pv nginx/{tasks,handlers,templates}
3、创建任务
- 创建系统组
]# cat roles/nginx/tasks/nginx-group.yaml - name: create group group: name=nginx gid=80 system=yes
- 创建系统用户
]# cat roles/nginx/tasks/nginx-user.yaml - name: create user user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin
- 安装nginx
]# cat roles/nginx/tasks/nginx-install.yaml - name: install nginx yum: name=nginx
- 复制模板
]# cat roles/nginx/tasks/nginx-template.yaml - name: copy nginx config template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx
- 启动nginx
]# cat roles/nginx/tasks/nginx-start.yaml - name: start nginx service: name=nginx state=started enabled=yes
- 创建任务的man文件
]# cat roles/nginx/tasks/main.yaml - include: nginx-group.yaml - include: nginx-user.yaml - include: nginx-install.yaml - include: nginx-template.yaml - include: nginx-start.yaml
4、创建触发器
- 重启nginx
]# cat roles/nginx/handlers/nginx-restart.yaml - name: restart nginx service: name=nginx state=restarted
- 创建触发器的man文件
]# cat roles/nginx/handlers/main.yaml - include: nginx-restart.yaml
5、创建模板
]# cat roles/nginx/templates/nginx.conf.j2 user nginx; http { server { listen {{ ansible_default_ipv4.address }}:{{ web_port }}; } } ...
6、创建playbook
- 注意,playbook文件与roles目录同级。
]# cat nginx-playbook.yaml - hosts: all roles: - nginx # - role: nginx # - {role: nginx, tages: ['web', 'nginx'], when: ansible_distribution_major_version == "7"}
- 目录结构
]# tree . ├── nginx-playbook.yaml └── roles └── nginx ├── handlers │ ├── main.yaml │ └── nginx-restart.yaml ├── tasks │ ├── main.yaml │ ├── nginx-group.yaml │ ├── nginx-install.yaml │ ├── nginx-start.yaml │ ├── nginx-template.yaml │ └── nginx-user.yaml └── templates └── nginx.conf.j2
7、应用该角色
ansible-playbook nginx-playbook.yaml -b -e "web_port=8080"
1
# #