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

YAML介绍
- YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括: XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在 首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者
- YAML Ain’t Markup Language,即YAML不是XML。不过,在开发的这种语言时, YAML的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)
- 特性 YAML的可读性好 YAML和脚本语言的交互性好 YAML使用实现语言的数据类型 YAML有一个一致的信息模型 YAML易于实现 YAML可以基于流来处理 YAML表达能力强,扩展性好
- 更多的内容及规范参见:http://www.yaml.org
YAML语法简介
- 在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三 个点号( … )用来表示档案结尾
- 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
- 使用#号注释代码
- 缩进必须是统一的,不能空格和tab混用
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过 缩进结合换行来实现的
- YAML文件内容是区别大小写的,k/v的值均需大小写敏感
- 多个k/v可同行写也可换行写,同行使用,分隔
- v可是个字符串,也可是另一个列表
- 一个完整的代码块功能需最少元素需包括 name 和 task
- 一个name只能包括一个task
- YAML文件扩展名通常为yml或yaml
- List:列表,其所有元素均使用“-”打头
- 示例:
YAML语法
- YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构 (Structure)通过空格来展示,序列(Sequence)里的项用”-“来代表,Map里的键值对用”:”分隔
- 示例
Playbook核心元素
- Hosts 执行的远程主机列表
- Tasks 任务集
- Varniables 内置变量或自定义变量在playbook中调用
- Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行, 否则不执行
- tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible 具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其 确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可 以通过tags跳过此些代码片断 ansible-playbook –t tagsname useradd.yml
playbook基础组件
Hosts
playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中,简单来说就是远程主机IP/主机名
可以是如下形式:one.example.comone.example.com:two.example.com
192.168.1.50
192.168.1.\*
- Websrvs:dbsrvs 或者,两个组的并集
- Websrvs:&dbsrvs 与,两个组的交集
- webservers:!phoenix 在websrvs组,但不在dbsrvs组 示例: - hosts: websrvs:dbsrvs
remote\_user:
可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使,简单来说以什么身份去执行
用sudo\_user指定sudo时切换的用户
task列表和action
play的主体部分是task list,task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出简单来说task相当于一个集合,里面有多个任务列表
- tasks:任务列表
- 两种格式: (1) action: module arguments (2) module: arguments 建议使用 注意:shell和command模块后面跟命令,而非key=value
- 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers
- 任务可以通过”tags“打标签,可在ansible-playbook命令上使用-t指定进行调用 示例:
- 如果命令或脚本的退出码不为零,可以使用如下方式替代
- 或者使用ignore\_errors来忽略错误信息
运行playbook
- 运行playbook的方式
- 示例
Playbook VS ShellScripts

示例
示例:sysuser.yml
Playbook示例
handlers和notify结合使用触发条件
Handlers
handlers 设置触发条件,比如当某个配置文件更改自动去调度tasks下的name下的notify下的值 比如 restart可自定义
是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发
生变化时,才会采取一定的操作
- Notify此action可用于在每个play的最后被触发,这样可避免多次有改变发生 时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。 在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
Playbook中handlers使用
示例
tags 定义标签方便调用
简单来说当设置tags时,可以单独调用某个tags的功能
Playbook中变量使用
- 变量名:仅能由字母、数字和下划线组成,且只能以字母开头
- 变量来源:
1 ansible setup facts 远程主机的所有变量都可直接调用
2 在/etc/ansible/hosts中定义
普通变量:主机组中主机单独定义,优先级高于公共变量公共(组)变量:针对主机组中所有主机定义统一变量
3 通过命令行指定变量,优先级最高
ansible-playbook –e varname=value4 在playbook中定义
5 在独立的变量YAML文件中定义
6 在role中定义
- 变量命名 变量名仅能由字母、数字和下划线组成,且只能以字母开头
- 变量定义:
key=value示例:http_port=80
- 变量调用方式: 通过 调用变量,且变量名前后必须有空格,有时用“”才生效
示例:使用setup变量
- 主机变量 可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用
- 示例:
- 组变量 组变量是指赋予给指定组内所有主机上的在playbook中可用的变量
- 示例:
示例:变量
- 普通变量
引用变量
ansible websrvs -m hostname -a "name={{ host_name }}{{ http_port }}"- 公共(组)变量
使用变量文件
模板template
template
- template功能:根据模块文件动态生成对应的配置文件 template文件必须存放于templates目录下,且命名为 .j2 结尾 yaml/yml 文件需和templates目录平级,目录结构如下:
template示例
- 示例:利用template 同步nginx配置文件 准备templates/nginx.conf.j2文件
使用template时
在file.yml平级目录中,会自己找这个teamplates目录下的文件
Playbook中template变更替换
Playbook中template算术运算
- 算法运算:
- 示例:
when
- 条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法 格式
- when语句 在task后添加when子句即可使用条件测试;when语句支持Jinja2表达式语法
- 示例:
示例:when条件判断
示例:when条件判断
- 示例: 根据系统版本复制不同的配置文件
迭代:with\_items
- 迭代:当有需要重复性执行的任务时,可以使用迭代机制 对迭代项的引用,固定变量名为”item“ 要在task中使用with\_items给定要迭代的元素列表 列表格式: 字符串 字典
示例
示例:迭代
- 示例:将多个文件进行copy到被控端
示例:迭代嵌套子变量
相当于多个循环,批量建用户及设置所属组
Playbook中template for if
示例
roles
- roles ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
- 复杂场景:建议使用roles,代码复用度高 1、变更指定主机或主机组 2、如命名不规范维护和传承成本大 3、某些功能需多个Playbook,通过includes即可实现
- 角色(roles):角色集合
Ansible Roles目录编排

roles目录结构
- 每个角色,以特定的层级目录结构进行组织
- roles目录结构:
Roles各目录作用
- /roles/project/ :项目名称,有以下子目录
创建role
- 创建role的步骤
- (1) 创建以roles命名的目录
- (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等
- (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、 templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
- (4) 在playbook文件中,调用各角色
针对大型项目使用Roles进行编排
roles目录结构:
示例:
roles的示例如下所示:
playbook调用角色
- 调用角色方法1:
playbook调用角色
- 调用角色方法2: 传递变量给角色
键role用于指定角色名称
后续的k/v用于传递变量给角色
- 调用角色方法3:还可基于条件测试实现角色调用
完整的roles架构
// nginx-role.yml 顶层任务调用yml文件
cat roles/nginx/tasks/filecp.yml
roles playbook tags使用
- roles playbook tags使用 ansible-playbook –tags=”nginx,httpd,mysql” nginx-role.yml // nginx-role.yml
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com

Loading...
keepalived