云原生俱乐部-RH294知识点归纳(2)
突然发现ansible课程的内容也不是很多,该系列的第一篇就包含了绝大多数的内容了。毕竟这个课程只是介绍工具,不存在什么原理的内容,会用能够记住就好了。
至于有些使用技巧的话,需要在做项目的时候积累了。不过课程临近尾声,面临的将是秋招,依旧始终担心学的不足,实际上也确实如此。但是我觉得我还是比较认真的,当然光是认真并没有用,只有学会了才有用。
这篇的内容比较少的,和今天ansible课程讲的内容同步,所以我会在这一篇讲一讲常用的ansible模块,以及一些使用ansible工具时需要注意的地方。本文的主要内容是将文件部署到受管主机和管理复杂的play和playbook两部分内容。
将文件部署到受管主机
其实这一部分主要讲的就是ansible的模块功能作用,包括ansible.builtin.file和ansible.builtin.copy两个模块,还有jinja2模板的使用,需要用到ansible.builtin.template模块。
[1]在主机上修改和拷贝文件
当然了,文件管理模块不只是file和copy,还有很多。(1)blockinfile:插入、更新、删除自定义标线包围的多行文本块;(2)copy:将文件从本地或远程主机复制到受管主机;(3)fetch:将受管主机的文件复制到本地按主机名组织的文件树中;(4)file:删除或创建文件和目录,可以设置它们的权限,所有者、selinux上下文等;(5)lineinfile:保证特定行位于某文件中。
[2]使用Jinja2模板部署自定义文件
jinja2模板由数据、变量、表达式组成。可以使用循环结构{% for i in items %} {% endfor %},条件语句{% if variable %} {% endif %}(如果varible为true,则执行)。
{# COMMENT #}表示注释,{{ EXPR }}用于输出表达式的结果或变量的值。jinja2支持过滤器,将数据进行格式化,如{ output | to_json }或者{ output | to_yaml }分别转化为json和yml格式文件。
ansible.builtin.template模块可以将jinja2模板部署到目标主机上,src指定jinja2模板来源,dest则是要在目标主机的创建的文件。jinja2文件中的变量可以来自playbook中的vars语句中,也可以是收集的事实。
管理复杂的play和playbook
[1]主机模式
在ansible的play中可以通过主机模式来匹配主机清单中的受管主机(hosts语句)。并且支持使用通配符等多种方式来匹配,如ungrouped表示未分组的主机,all是所有主机,可以使用通配符*匹配主机清单的主机。
还可以使用列表来表示多个主机或主机组,在列表中使用&表示主机组之间或者主机和主机组之间取交集,!则表示单独不用某个主机或主机组,建议将列表的主机模式放在单引号里,确保正确解析。
[2]导入和包含文件
在playbook中可以使用其他play或者task,并且可以为外部的play和task设置变量vars。不过要注意的是,在ansible2.4之后,include_playbook语句已经弃用,只有include_tasks语句。
由于include在运行时解析,而import在运行开始前解析,所以使用ansible-navigator run --list-task的时候可以看到import导入文件里面的任务,但是看不到include包含文件里面的任务。
并且在使用条件语句的时候,import语句会让外部文件里的所有task都应用该条件语句,但是include语句来说,只是使用include语句的task会应用该条件语句。