
Ansible Role详解
Roles
Roles介绍
ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。
roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。
要使用roles只需要在playbook中使用include指令即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,
并可以便捷地include它们的一种机制。
角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
特点
复杂场景:建议使用roles,代码复用度高
- 变更指定主机或主机组
- 如命名不规范维护和传承成本大
- 某些功能需多个Playbook,通过includes即可实现
Roles各目录作用
官方推荐在/etc/ansible/roles/
目录下创建项目。
目录 | 描述 |
---|---|
/roles/project | 项目名称 (然后再该项目下创建子目录) |
files/ | 存放由copy或script模块等调用的文件 |
templates/ | template模块查找所需要模块文件的目录 |
tasks/ | 定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含 |
vars/ | 定义变量,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含 |
meta/ | 定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其他文件需在此文件中通过include进行包含 |
default/ | 设定默认变量时使用此目录中的main.yml文件 |
nginx示例
删除原有的nginx
# 停止nginx服务
ansible all -m service -a 'name=nginx state=stopped'
# 卸载nginx应用
ansible all -m yum -a 'name=nginx state=absent'
# 删除nginx用户
ansible all -m user -a 'name=nginx state=absent'
# 删除nginx组
ansible all -m group -a 'name=nginx state=absent'
# 关闭httpd
ansible all -m shell -a 'systemctl stop httpd'
(1) 创建nginx的group组
(2) 创建nginx的user用户
(3) 安装nginx包
(4) 添加模板文件
(5) 启动服务
mkdir -p /etc/ansible/roles/nginx
cd /etc/ansible/roles/nginx
mkdir tasks
mkdir templates
cd tasks
vim group.yml
创建nginx组(
group.yml
)
- name: create group
group: name=nginx gid=80
创建nginx用户(
user.yml
)
- name: create user
user: name=nginx group=nginx system=yes shell=/sbin/nologin uid=80
创建安装包文件(
yum.yml
)
- name: install package
yum: name=nginx
启动服务(
start.yml
)
- name: start nginx service
service: name=nginx state=started enabled=yes
重启服务(
restart.yml
)
- name: restart nginx service
service: name=nginx state=restarted
然后通过cd ../templates/
切换到模板目录下,然后通过cp /etc/nginx/nginx.conf nginx.conf.j2
复制nginx配置到当前模板页下;然后做如下修改:
# 启动进程的数量按照CPU的核心+2个
worker_processes {{ ansible_processor_vcpus+2 }}
然后回到task目录下定义模板
cd ../tasks
vim templ.yml
- name: copy conf
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
定义主要如何执行的yml(
main.yml
) 按照顺序执行相关的文件
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: start.yml
最后在调用的时,切换到
roles
目录下(cd /etc/ansible/roles/
),创建nginx_role.yml
剧本。role表示你要执行的项目名。
- hosts: all
remote_user: root
roles:
- role: nginx
检测与执行
ansible-playbook -C nginx_role.yml
ansible-playbook nginx_role.yml
测试端口是否开启
ansible all -m shell -a 'ss -ntpl'
ansible all -m shell -a 'curl 127.0.0.1'
多项目执行
当我们在roles目录下除了有nginx项目,如果还有一个httpd的项目,想同时进行执行的话。可以通过修改nginx_role.yml文件进行执行多个剧本
- hosts: all
remote_user: root
roles:
- role: nginx
- role: httpd
调用第三方角色
如果在main.yml
文件中,我们想调用第三方httpd项目的copyfile.yml
文件,我们可以在main.yml
中这样添加。
- include: roles/httpd/tasks/copyfile.yml
需要注意的是:执行任务的时候第三方的角色yml如果是相对路径,那么需要改成绝对路径。
为多角色项目定义标签
- hosts: all
remote_user: root
roles:
- { role: nginx, tags: ['web','nginx'] }
- { role: httpd, tags: ['web','httpd'] }
- { role: app, tags: 'app' }
当我们需要执行指定的app
标签时,可以通过-t
的参数进行指定标签
ansible-playbook -t web nginx_role.yml
在多角色项目定义条件执行
这里我们只希望CentOS7的系统安装httpd
- hosts: all
remote_user: root
roles:
- { role: nginx, tags: ['web','nginx'] }
- { role: httpd, tags: ['web','httpd'] , when ansible_distribution_major_version == "7" }
- { role: app, tags: 'app' }
定义handlers与vars
在nginx角色项目中,我们要定义handlers与vars的话目录应该是:/etc/ansible/roles/nginx/handlers
与/etc/ansible/roles/nginx/vars
,在定义时请注意只能定义main.yml
文件。如何调用请参考以往文章。
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

