10、roles

  1. roles
  2. ansible1.2版本引入的新特性,用于层次性、结构化地组织playbook
  3. roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。
  4. 要使用roles只需要在playbook中使用include指令即可。
  5. 简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,
  6. 并可以便捷地include它们的一种机制。
  7. 角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
  8. 复杂场景:建议使用roles,代码复用度高
  9. 变更指定主机或主机组
  10. 如命名不规范维护和传承成本大
  11. 某些功能需多个Playbook,通过includes即可实现

10.1、概述

  1. 角色(roles):角色集合
  2. roles/
  3. mysql/
  4. httpd/
  5. nginx/
  6. memcached/
  7. 可以互相调用

10.1.1、Ansible Roles目录编排

image.png

10.1.2、roles目录结构

  1. 每个角色,以特定的层级目录结构进行组织
  2. roles目录结构:
  3. playbook.yml 调用角色
  4. roles/
  5. project/ (角色名称)
  6. tasks/
  7. files/
  8. vars/
  9. templates/
  10. handlers/
  11. default/ 不常用
  12. meta/ 不常用

10.1.3、Roles各目录作用

  1. /roles/project/ :项目名称,有以下子目录
  2. files/ :存放由copyscript模块等调用的文件
  3. templates/:template模块查找所需要模板文件的目录
  4. tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;
  5. 其它的文件需要在此文件中通过include进行包含
  6. handlers/:至少应该包含一个名为main.yml的文件;
  7. 其它的文件需要在此文件中通过include进行包含
  8. vars/:定义变量,至少应该包含一个名为main.yml的文件;
  9. 其它的文件需要在此文件中通过include进行包含
  10. meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,
  11. 其它文件需在此文件中通过include进行包含
  12. default/:设定默认变量时使用此目录中的main.yml文件
  13. roles/appname 目录结构
  14. tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;
  15. 此文件可以使用include包含其它的位于此目录中的task文件
  16. files目录:存放由copyscript等模块调用的文件;
  17. templates目录:template模块会自动在此目录中寻找Jinja2模板文件
  18. handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler
  19. handler中使用include包含的其它的handler文件也应该位于此目录中;
  20. vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;
  21. meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;
  22. ansible1.3及其以后的版本才支持;
  23. default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件
  24. roles/example_role/files/ 所有文件,都将可存放在这里
  25. roles/example_role/templates/ 所有模板都存放在这里
  26. roles/example_role/tasks/main.yml 主函数,包括在其中的所有任务将被执行
  27. roles/example_role/handlers/main.yml:所有包括其中的 handlers 将被执行
  28. roles/example_role/vars/main.yml 所有包括在其中的变量将在roles中生效
  29. roles/example_role/meta/main.yml roles所有依赖将被正常登入

10.1.4、创建role步骤

  1. 创建role的步骤
  2. (1) 创建以roles命名的目录
  3. (2) roles目录中分别创建以各角色名称命名的目录,如webservers
  4. (3) 在每个角色命名的目录中分别创建fileshandlersmetataskstemplatesvars目录;
  5. 用不到的目录可以创建为空目录,也可以不创建
  6. (4) playbook文件中,调用各角色

10.1.5、针对大型项目使用Roles进行编排

  1. roles目录结构:
  2. playbook.yml
  3. roles/
  4. project/
  5. tasks/
  6. files/
  7. vars/
  8. templates/
  9. handlers/
  10. default/ # 不经常用
  11. meta/ # 不经常用
  12. 示例:
  13. nginx-role.yml
  14. roles/
  15. └── nginx
  16. ├── files
  17. └── main.yml
  18. ├── tasks
  19. ├── groupadd.yml
  20. ├── install.yml
  21. ├── main.yml
  22. ├── restart.yml
  23. └── useradd.yml
  24. └── vars
  25. └── main.yml

10.1.6、目录示例

  1. roles的示例如下所示:
  2. site.yml
  3. webservers.yml
  4. dbservers.yml
  5. roles/
  6. common/
  7. files/
  8. templates/
  9. tasks/
  10. handlers/
  11. vars/
  12. meta/
  13. webservers/
  14. files/
  15. templates/
  16. tasks/
  17. handlers/
  18. vars/
  19. meta/

10.2、案例

10.2.1、案例:创建httpd角色

  1. 1> 创建roles目录
  2. mkdir roles/{httpd,mysql,redis}/tasks -pv
  3. mkdir roles/httpd/{handlers,files}
  4. 查看目录结构
  5. tree roles/
  6. roles/
  7. ├── httpd
  8. ├── files
  9. ├── handlers
  10. └── tasks
  11. ├── mysql
  12. └── tasks
  13. └── redis
  14. └── tasks
  15. 2> 创建目标文件
  16. cd roles/httpd/tasks/
  17. touch install.yml config.yml service.yml
  18. 3> vim install.yml
  19. - name: install httpd package
  20. yum: name=httpd
  21. vim config.yml
  22. - name: config file
  23. copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
  24. vim service.yml
  25. - name: start service
  26. service: name=httpd state=started enabled=yes
  27. 4> 创建main.yml主控文件,调用以上单独的yml文件,
  28. main.yml定义了谁先执行谁后执行的顺序
  29. vim main.yml
  30. - include: install.yml
  31. - include: config.yml
  32. - include: service.yml
  33. 5> 准备httpd.conf文件,放到httpd单独的文件目录下
  34. cp /app/ansible/flies/httpd.conf ../files/
  35. 6> 创建一个网页
  36. vim flies/index.html
  37. <h1> welcome to weixiaodong home <\h1>
  38. 7> 创建网页的yml文件
  39. vim tasks/index.yml
  40. - name: index.html
  41. copy: src=index.html dest=/var/www/html
  42. 8> 将网页的yml文件写进mian.yml文件中
  43. vim mian.yml
  44. - include: install.yml
  45. - include: config.yml
  46. - include: index.yml
  47. - include: service.yml
  48. 9> handlers目录下创建handler文件mian.yml
  49. vim handlers/main.yml
  50. - name: restart service httpd
  51. service: name=httpd state=restarted
  52. 10> 创建文件调用httpd角色
  53. cd /app/ansidle/roles
  54. vim role_httpd.yml
  55. ---
  56. # httpd role
  57. - hosts: appsrvs
  58. remote_user: root
  59. roles: #调用角色
  60. - role: httpd
  61. 11> 查看目录结构
  62. tree
  63. .
  64. httpd
  65. ├── files
  66. ├── httpd.conf
  67. └── index.html
  68. ├── handlers
  69. └── main.yml
  70. └── tasks
  71. ├── config.yml
  72. ├── index.yml
  73. ├── install.yml
  74. ├── main.yml
  75. └── service.yml
  76. 12> ansible-playbook role_httpd.yml

10.2.2、案例:创建一个nginx角色

  1. 建立nginx角色在多台主机上来部署nginx需要安装 创建账号
  2. 1> 创建nginx角色目录
  3. cd /app/ansible/role
  4. mkdir nginx{tesks,templates,hanslers} -pv
  5. 2> 创建任务目录
  6. cd tasks/
  7. touch insatll.yml config.yml service.yml file.yml user.yml
  8. 创建main.yml文件定义任务执行顺序
  9. vim main.yml
  10. - include: user.yml
  11. - include: insatll.yml
  12. - include: config.yml
  13. - include: file.yml
  14. - include: service.yml
  15. 3> 准备配置文件(centos78)
  16. ll /app/ansible/role/nginx/templates/
  17. nginx7.conf.j2
  18. nginx8.conf.j2
  19. 4> 定义任务
  20. vim tasks/install.yml
  21. - name: install
  22. yum: name=nginx
  23. vim tasks/config.yml
  24. - name: config file
  25. template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
  26. when: ansible_distribution_major_version=="7"
  27. notify: restrat
  28. - name: config file
  29. template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
  30. when: ansible_distribution_major_version=="8"
  31. notify: restrat
  32. vim tasks/file.yml 跨角色调用file.yum文件,实现文件复用
  33. - name: index.html
  34. copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/
  35. vim tasks/service.yml
  36. - nmae: start service
  37. service: name=nginx state=started enabled=yes
  38. vim handlers/main.yml
  39. - name: restrat
  40. service: name=nginx state=restarted
  41. vim roles/role_nginix.yml
  42. ---
  43. #test rcle
  44. - hosts: appsrvs
  45. roles:
  46. - role: nginx
  47. 5> 测试安装
  48. ansible-playbook role_nginx.yml

10.2.3、案例: 创建角色memcached

  1. memcacched 当做缓存用,会在内存中开启一块空间充当缓存
  2. cat /etc/sysconfig/memcached
  3. PORT="11211"
  4. USER="memcached"
  5. MAXCONN="1024"
  6. CACHESIZE="64" # 缓存空间默认64M
  7. OPTIONS=""
  8. 1> 创建对用目录
  9. cd /app/ansible
  10. mkdir roles/memcached/{tasks,templates} -pv
  11. 2> 拷贝memcached配置文件模板
  12. cp /etc/sysconfig/memcached templates/memcached.j2
  13. vim templates/memcached.j2
  14. CACHESIZE="{{ansible_memtotal_mb//4}}" #物理内存的1/4用做缓存
  15. 3> 创建对应yml文件,并做相应配置
  16. cd tasks/
  17. touch install.yml config.yml service.yml
  18. 创建main.yml文件定义任务执行顺序
  19. vim main.yml
  20. - include: install.yml
  21. - include: config.yml
  22. - include: service.yml
  23. vim install.yml
  24. - name: install
  25. yum: name=memcached
  26. vim config.yml
  27. - name: config file
  28. template: src=memcached.j2 dets=/etc/sysconfig/memcached
  29. vim service.yml
  30. - name: service
  31. service: name=memcached state=started enabled=yes
  32. 4> 创建调用角色文件
  33. cd /app/ansible/roles/
  34. vim role_memcached.yml
  35. ---
  36. - hosts: appsrvs
  37. roles:
  38. - role: memcached
  39. 5> 安装
  40. ansible-playbook role_memcached.yml
  41. memcached端口号11211

10.3、Roles使用

Roles目录编排
image.png
Playbook中调用
image.png

10.3.1、playbook调用角色

  1. 调用角色方法1
  2. - hosts: websrvs
  3. remote_user: root
  4. roles:
  5. - mysql
  6. - memcached
  7. - nginx
  8. 调用角色方法2
  9. 传递变量给角色
  10. - hosts:
  11. remote_user:
  12. roles:
  13. - mysql
  14. - { role: nginx, username: nginx } #不同的角色调用不同的变量
  15. role用于指定角色名称
  16. 后续的k/v用于传递变量给角色
  17. 调用角色方法3:还可基于条件测试实现角色调用
  18. roles:
  19. - { role: nginx, username: nginx, when: ansible_distribution_major_version == '7' }

10.3.2、通过roles传递变量

  1. 通过roles传递变量
  2. 当给一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量
  3. 示例:
  4. - hosts: webservers
  5. roles:
  6. - common
  7. - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }

10.3.3、向roles传递参数

  1. 而在playbook中,可以这样使用roles
  2. ---
  3. - hosts: webservers
  4. roles:
  5. - common
  6. - webservers
  7. 也可以向roles传递参数
  8. 示例:
  9. ---
  10. - hosts: webservers
  11. roles:
  12. - common
  13. - { role: foo_app_instance, dir: '/opt/a', port: 5000 }
  14. - { role: foo_app_instance, dir: '/opt/b', port: 5001 }

10.3.4、条件式地使用roles

  1. 甚至也可以条件式地使用roles
  2. 示例:
  3. ---
  4. - hosts: webservers
  5. roles:
  6. - { role: some_role, when: "ansible_os_family == 'RedHat'" }

10.3.5、Roles条件及变量等案例

  1. When条件
  2. roles:
  3. - {role: nginx, when: "ansible_distribution_major_version == '7' " ,username: nginx }
  4. 变量调用
  5. - hosts: zabbix-proxy
  6. sudo: yes
  7. roles:
  8. - { role: geerlingguy.php-mysql }
  9. - { role: dj-wasabi.zabbix-proxy, zabbix_server_host: 192.168.37.167 }

10.3.6、完整的roles架构

  1. // nginx-role.yml 顶层任务调用yml文件
  2. ---
  3. - hosts: testweb
  4. remote_user: root
  5. roles:
  6. - role: nginx
  7. - role: httpd 可执行多个role
  8. cat roles/nginx/tasks/main.yml
  9. ---
  10. - include: groupadd.yml
  11. - include: useradd.yml
  12. - include: install.yml
  13. - include: restart.yml
  14. - include: filecp.yml
  15. // roles/nginx/tasks/groupadd.yml
  16. ---
  17. - name: add group nginx
  18. user: name=nginx state=present
  19. cat roles/nginx/tasks/filecp.yml
  20. ---
  21. - name: file copy
  22. copy: src=tom.conf dest=/tmp/tom.conf
  23. 以下文件格式类似:
  24. useradd.yml,install.yml,restart.yml
  25. ls roles/nginx/files/
  26. tom.conf

10.3.7、roles playbook tags使用

  1. roles playbook tags使用
  2. ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml 对标签进行挑选执行
  3. // nginx-role.yml
  4. ---
  5. - hosts: testweb
  6. remote_user: root
  7. roles:
  8. - { role: nginx ,tags: [ 'nginx', 'web' ] ,when: ansible_distribution_major_version == "6“ }
  9. - { role: httpd ,tags: [ 'httpd', 'web' ] }
  10. - { role: mysql ,tags: [ 'mysql', 'db' ] }
  11. - { role: marridb ,tags: [ 'mysql', 'db' ] }
  12. - { role: php }

10.4、其它功能

  1. 委任
  2. delegate_to
  3. 交互提示
  4. prompt
  5. 暂停
  6. wait_for
  7. Debug
  8. debug: msg="This always executes."
  9. Include
  10. Template 多值合并
  11. Template 动态变量配置