playbook是ansible的主要管理方式,也是ansible功能强大的关键所在,playbook通过多个task集合完成一类功能,这类功能的复杂度可以低,低到一个简单的操作也可以用playbook去实现,也可以非常高,编制出非常复杂的功能逻辑。然而,如果在复杂任务下,仅用一个playbook剧本去实现整个复杂逻辑将变得很难,且非常不容易维护,也没办法将这个复杂playbook复用到其他类似功能实现中去。这时就要用到ansible role的方式来管理playbook了,通过它来将复杂任务分解为比较小的部分,将原来复杂的playbook分割为多个文件,大大简化复杂playbook的编写。
ansible role可以看成是一台或者多台主机的某些事情,分开进行playbook编写,通过规范化的目录结构来重新整理复杂playbook,例如我们需要部署一个nginx+was+mysql数据库,我们可以设计以下目录格式:
其中deploy_nginx_was_mysql.yaml是roles的入口文件,例如:
这里就可以根据hosts文件中定义的不同主机组来引用不同的roles进行相关的配置部署,并通过:
ansible-playbook -i hosts deploy_nginx_was_mysql.yaml来调用。
hosts文件中定义了nginx、mysql和was主机组相关信息。
vars目录下的文件中定义playbook中需要引用到的变量。
roles目录下则编制了base_install、mysql_install、was_install、nginx_install等四个不同roles的playbook、配置模板和文件等内容。
通过这样分拆的方式,一个复杂的playbook大大简化、清晰化,而且roles目录下的所有子roles都可以复用到其他项目中去使用,我们的任务就是编写一个个小型的playbook,最后再用role的方式去整合,形成一个大的复杂的功能逻辑。