1、roles简介php
ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles可以根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需在playbook中使用include指定便可。简单来说,roles就是经过分别将变量、文件、任务、模板以及处理器放置于单独目录中,并能够便捷的使用include指令将他们组织在一块的一种机制。角色通常用于基于主机构建服务的场景中,但也能够用于构建守护进程等场景中。复杂场景建议使用角色,代码复用度高。mysql
2、roles目录结构nginx
roles目录结构如上所示,每一个角色以特定的层次目录结构进行组织。其中roles/目录下是每一个角色的目录,好比上图有git和user两个角色,每一个角色下分别有tasks、files、vars等等目录,files/目录主要存放copy或scripts模块等调用的文件;templates/目录主要存放template模块查找所须要的模板文件;tasks/定义task,role的基本元素,至少应该包含一个名为main.yml的文件(这个文件就是tasks目录的入口文件),其余的文件须要在此文件中经过include进行包含;handlers/目录主要存放触发器任务的yml文件,一样它里面至少须要有一个main.yml的入口文件,其文件内容经过include指令引用其下文件;vars/目录主要存放定义的变量文件,一样也须要有main.yml文件;meta/目录定义当前角色的特殊设定以及依赖关系,一样这个目录也须要有一个main.yml的入口文件;default/设定默认变量时使用此目录中的main.yml文件;git
经过上面的介绍,不难发现roles是依赖目录的命名和摆放,默认tasks/main.yml是全部任务的入口,因此使用roles的过程能够理解为目录规范化命名的过程。每一个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行全部指定的任务。roles的调用文件playbook_roles.yml的内容以下web
--- - hosts: websers remote_user: root roles: - roles_name
说明:定义好角色咱们还须要写一个调用角色的playbook.yml 用于调用角色,其中咱们要写明这个角色用于那些主机(在那些主机上执行),在远程主机上以那个用户来执行角色以及执行那些角色。sql
角色的执行方法同执行playbook同样,咱们只须要执行定义调用角色的playbook便可;roles目录能够摆放在/etc/ansible/ansible.cfg中"roles_path"定义路径,也能够和入口playbook文件存放在同级目录,ansible没有强制的要求,但仍是建议将代码存放在代码集预先规划的目录,以便管理。shell
3、建立角色centos
一般建立role的步骤有以下4步bash
1)建立以roles命名的目录memcached
2)在roles目录中分别建立以各自角色名称命名的目录,如nginx等
3)在每一个角色命名的目录中分别建立files、handlers、meta、tasks、templates、和vars目录;若角色用不到的目录能够是空目录,也能够不建立
4)在playbook文件中,调用各角色
示例:将咱们以前写的playbook修改为角色
playbook代码以及目录结构以下:
[root@test ~]#tree . ├── install_nginx.yml └── templates ├── centos6_nginx.conf.j2 └── centos7_nginx.conf.j2 1 directory, 3 files [root@test ~]#cat install_nginx.yml --- - hosts: websers remote_user: root tasks: - name: install nginx yum: name=nginx - name: templates config file centos6 template: src=centos6_nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx when: ansible_distribution_major_version == "6" - name: templates config file centos 7 template: src=centos7_nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx when: ansible_distribution_major_version == "7" - name: start service service: name=nginx state=started handlers: - name: restart nginx service: name=nginx state=restarted [root@test ~]#
改编成角色目录结构以及各目录文件内容以下
[root@test ~]#tree . ├── install_nginx.yml ├── nginx_role.yml ├── roles │ └── nginx │ ├── handlers │ │ ├── main.yml │ │ └── restart_nginx.yml │ ├── tasks │ │ ├── install_nginx.yml │ │ ├── main.yml │ │ ├── nginx_service.yml │ │ └── template_config_file.yml │ └── templates │ ├── centos6_nginx.conf.j2 │ └── centos7_nginx.conf.j2 └── templates ├── centos6_nginx.conf.j2 └── centos7_nginx.conf.j2 6 directories, 12 files [root@test ~]#cat roles/nginx/tasks/install_nginx.yml - name: install nginx yum: name=nginx [root@test ~]#cat roles/nginx/tasks/template_config_file.yml - name: templates config file centos6 template: src=centos6_nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx when: ansible_distribution_major_version == "6" - name: tmeplates config file centos7 template: src=centos7_nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx when: ansible_distribution_major_version == "7" [root@test ~]#cat roles/nginx/tasks/nginx_service.yml - name: start service service: name=nginx state=started [root@test ~]#cat roles/nginx/tasks/main.yml - include: install_nginx.yml - include: template_config_file.yml - include: nginx_service.yml [root@test ~]#cat roles/nginx/handlers/restart_nginx.yml - name: restart nginx service: name=nginx state=restarted [root@test ~]#cat roles/nginx/handlers/main.yml - include: restart_nginx.yml [root@test ~]#
说明:以上目录编排就实现了一个简单角色,咱们把playbook内容分别用一个文件存放,而后按照每一个目录的main.yml文件定义的顺序依次执行,这里只是定义好了一个角色,咱们还须要写一个playbook来调用该角色便可。
[root@test ~]#cat nginx_role.yml --- - hosts: websers remote_user: root roles: - nginx [root@test ~]#
说明:以上就是一个调用咱们刚才编排好的nginx角色的playbook。用ansilble-playbook 命令去执行以上调用角色的playbook,就至关于咱们以前写的playbook功能彻底同样。
[root@test ~]#ansible-playbook nginx_role.yml PLAY [websers] ****************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************** ok: [192.168.0.128] ok: [192.168.0.218] TASK [nginx : install nginx] **************************************************************************************** changed: [192.168.0.128] changed: [192.168.0.218] TASK [nginx : templates config file centos6] ************************************************************************ changed: [192.168.0.128] changed: [192.168.0.218] TASK [nginx : tmeplates config file centos7] ************************************************************************ skipping: [192.168.0.128] skipping: [192.168.0.218] TASK [nginx : start service] **************************************************************************************** changed: [192.168.0.128] changed: [192.168.0.218] RUNNING HANDLER [nginx : restart nginx] ***************************************************************************** changed: [192.168.0.128] changed: [192.168.0.218] PLAY RECAP ********************************************************************************************************** 192.168.0.128 : ok=5 changed=4 unreachable=0 failed=0 192.168.0.218 : ok=5 changed=4 unreachable=0 failed=0 [root@test ~]#ansible websers -m shell -a 'ss -ntl' 192.168.0.128 | SUCCESS | rc=0 >> State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 :::80 :::* LISTEN 0 128 *:80 *:* LISTEN 0 128 :::22 :::* LISTEN 0 128 *:22 *:* 192.168.0.218 | SUCCESS | rc=0 >> State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:35725 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 *:111 *:* LISTEN 0 128 :::80 :::* LISTEN 0 128 *:80 *:* LISTEN 0 128 :::22 :::* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::47546 :::* [root@test ~]#
说明:可看到咱们把playbook改编成角色同咱们写的playbook执行后的结果是同样的,都实现了一样的功能。
4、角色调用
方法一:写好要调用的角色列表
--- - hosts: websers remote_user: root roles: - mysql - nginx - memcached
说明:此方法同上面示例同样,咱们须要调用那些角色,只须要把角色名写在角色列表里便可
方法二:调用角色的同时给角色传递变量
--- - hosts: websers remote_user: root roles: - mysql - {role: nginx,username: nginx} - memcached
说明:此方法在调用nginx角色的同时,还给nginx角色传递了一个变量和值,role键用于指定角色名,后续能够多个k/v,用于给角色传递变量。
方法三:基于条件测试实现角色调用
--- - hosts: websers remote_user: root roles: - mysql - {role: nginx,username: nginx} - {role: memcached,when: ansible_distribution_major_version == "7",username: memcached}
说明:此方法实现了当系统版本为7 的时候才调用memcached角色,换句话说只有在目标系统版本为7 的系统才能调用memchched角色,同时它也能够向脚本传递变量。
5、roles playbook tags 的使用
上面角色调用的时候咱们介绍了三种方式,事实上咱们不只能给角色传递变量,咱们还能够给角色打标签,经过执行playbook 指定标签 就能够实现只执行具备指定标签的角色,以下所示
--- - hosts: websers remote_user: root roles: - {role: mysql,tags: ["mysql","db"]} - {role: marridb,tags: ["mysql","db"]} - {role: nginx,tags: ["nginx","web"],username: nginx} - {role: memcached,when: ansible_distribution_major_version == "7",username: memcached} - {role: httpd,tags: ["httpd","web"]} - {role: php,tags: php}
说明:咱们在调用角色的时候,咱们能够给角色打上多个标签,其做用在于,这样把同类角色打上相同的标签,咱们在执行其playbook的时候就能够选择性的执行某些指定标签的角色,好比以上咱们执行标签为“web”的角色,咱们能够在执行playbook的时候用-t选项指定“web”,这样咱们就能够实现只在目标主机上执行httpd和nginx这两个角色的目的。若是咱们给一个角色打上多个标签须要写成列表的形式,用中括号把多个标签名给括起来,每一个标签之间用逗号隔开,同时须要注意的是,标签上一个字符串,须要用引号将其引发来。