对于单一项目实现单一功能自动化工具来说,简单单独的ansible剧本就可以满足。 随着时间的变化,项目的增长及功能的增加,就需要添加额外playbook剧本、变量文件、tasks任务文件的分隔。同时你可能会希望使用更少的playbook剧本文件、tasks任务文件以及变量文件来实现复杂的功能。
创建这样的层次结构可能是令人生畏的,很多时候开始使用ansible比较简单,随着项目的增加及功能的复杂多样化,整个文件就变得越来越笨拙并难以维护。
本章中的经验将帮助运维人员在面对场景多样化及复杂化时,如何设计结构清晰且可扩展性强的自动化工具。
详情可参考官网
随着要管理的服务及功能不断增多,我们又没将task放到roles里,会发现playbook文件越来越大,内容也越来越多,管理起来也很复杂。这时我们可以将这些task分解到很多文件中, 通过include_tasks和import_tasks方法进行task之间的调用,说直白点这两个方法作用就是连接不同文件里的task。
总结:import_tasks方法和include_tasks方法的区别?
1、include_tasks是动态包含,意思是被引用的文件在playbook运行之后才会被加载,它是实时处理的。而import_tasks是静态包含,就是被引用的文件在playbook运行之前就已经被加载了,它是预处理的。
2、import_tasks方法调用的文件名称不支持变量,include_tasks方法调用的文件名称可以使用变量
3、import_tasks会在playbooks解析阶段将父task变量和子task变量全部读取并加载,include_tasks则是在执行play之前才会加载自己变量。
4、如果想要对包含的任务列表进行循环操作,则只能使用include_tasks关键字,不能使用import_tasks关键字,import_tasks并不支持循环操作,也就是说,使用loop关键字或with_items关键字对include文件进行循环操作时,只能配合include_tasks才能正常运行。
5、 import_tasks会调用子任务中的所有tag,使用–list-tags 参数时也能看到,但是include_tasks调用的子任务中如果定义了tag,则不会生效。
角色(roles)是ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook。
一个role可以包含以下八个目录,如下图所示:
1、files目录:用来存放copy模块的文件,或者是script模块的脚本文件。
2、tasks:用于存放一系列任务文件,在该目录下,必须存在一个main.yml文件,该文件会通过include调用其他的文件。
3、vars:该目录下存放一系列的变量,在该目录下,必须存在一个main.yml文件,该文件会通过include调用其他的文件。如果整个roles配置变量使用较少,则只使用一个main.yml文件即可,但是如果整个roles配置变量比较多,那么就可以将变量进行分类后存放到不同的目录下,然后再通过main.yml进行调用。
4、meta:该目录通常存放此Role的特殊设定及其依赖关系,在该目录下,也必须存在一个main.yml文件。
5、default:该目录存放此Role的设定默认变量,在该目录下,也必须存在一个main.yml文件。
6、handlers:该目录下用于存放Role中触发条件后执行的动作,在该目录下,也必须存在一个main.yml文件。
7、template:此目录下用于存放此Role需要使用的jinjia2模板文件。
方式一:import_role方法调用
方式二:include_role方法调用
总结:import_role方法和include_role方法的区别?
1、import_role是一种静态引用,所谓静态引用,就是在预编译阶段,就知道整个playbook要执行哪些任务。include_role是一种动态引用。所谓动态引用,就是在执行阶段,才知道整个playbook要执行哪些任务。
2、import_role引用的role的名称不允许使用变量(vars、vars-file除外),include_role方法引用的role的名称允许使用变量
3、import_role本身不会被当作是一个task,include_role本身会被当作是一个task。
4、 当使用import_role时,会把import_role这个task的tag添加到role里面的每个task上。当使用include_role时,include_role本身的tag不会传递给它所引用的task。
playbook是ansible用于配置,部署,和管理被节点的剧本。通过playbook的详细描述,执行其中的一些列tasks,可以让远端的主机达到预期的状态。playbook就像ansible控制器给被控节点列出的一系列to-do-list,而且被控节点必须要完成。
变量数据也可以被分离到可加载文件里边。这样就允许在多个剧情或剧本,以及项目目录之外的包含变量数据(比如密码数据)之间共享变量。变量文件是简单的yaml格式文件,以key-value对的形式出现。和任务包含文件不同,变量包含文件不能再包含其他更多文件。
变量可以以三种不同的方式被包含进来:
1、通过vars_files。
2、通过include_vars。
3、通过–extra-vars(-e)。
1、vars_files
注意:vars_files指令是play级别的指令,且是在解析playbook的时候加载并解析的,所以所引入的变量是play范围内可用的,其他play不可使用这些变量。
2、include_vars
include_vars指令也可用于引入外部变量文件,它和vars_files不同,一方面,include_vars是模块提供的功能,它是一个实实在在的任务,所以在这个任务执行之后才会创建变量。另一方面,既然include_vars是一个任务,他就可以被一些task级别的指令控制,如when指令。
3、–extra-vars选项
ansible-playbook命令的-e选项或者–extra-vars选项也可以用来定义变量或引入变量文件。
#定义单个变量
ansible-playbook -e 'var1="value1"' xxx.yml
#定义多个变量
ansible-playbook -e 'var1="value1" var2="value2"' xxx.yml
#引入单个变量文件
ansible-playbook -e '@varfile1.yml' xxx.yml
#引入多个变量文件
ansible-playbook -e '@varfile1.yml' -e '@varfile2.yml' xxx.yml
注意:因为是通过选项的方式来定义变量的,所以它所定义的变量是全局的,对所有play都有效。
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》