layout: post
title: Ansible-playbook的role
date: 2018-01-16
tags: [“Ansible”,”自动化运维工具”]
一、role简介
ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。
roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
复杂场景:建议使用roles,因为:
代码复用度高
变更指定主机或主机组
如命名不规范维护和传承成本大
某些功能需多个Playbook,通过Includes即可实现
二、Ansible Roles目录编排
脑图链接:http://naotu.baidu.com/file/bb752bd0630f20f9c35b32a5ae667e6f
三、创建role
1) 创建以roles命名的目录,(在你认为合适的目录,可以在家目录也可以在其他地方,我这里会在/app /ansible这个目录下做演示)
2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等
3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
4) 在playbook文件中,调用各角色
- [root@ansible /]# mkdir -p /app/ansible/roles/nginx/{files,tasks,templates,handlers,vars}
- [root@ansible /]# touch /app/ansible/roles/nginx/files/main.yml
- [root@ansible /]# touch /app/ansible/roles/nginx/tasks/{groupadd.yml,install.yml,main.yml,restart.yml,useradd.yml,cp_source_file.yml,untar.yml}
- [root@ansible /]# touch /app/ansible/roles/nginx/vars/main.yml
- [root@ansible sourcefile]# cp tengine-2.2.1.tar.gz /app/ansible/roles/nginx/files/
脑图地址:http://naotu.baidu.com/file/b775a3b4de1e856b6648bed7d0ed4bdf
四、以上图为例编写roles
- cat roles/nginx/tasks/main.yml #总纲
- - include: groupadd.yml
- - include: useradd.yml
- - include: install.yml
- - include: restart.yml
- - include: untar.yml
- - include: cp_source_file.yml
- cat roles/nginx/tasks/useradd.yml
- - name: add user
- user: name=nginx shell=/sbin/nologin createhome=no system=yes state=present
- cat roles/nginx/tasks/groupadd.yml
- - name: add group
- group: name=nginx state=present system=yes
- cat roles/nginx/tasks/untar.yml
- - name: untar nginx
- shell: tar -xf /app/tegine-2.2.1.tar.gz -C /app/
- cat roles/nginx/tasks/install.yml
- - name: install some packeges
- yum: name=pcre-devel state=latest
- when: ansible_distribution_major_version=='6'
- - name: config nginx
- shell: chdir=/app/tengine-2.2.1 ./configure
- - name: make nginx
- shell: chdir=/app/tengine-2.2.1 make && make install
- cat roles/nginx/tasks/restart.yml
- - name: restart the server
- shell: /usr/local/nginx/sbin/nginx '' { ps aux ' grep -v grep ' grep nginx ' grep master ' awk '{print $2}' ' xargs kill -9 ; /usr/local/nginx/sbin/nginx ; }
- cat roles/nginx/tasks/cp_source_file.yml
- - name: cp source nginx files
- copy: src=tegine-2.2.1.tar.gz dest=/app/
roles编写好之后就是调用了,我们需要在与roles平级的目录下创建一个yml剧本,用以调用roles
- [root@ansible ansible]# cat nginx_install.yml
- - hosts: webserver
- remote_user: root
- roles:
- - nginx # 调用nginx的roles
执行ansible-playbook nginx_install.yml 就可以执行了
roles playbook tags使用,当我们指向调用某个roles是可以使用tags
cat nginx-role.yml
---
- hosts: testweb
remote_user: root
roles:
- { role: nginx ,tags: [ 'nginx', 'web' ] ,when:
ansible_distribution_major_version == "6" }
- { role: httpd ,tags: [ 'httpd', 'web' ] }
- { role: mysql ,tags: [ 'mysql', 'db' ] }
- { role: marridb ,tags: [ 'mysql', 'db' ] }
- { role: php }
通过tags来调用指定roles
ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml