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文件中,调用各角色

  1. [root@ansible /]# mkdir -p /app/ansible/roles/nginx/{files,tasks,templates,handlers,vars}
  2. [root@ansible /]# touch /app/ansible/roles/nginx/files/main.yml
  3. [root@ansible /]# touch /app/ansible/roles/nginx/tasks/{groupadd.yml,install.yml,main.yml,restart.yml,useradd.yml,cp_source_file.yml,untar.yml}
  4. [root@ansible /]# touch /app/ansible/roles/nginx/vars/main.yml
  5. [root@ansible sourcefile]# cp tengine-2.2.1.tar.gz /app/ansible/roles/nginx/files/

脑图地址:http://naotu.baidu.com/file/b775a3b4de1e856b6648bed7d0ed4bdf

四、以上图为例编写roles

  1. cat roles/nginx/tasks/main.yml #总纲
  2. - include: groupadd.yml
  3. - include: useradd.yml
  4. - include: install.yml
  5. - include: restart.yml
  6. - include: untar.yml
  7. - include: cp_source_file.yml
  1. cat roles/nginx/tasks/useradd.yml
  2. - name: add user
  3. user: name=nginx shell=/sbin/nologin createhome=no system=yes state=present
  1. cat roles/nginx/tasks/groupadd.yml
  2. - name: add group
  3. group: name=nginx state=present system=yes
  1. cat roles/nginx/tasks/untar.yml
  2. - name: untar nginx
  3. shell: tar -xf /app/tegine-2.2.1.tar.gz -C /app/
  1. cat roles/nginx/tasks/install.yml
  2. - name: install some packeges
  3. yum: name=pcre-devel state=latest
  4. when: ansible_distribution_major_version=='6'
  5. - name: config nginx
  6. shell: chdir=/app/tengine-2.2.1 ./configure
  7. - name: make nginx
  8. shell: chdir=/app/tengine-2.2.1 make && make install
  1. cat roles/nginx/tasks/restart.yml
  2. - name: restart the server
  3. 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 ; }
  1. cat roles/nginx/tasks/cp_source_file.yml
  2. - name: cp source nginx files
  3. copy: src=tegine-2.2.1.tar.gz dest=/app/

roles编写好之后就是调用了,我们需要在与roles平级的目录下创建一个yml剧本,用以调用roles

  1. [root@ansible ansible]# cat nginx_install.yml
  2. - hosts: webserver
  3. remote_user: root
  4. roles:
  5. - nginx # 调用nginx的roles

执行ansible-playbook nginx_install.yml 就可以执行了

roles playbook tags使用,当我们指向调用某个roles是可以使用tags

  1. cat nginx-role.yml
  2. ---
  3. - hosts: testweb
  4. remote_user: root
  5. roles:
  6. - { role: nginx ,tags: [ 'nginx', 'web' ] ,when:
  7. ansible_distribution_major_version == "6" }
  8. - { role: httpd ,tags: [ 'httpd', 'web' ] }
  9. - { role: mysql ,tags: [ 'mysql', 'db' ] }
  10. - { role: marridb ,tags: [ 'mysql', 'db' ] }
  11. - { role: php }

通过tags来调用指定roles

  1. ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml
文档更新时间: 2018-12-20 16:03   作者:张尚