roles用于层次性,结构化地组织playbook,roles能够根据层次型结构自动装载变量文件,tasks以及handlers等。要使用只要载playbook中使用include指令引入即可。
(roles就是通过分别将变量,文件,任务,模板及处理器防置于单独的目录中。用要用于代码复用)
角色就是:palybook里面按照模块分离出来放到roles目录
roles内各目录含义解释
files:用来存放有copy模块或script模块调用的文件。
temlates:用来存放jinjia2模块,template模块会自动在此目录中寻找jinjia2模块文件
tasks:此目录因该包含一个main.yml文件,用于定义此角色的任务的任务列表,此文件可以使用include包含其他位于此目录的task文件。
roles的目录结构

#http mysql和php相当于playbook中的每个play主题
//roles 内各目录含义解释
 ●files
 用来存放由 copy 模块或 script 模块调用的文件。
●templates
 用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
●tasks
 此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
●handlers
 此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
●vars
 此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
●defaults
 此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。 这些变量具有所有可用变量中最低的优先级,并且可以很容易地被任何其他变量覆盖。所以生产中我们一般不在这里定义变量●meta
 此目录应当包含一个 main.yml 文件,用于定义此角色的元数据信息及其依赖关系。
在一个 playbook 中使用 roles 的步骤:
 (1)创建以 roles 命名的目录
 mkdir /etc/ansible/roles/ -p    #yum装完默认就有
(2)创建全局变量目录(可选)
 mkdir /etc/ansible/group_vars/ -p
 touch /etc/ansible/group_vars/all     #文件名自己定义,引用的时候注意
(3)在 roles 目录中分别创建以各角色名称命名的目录,如 httpd、mysql
 mkdir /etc/ansible/roles/httpd
 mkdir /etc/ansible/roles/mysql
(4)在每个角色命名的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建
 mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
 mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
(5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名
 touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
 touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
(6)修改 site.yml 文件,针对不同主机去调用不同的角色
 vim /etc/ansible/site.yml
 ---
 - hosts: webservers
   remote_user: root
   roles:
      - httpd
 - hosts: dbservers
   remote_user: root
   roles:
      - mysql
      
 (7)运行 ansible-playbook
 cd /etc/ansible
 ansible-playbook site.yml
 示例:
 mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
 mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
 mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
 touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
 touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
------编写httpd模块------
 写一个简单的tasks/main.yml
 vim /etc/ansible/roles/httpd/tasks/main.yml
 - name: install apache
   yum: name={{pkg}} state=latest
 - name: start apache
   service: enabled=true name={{svc}} state=started
  
 //定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中
 vim /etc/ansible/roles/httpd/vars/main.yml
 pkg: httpd
 svc: httpd
-------编写mysql模块-------
 vim /etc/ansible/roles/mysql/tasks/main.yml
 - name: install mysql
   yum: name={{pkg}} state=latest
 - name: start mysql
   service: enabled=true name={{svc}} state=started
   
 vim /etc/ansible/roles/mysql/vars/main.yml
 pkg:
   - mariadb
   - mariadb-server
 svc: mariadb
-------编写php模块-----
 vim /etc/ansible/roles/php/tasks/main.yml
 - name: install php
   yum: name={{pkg}} state=latest
 - name: start php-fpm
   service: enabled=true name={{svc}} state=started
vim /etc/ansible/roles/php/vars/main.yml
 pkg:
   - php
   - php-fpm
 svc: php-fpm
-----编写roles示例-----
 vim /etc/ansible/site.yml
 ---
 - hosts: webservers
   remote_user: root
   roles:
    - httpd
    - mysql
    - php
 cd /etc/ansible
 ansible-playbook site.yml
  



















