ansible-palybook自动化运维工具剧本个人理解思路
一.asible-Playbook剧本
因本人经验有限,还请各位大佬多多指教老弟也可以做出修改,发自内心的感谢,
学习期的小白也可以看看我分析的思路,或许可以起到一些帮助!
(注意:此内容需要在掌握ansible模块以及基础使用的情况下去看,因为剧本是基于这2块内容的基础去做)
1. 是什么
2. 有什么作用
3. 为什么用Playbook
4. Playbook的缺点
5. Playbook的用法
1. 是ansible自动化运维的一个功能。
2. 将执行的命令基于ansible模块的方式写入一个剧本中然后进行批量执行
3. ①批量执行命令,缩减时间。(不必要用ansible模块一条一条执行任务)②当然我们所知道的script模块也可以将本机脚本执行到其他的机器中,但我个人认为 script笔记属于是ansible的模块,他有可能是基于python去运行(因为ansible本身也是基于python开发)如果其他机器没有python环境那么就可以在这里使用play剧本去执行一定的任务。
4. 个人认为,Playbook剧本的书写会比较难,尤其是他的格式,会比较的难写,相比于shell脚本难度肯定是很大了,但是掌握一定的分层分级思想基本也会解决这个问题。
5. Playbook的执行命令为 ansible-playbook 主机组(也可以写all表示全部主机) 剧本路径
判断剧本内语句是否正确命令: ansible-playbook all -C 剧本路径
一般剧本的后缀为*.yml 或者*.yaml 这里不需要去纠结,每类文件都有每类文件特有的后缀,比如文本为.txt 影视为.mp4 网页为.html或.php等所以我们的Playbook剧本也有其自己的后缀 .yml或.yaml
在命令中剧本路径:
A:剧本的路径可以写绝对路径 也可以写相对路径比如我们目前就在/etc/ansible中而剧本文件也在这个目录中,名字叫test.yml那么我们可以直接写:ansible-palybook all test.yml 相对路径 因为你自身已经在这个路径下了所以直接写就行,系统会在你当前所在目录下找你的剧本文件
B:当然如果我们当前在root目录下,我们的test.yml剧本在/etc/ansible目录中,那我们的剧本命令就成了:ansible-playbook all /etc/ansible/test.yml 因为自身不在/etc/anible中使用绝对路径去找这个剧本文件
Ps:1.所以playbook剧本的路径可以任意放,但是呢当你在使用时的路径怎么写还是
要取决于你自身目前的所在路径。
2.但是为了好管理,我们默认还是要把剧本保存到/etc/absible中。
二.分层分级思想
分层分级思想:我们举个例子,我们要回家,首先小区可以是1级楼号单元可以是2级,我们自己的层数以及那个门可以是第3级,既然这样,那么好,我们回家这个动作可以分3级去做,第一级找到小区,第2级找到楼号以及单元号。第3级找到我们自己的家门,至此回家这个动作也做完了。而这里我们也把回家这个动作分成了3级去做!
三. Playbook的核心元素:
(这些是playbook的核心元素,也就是说我们在后续写剧本的时候也是重点去使用
这些核心元素去写)
1.hosts: 定义剧本内容要运行的那个主机组上(在/etc/ansible/hosts中定义主机组)
2.remote_user: 定义主机组在运行这个剧本是用什么身份
3.tasks: 定义那些模块以及任务(定义要做的事,以ansible模块的格式)
4.tags: 定义标签便于后续可以筛选执行剧本内容
5.handlers:触发器。指在某种特定条件下才会执行里面的命令内容。而这种特定条件则是用 notify去告知触发器(也可以理解为调用,也就是用notify当作开关当这个开关开启时触发器也会执行,那么在剧本中 只要你写了notify 在跑剧本的时候是不是也会自动的去跑以下notify这行内容,那么既然跑了我是不是可以理解为这个开关开了以下也就伴随着handlers触发器开启,然后执行里面的命令)
6. roles: 角色在剧本中如果写了这一条内容,将会回去roles目录中执行你所定义的角色,至于角色,下文中会说到
四. 剧本的写法
个人使用的写法,可能是技术低,所以目前觉得不会在格式上出错:
既然我们上方说到了分级分层的思路,以及playbook的核心组件那么我们是否可以将这2者联合起来去理解这个剧本的写法呢。我们首先想想我们的在上学的时候写作文的时候,每一段开头都要空两行。那么在这里我将这一操作结合以下。我其实心里想,这tm剧本不会是中国人发明的把,空两格为何在这里这么重要呢!!!
当然我们在写剧本的时候也可以当作写作文
写作文的每一段要空2格,那我们是否可以将playbook的不同核心元素于
内容分为不同的2段
那么好,我们拿一段剧本来分析以下:
第一 我们分析开头结尾
开头--- 结尾... 那么如果是我去写 我可能会进入文件后直接写2行
---
...
然后我开始在这2个中间去写内容
第二 分析一些特有的符号
首先我注意到的是脚本中除了开头还有4个地方前面出现了-符号
于是我对这个-做了一个分析,我发现在这个剧本中如果这条命令带有指定内容作用的时候在他的前面会有一个- 。 比如 - hosts:test01 这句话的意思是定义我这个剧本在那个电脑上,他指定了一个内容是 test01 ,再或者tasks中的- name:adduser 而这句话的意思是这个tasks任务的名字指定为adduser 最后tags中的 - testbbb这句话的意思是给这个tasks任务给一个标签,指定他的名字为testbbb 那么为什么这里不是像上面那样的 - name这样写呢 我个人认为可能是tags这个命令中没有别的选项了 只要你写了- 就相当于是定义他的名字。
所以综上所属,我个人认为这个-应该是在剧本命令行带有指定内容意思的时候加的
第三 分析一下这个剧本的格式
因为playbook剧本对于格式要求比较严格那么我们分析一下这个格式到底是怎么写的。
还有我们可以看到很多地方是空格。
首先我们可以看看上面的图,这个格式除了开头结尾以外,其他的每一个playbook核心元素以及内容都要占单独的一行。那么我们先确定一点playbook核心元素与内容要单独占一行。那么到这里基本的格式不就很清晰了吗。那么我们在说说空格,图中的空格我们也看的很清楚,那么他是怎么去做的呢?
我们带着2个问题去思考①什么时候加空格 ②怎么加这个空格
首先我们说一些死格式:所有的-和:后都要加空格 这个原因说实话我也不知道可能是老美那边的习惯把,就比如当我们关系好了以后见面首先骂一句在打招呼!!!毕竟计算机是老美造出来的,咋得认。
那么除了这里的空格以外,还有什么时候加空格呢。我们分析上图可以发现剧本在每个核心元素与其内容开头都有空格,那么加几个空格呢,又或者是怎么加呢我是利用分级思想去想的这个问题,在写这个剧本时我们分为2级,第一级为playbook的核心元素,第二级为核心元素的内容。
那我们做一个分析,我们在写这个剧本时或许可以考虑同一个级别内容(ansible核心元素为1级 核心元素内容为2级)上下对齐呢
看一下这一段 tasks是一个核心模块 在他之中的内容不就是同一级吗 可以看一下这里出现了2个-name 而这2个-name他的格式上下是对其的,也就是说同一级的内容开头空的格子数是一样的。至于tags下方的又往后缩了2行,原因也很简单,-testaaa这个内容他是tags所用的,所以他是tags的下一级。所以说到这里其实2个问题就已经很明亮了
第一同级别上下格式相同(开头空几格的格式)
第二我们空2格空的是上一级开头位置的2格,而不是文本横行开头的2格。下图所示
我们可以看看,tags的下一级是- testaaa 所以可以发现- testaaa这行内容比上一行tags刚好是空了2格 t一个格子 a 一个格子所以格式总结也就是这些内容了,我掌握以后写playbook剧本时说实话除了命令忘了看一眼外,还真没有参考过其他剧本。当然这里或许会产生一些问题:如下图
这里可能会有一个问题:hosts remote_user tasks 这3个都为playbook的核心元素 那他们为什么不是同一格式呢 remote_user 与tasks前空了2格而hosts没有我是否可以写成下方这个格式呢!
- hosts: test01
remote_user: root
tasks:
事实证明不行,那么我个人的猜想是由于hosts前方的- 定义了剧本执行的主机是谁的意思并不是hosts元素的格式,所以下方其他的模块自然要跟hosts的起始位置盯齐,这里借用上方的分级思想,既然hosts与其他模块是一级,那么他们自然要上下盯齐呀(也就是空格的数量要相同)。
或许这个例子还是优点抽象,那我再那个例子说一下。如下图
可以看到,上图中内容与上方第一个例子的内容是一样的但是hosts前面是微信的头像来表示这条消息是某个人发给你的而并不是消息的内容,所以他的格式跟上方- hosts格式优点相似,而真真上下格式开始对齐的也是其内容 而不是每行内容开头跟头像对齐。
第四分析palybook剧本的大致内容结构
首先写的是开头与结尾,内容也是在开头结尾中间写,但是开头与结尾是可以省略的,即使我们不去写,他的剧本也可以正常的在服务器中运行。
而在内容方面也是又playbook的核心元素组成:
1写hosos 来规定你的剧本要跑在那个主机组里面
2写剧本在对应主机组运行时候用什么身份(remote_user)
3写tasks来规定我们所使用的模块是那个模块然后在模块里写上所对应的命令选项。
当然,也可以写notify触发器调用,以及其他的一些执行命令。
4写触发器的内容,包括他的名字或是他的内容(触发器的内容一般也是一些ansible模块命令)
总结:首先定义执行的主机组 然后定义执行的身份,之后在定义其他的一些核心元素(tasks),这里要注意的是在定义书写的时候建议记住分级思想,同级内容盯齐,下一级开头要空2格(空的是上一级的2格)。
五. 触发器
其实可以把他当作一个寄存器,把命令存在里面,当电脑打开这个寄存器的锁以后去执行寄存器里面的命令。这只是一个便于理解的例子,如果拿这个例子来说如何打开这个寄存器的锁我想我的理解是notify是这个寄存器锁的钥匙,而剧本的执行相当于一个人(linux系统)在做一件事(执行剧本),执行到notify这句的时候,相当于是这个人拿了notify这把钥匙 打开了 handlers触发器的锁然后执行了里面的内容(命令)
触发器的内容包括定义他的名字,ansible模块命令。如
handlers:
- name: 123123 (定义handlers的名字)
shell: ip a
定义handlers名字后 如果需要调用 那么可以在tasks元素内写
notify
- 123123(定义你要调用的handkers的名字)
调用名字叫123123的触发器,最后执行触发器中的内容:用shell板块执行ip a命令
六. 角色
说白了,角色就是将一个完整的palybook剧本按照核心元素拆分成几个部分然后拿一个大盒子里面放几个小盒子,小盒子上写每个核心元素的名字,里面是核心元素的内容,
大盒子写这个这个剧本是为那个服务写的。最后在把这个大盒子放在palybook的特定角色存放目录下(/etc/ansible/roles)然后写一个剧本,内容只写在哪个主机组上运行,与角色名字,也就是大盒子的名字。 执行这个角色剧本的时候先找到大盒子然后再依次打开小盒子执行小盒子里的内容。
个人认为用这个角色,其实也是将一个大的文件分层化存到各个不同的地方里,用谁就拿谁,或许可以降低cpu使用的负载率当然这也只是一个猜测!
/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录
mariadb: mysql 角色
apache: httpd 角色
nginx: nginx 角色
每个角色的定义,以特定的层级目录结构进行组织,以Mariadb(mysql 角色)为例
files:存放 copy 或 script 等模块调用的文件
templates: 存放 template 模块查找所需要的模板文件的目录,如 mysql 配置文件等模板
tasks:任务存放目录
handlers: 存放相关触发执行器的目录
vars:变量存放的目录
meta: 用于存放此角色元数据
default: 默认变量存放目录,文件中定义了此角色使用的默认变量
上述目录中 tasks,handlers,vars,meta,default 至少应该包含一个 main.yml,
该目录下也可以有其他的yml文件,但是需要在 main.yml 文件中指定将其他yml 文件
包含进来。
有了角色之后,可以直接在 yaml 文件中(playbook 配置文件)中调用角色
- hosts: test01
remote user: root
roles:
- mysql #调用角色名
- httpd #调用角色名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构