小机灵鬼|自动化运维工具:ansible(二)( 八 )

15、roles1>定义:ansilbe自1.2版本引入的新特性 , 用于层次性、结构化的组织playbook 。 roles能够根据层次型结构自动装载变量文件、tasks以及handlers等 。 要使用roles只需要在playbook中使用include指令即可 。 简单来讲 , roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中 , 并可以便捷地include它们的一种机制 。 角色一般用于基于主机构建服务的场景中 , 但也可以是用于构建守护进程等场景中 。
复杂场景:建议使用roles , 代码复用度高

  • 变更指定主机或主机组
  • 如命名不规范维护和传承成本大
  • 某些功能需多个Playbook , 通过Includes即可实现
2>roles目录结构
每个角色 , 以特定的层级目录结构进行组织
playbook.ymlroles/project/tasks/files/vars/不常用default/不常用templates/handlers/meta/不常用/roles/project/:项目名称 , 有以下子目录
files/ : 存放由copy或script模块等调用的文件
templates/ : template模块查找所需要模板文件的目录
tasks/ : 定义task , role的基本元素 , 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
handlers/ : 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
vars/ : 定义变量 , 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
meta/ : 定义当前角色的特殊设定及其依赖关系 , 至少应该包含一个名为main.ymI的文件 , 其它文件需在此文件中通过include进行包含
default/ : 设定默认变量时使用此目录中的main.yml文件
3>使用:
角色(roles):角色集合
roles/(官方建议目录/etc/ansible/roles,不过也可以自定义)
  • mysql/
  • httpd/
  • nginx/
  • memcached/
[root@ansible ansible]#tree#构建目录结构 , 如果没有可以mkdir创建目录.└── roles├── httpd├── memcache├── mysql└── nginx5 directories, 0 files[root@ansible ansible]#cd roles/nginx/[root@ansible nginx]#pwd/root/ansible/roles/nginx[root@ansible nginx]#mkdir tasks templates#在roles/nginx创建一个任务目录和模板目录[root@ansible nginx]#lstaskstemplates[root@ansible nginx]#cd tasks/#进入任务tasks目录[root@ansible tasks]#vim group.yml#先创建组文件[root@ansible tasks]#cat group.yml- name: create groupgroup: name=nginx gid=80[root@ansible tasks]#vim user.yml#再创建用户文件[root@ansible tasks]#cat user.yml- name: create useruser: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin[root@ansible tasks]#vim yum.yml#再创建安装文件[root@ansible tasks]#cat yum.yml- name: install packageyum: name=nginx[root@ansible tasks]#vim start.yml#进而创建启动文件[root@ansible tasks]#cat start.yml- name: start serviceservice: name=nginx state=started enabled=yes[root@ansible tasks]#cp start.yml restart.yml[root@ansible tasks]#vim restart.yml#重启服务文件[root@ansible tasks]#cat restart.yml- name: restart serviceservice: name=nginx state=restarted[root@ansible templates]#cd ../templates/#进入模板templates目录[root@ansible templates]#cp /etc/nginx/nginx.conf nginx.conf.j2#拷贝本机的nginx文件成为模板文件[root@ansible templates]#vim nginx.conf.j2[root@ansible templates]#cd ../tasks/[root@ansible tasks]#lsgroup.ymlrestart.ymlstart.ymluser.ymlyum.yml[root@ansible tasks]#vim templ.yml[root@ansible tasks]#cat templ.yml#回到任务tasks目录 , 创建templ.yml文件- name: copy conftemplate: src=http://kandian.youth.cn/index/nginx.conf.j2 dest=/etc/nginx/[root@ansible roles]#lshttpdmemcachemysqlnginx[root@ansible roles]#cd ../[root@ansible ansible]#lsroles[root@ansible ansible]#vim nginx_role.yml#创建nginx role文件 , 注意必须和roles同级[root@ansible ansible]#cat nginx_role.yml- hosts: allremote_user: rootroles:- role: nginx[root@ansible ansible]#ansible-playbook -C nginx_role.yml#检查语法[root@ansible ansible]#ansible-playbook nginx_role.yml#执行总结:构建目录树结构如下[root@ansible ansible]#tree.├── nginx_role.yml└── roles├── httpd├── memcache├── mysql└── nginx├── tasks│├── group.yml│├── main.yml│├── restart.yml│├── start.yml│├── templ.yml│├── user.yml│└── yum.yml└── templates└── nginx.conf.j27 directories, 9 files


推荐阅读