深入理解 Ansible Playbook:组件与实战

目录

[1 playbook介绍](#1 playbook介绍)

[2 YAML语言](#2 YAML语言)

2.1语法简介

2.2数据类型

[3 Playbook核心组件](#3 Playbook核心组件)

[3.1 hosts组件](#3.1 hosts组件)

[3.2 remote_user组件](#3.2 remote_user组件)

[3.3 task列表和action组件](#3.3 task列表和action组件)

[3.4 handlers](#3.4 handlers)

[3.5 tags组件](#3.5 tags组件)

[3.6 其他组件说明](#3.6 其他组件说明)


1 playbook介绍

playbook 剧本是由一个或多个"play"组成的列表。

play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作。

playbook文件时采用YAML语言编写的。

2 YAML语言

2.1语法简介
  • 在单一文件第一行,用连续三个连字号"""开始,还有选择性的连续三个点号(.. )用来表示文件的结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
  • YAML文件内容是区别大小写的,key/value的值均需大小写敏感
  • 多个key/value可同行写也可换行写,同行使用,分隔
  • key后面冒号要加一个空格 比如: key: value
  • value可是个字符串,也可是另一个列表YAML文件扩展名通常为 yml或 yaml
2.2数据类型

YAML支持一下常用几种数据类型:

  • 标量:单个的、不可再分的值
  • 对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence)/列表(list)

3 Playbook核心组件

一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:

  • Hosts 执行的远程主机列表
  • Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name和 task,一个name只能包括一个task
  • Variables 内置变量或自定义变量在playbook中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlers 和 notify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幕等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
3.1 hosts组件

Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。

3.2 remote_user组件

remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户

3.3 task列表和action组件

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个tasktask的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。

忽略ignore_errors:

如果一个task出错,默认将不会继续执行后续的其它task。

利用 ignore_errors: yes 可以忽略此task的错误,继续向下执行playbook其它task。

task两种格式:

action:module arguments #示例: action: shell wall hello

module:arguments #建议使用 #示例: shell: wall hello

注意:shell和command模块后跟命令,而非key=value。

3.4 handlers

handlers和notify结合使用触发条件

Handlers 实际上就是一个触发器是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作

notify此action可用于在每个play的最后被触发

这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。

在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

在系统中,我们修改了服务器的配置文件,这时候就需要重启操作服务,就可以使用到handlers。配合 notify使用。

在使用handlers的过程中,有以下几点需要++注意++:

  • handlers只有在其所在的任务被执行时,都会被运行;
  • handlers只会在Play的末尾运行一次;如果想在一个Playbook的中间运行handlers,则需要使用meta模块来实现,例如:- meta: flush_handlers。
  • 如果一个Play在运行到调用handlers的语句之前失败了,那么这个handlers将不会被执行。我们可以使用mega模块的--force-handlers选项来强制执行handlers,即使在handlers所在Play中途运行失败也能执行。
3.5 tags组件

在playbook文件中,可以利用tags组件,为特定task指定标签,当在执行playbook时,可以只执行特定tags的task,而非整个playbook文件。

可以一个task对应多个tag,也可以多个task对应一个tag。

还有另外3个特殊关键字用于标签, tagged , untagged 和 all ,它们分别是仅运行已标记,只有未标记和所有任务。

3.6 其他组件说明

某任务的状态在运行后为changed时,可通过"notify"通知给相应的handlers任务还可以通过"tags"给task 打标签,可在ansible-playbook命令上使用 -t 指定进行调用。

相关推荐
码农秃头老李1 小时前
系列3:基于Centos-8.6 Kubernetes使用nfs挂载pod的应用日志文件
linux·kubernetes·centos
安科瑞刘鸿鹏1 小时前
企业园区工厂用电安全该如何保障?
运维·服务器·物联网·能源
echo的PHP开发1 小时前
【python虚拟环境安装】linux centos 下的python虚拟环境配置
linux·python·centos·虚拟环境
gongyuan0733 小时前
stm32wb p2pserver
运维·服务器
hxdcxy3 小时前
linux redhat9系统 交互和非交互设定延时任务
linux·运维·服务器
超爱吃士力架4 小时前
Linux指令大全
linux·前端·设计模式
MineGi4 小时前
02. Docker:安装和操作
linux·docker
qichengzong_right5 小时前
CNCF云原生生态版图-分类指南(三)- 运行时
linux·云原生
小张快跑。5 小时前
服务器限制某个端口只允许特定IP访问(处理第三方依赖漏洞)
运维·服务器·网络协议·安全·docker