1、简介

  • roles 用于层次性、结构化地组织playbook。
  • roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。
  • roles 只需要在playbook中使用include指令即可。

简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地 include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

  1. #1. 定义角色存放的路径
  2. [root@hw10 ~]# grep roles /etc/ansible/ansible.cfg
  3. roles_path = /etc/ansible/roles
  4. [root@hw10 www]# ansible-config dump|grep -i roles
  5. DEFAULT_ROLES_PATH(default) = [u'/root/.ansible/roles', u'/usr/share/ansible/roles', u'/etc/ansible/roles']
  6. #2. 角色的集合
  7. # -L 限制目录显示层级
  8. [root@hw10 www]# tree /data/bestcem_install/roles -L 1
  9. /data/bestcem_install/roles
  10. ├── app
  11. ├── bi
  12. ├── init-docker
  13. ├── init-env
  14. ├── mongo
  15. ├── rabbitmq
  16. ├── redis
  17. └── web

2、角色目录

4、角色订制:roles - 图1

2.1 各目录作用

  1. mkdir -pv ./roles/project/{files,templates,vars,tasks,handlers,meta,default}
  2. # -d 显示文件夹,不显示文件
  3. [root@tx12 ~]# tree /root -d
  4. /root
  5. `-- roles
  6. `-- project
  7. |-- default # 设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
  8. |-- files # 存放由copy或script模块等调用的文件
  9. |-- handlers # 此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行include包含调用
  10. |-- meta # 定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行include包含调用
  11. |-- tasks # 至少要有一个tasks目录,定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
  12. |-- templates # 存储由template模块调用的模板文本
  13. |-- vars # 此目录用来存储playbook变量,文件名为main.yml,其它文件需要通过include包含

2.2 部署nginx

  1. mkdir -pv /data/ansible/roles/nginx/{tasks,handlers,templates,vars}
  2. #目录结构如下
  3. tree /data/ansible/roles/nginx/
  4. /data/ansible/roles/nginx/
  5. ├── handlers
  6. └── main.yml
  7. ├── tasks
  8. ├── config.yml
  9. ├── file.yml
  10. ├── install.yml
  11. ├── main.yml
  12. └── service.yml
  13. ├── templates
  14. ├── nginx7.conf.j2
  15. └── nginx8.conf.j2
  16. └── vars
  17. └── main.yml
  18. 4 directories, 9 files
  19. ###############################################################################
  20. #创建task文件
  21. cd /data/ansible/roles/nginx/
  22. vim tasks/main.yml
  23. - include: install.yml
  24. - include: config.yml
  25. - include: index.yml
  26. - include: service.yml
  27. vim tasks/install.yml
  28. - name: install
  29. yum: name=nginx
  30. vim tasks/config.yml
  31. - name: config file for centos7
  32. template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
  33. when: ansible_distribution_major_version=="7"
  34. notify: restart
  35. - name: config file for centos8
  36. template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
  37. when: ansible_distribution_major_version=="8"
  38. notify: restart
  39. vim tasks/index.yml
  40. - name: index.html
  41. copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/
  42. vim tasks/service.yml
  43. - name: start service
  44. service: name=nginx state=started enabled=yes
  45. ###############################################################################
  46. #创建handler文件
  47. cat handlers/main.yml
  48. - name: restart
  49. service: name=nginx state=restarted
  50. ###############################################################################
  51. #创建两个template文件
  52. cat templates/nginx7.conf.j2
  53. ...省略...
  54. user {{user}};
  55. worker_processes {{ansible_processor_vcpus+3}}; #修改此行
  56. error_log /var/log/nginx/error.log;
  57. pid /run/nginx.pid;
  58. ...省略...
  59. cat templates/nginx8.conf.j2
  60. ...省略...
  61. user nginx;
  62. worker_processes {{ansible_processor_vcpus**3}}; #修改此行
  63. error_log /var/log/nginx/error.log;
  64. pid /run/nginx.pid;
  65. ...省略...
  66. ###############################################################################
  67. #创建变量文件
  68. vim vars/main.yml
  69. user: daemon
  70. ###############################################################################
  71. #在playbook中调用角色
  72. vim /data/ansible/role_nginx.yml
  73. ---
  74. #nginx role
  75. - hosts: websrvs
  76. remote_user: root
  77. roles:
  78. - nginx
  79. #运行playbook
  80. ansible-playbook /data/ansible/role_nginx.yml

3、创建 roles

通常创建一个role的方法有两种:

  • 命令mkdir和touch行手动创建
  • 使用 ansible-galaxy 自动初始化一个 role
[root@tx12 ~]# ansible-galaxy init roles
- Role roles was created successfully
[root@tx12 ~]# ll
total 4
drwxr-xr-x 10 root root 4096 Jun 16 16:30 roles
[root@tx12 ~]# tree roles/
roles/
|-- defaults
|   `-- main.yml
|-- files
|-- handlers
|   `-- main.yml
|-- meta
|   `-- main.yml
|-- README.md
|-- tasks
|   `-- main.yml
|-- templates
|-- tests
|   |-- inventory
|   `-- test.yml
`-- vars
    `-- main.yml

8 directories, 8 files

4、role 引用

比较常用的方法,我们可以使用「roles:」语句引用role :

---
- hosts: node1
  roles:
     - role_A

---
- hosts: node1
  roles:
     - name: role_A
     - name: role_A

---
- hosts: node1
  roles:
     - role: role_A
     - role: role_A

---
# 使用绝对路径
- hosts: node1
  roles:
    - role: /root/lab-ansible/roles/role_A

# 引入的同时添加变量参数
---
- hosts: node1
  roles:
    - role: role_A
      vars:
        name: Maurice
        age: 100


# 引入的同时添加tag参数
---
# playbooks/test.yaml
- hosts: node1
  roles:
    - role: role_B
      tags:
        - tag_one
        - tag_two
    # 等价于上面
    - { role: role_B, tags:['tag_one','tag_two'] }