Playbooks
Playbooks 是 Ansible 的配置、部署、编排语言,相当于控制远程主机的一系列命令的集合,通过 YAML 语言编写。Ansible-Playbook 命令根据自上而写的顺序依次执行。 Playbook 允许传输摸个命令的状态到后面的指令,或者从一台主机的文件中获取内容并赋值变量,然后传给另外一台主机使用,这是 ansible 命令无法实现的。
YAML 语法介绍
文件开始符
|
|
数组列表
列表中的所有成员都开始于相同缩进级别,并使用 -
来作为开头
字典
字典是有一个简单的 Key: value
形式组成,注意 :
后面有空格
在 playbook 中会有更为复杂的用法
- 字典与字典嵌套
|
|
- 字典与数组的嵌套
|
|
注意,如果变量里有 :
,则需要加引号
Playbook 基本用法
最基本的 playbook 分为三部分:
- 在什么机器上以什么身份执行
- hosts
- users
- 定义 playbook 执行需要的变量
- variable
- 执行的任务是都有什么
- tasks
- 善后的任务是什么
- handlers
执行 Playbook
|
|
示例
官方示例
要学习更多的 playbook 用法,可以通过Playbooks 官方示例。
Playbook 分享平台
Ansible 提供了一个 Playbook 的分享平台,上面的例子是有 Ansible 使用者自己上传的。
Ansible分享平台
简单示例
- 创建用户
|
|
- name 参数对该 playbook 实现功能的一个概述,后面执行过程中会打印 name 变量值
- hosts 参数指定了那些主机
- user 参数执行了使用什么用户登陆远程主机
- gather_facts 参数指定了下面任务执行前,是否先执行 setup 模块获取主机相关信息,这些后面 task 会使用 setup 获取的信息
- vars 参数指定了变量, 变量 user,值为 charlie,值得注意的是参数要用引号
- task 指定了一个任务,下面的 name 参数同样是对任务的描述,在执行过程中打印出来。user 指定了调用 user模块,name 是user模块中的参数,增加的用户名是上面 user 的值
执行结果
- 安装apache
|
|
主机和用户 Host and User
在执行 playbook 时,可以选择操作的目标主机是那些,以那个用户执行
host 行的内容是一个或多个主机的 patterns, 以逗号分隔
还可以在每个 task 中,定义远程执行用户
也支持 sudo 方法,在 task中同样支持,在 sudo 需要密码时,可以加上选项 –ask-sudo-pass
任务列表 Tasks
- tasks 是从上到下顺序执行,如果中间发生错误,整个 playbook 便会中断。
- 每一个 task 是对module的一次调用,通常会带有特定参数,参数可以使用变量。
- 每一个 task 必须有一个 name 属性,name 值会在命令行中输出,以提示用户,如果没有定义,aciton 的值会作为输出信息来标记task
语法
|
|
执行状态
task 中每个 action 会调用一个 module,在 module 中会去检查当前系统状态是否需要重新执行,具体判断需要有各个 module 自己来实现。
- 如果执行那么 action 会得到返回值 changed;
- 如果部执行,那么 action 会得到返回值 OK
状态实例 以一个 copy 文件为例
可以看到第一次 task的状态是 changed 状态,第二次再次执行,task 状态是 OK,说明文件已经存在,避免 ansible 再次重复执行。
响应事件 Handler
什么是 handler
每个主流的变成语言都会有 event 机制,那么 handler 就是 playbook 的 event。Handler 里面的每个 handler,也是对 module 的一次调用。不同的是 handler 不会默认的按照顺序执行。
Tasks 中的任务是有状态的,changed 或者 ok。 在 Ansible 中,只有 task 的执行状态为 changed 时,才会触发,这就是 handler。
应用场景
如果在 tasks 中修改了某个服务的配置文件,就需要重新启动服务,重新启动服务就可以设计成为一个 handler
触发Handlers
只有 action 是 changed 时,才会执行 handler
- 第一次执行时,tasks 的状态是 changed, 回触发 handler
- 第二次执行时,task 的状态是 OK, 那么就不会触发 handler
|
|
playbook roles 和 include
在刚开始使用 playbook 时,习惯性会把 playbook 写成一个很大的文件,然而在实际情况下, 有些文件是可以重用的。playbook 可以使用 include,把其他 playbook 文件中的 variables、tasks 或者 handlers 从其他文件拉取过来。
规划目录组织结构
通过目录规格,可以使 playbook 模块化,使代码易读、可以重用、层次清晰。
可以通过 ansible-galaxy
工具,初始化一个 role 目录
include 语句
普通用法
|
|
高级用法,传递参数
|
|
在 handlers section 中定义
|
|
include 语句可以和其他非 include 的 tasks 和 handlers 混合使用。
例如:
Roles
Ansible 中还有一个比 include 更为强大的代码重用机制,那就是roles!。Roles 基于一个已知的文件结构,去自动加载某些 var_files, tasks, handlers,基于 roles 对内容进行分组,更有利于与其他用户分享 roles。
Ansible提供了一个分享role的平台, http://galaxy.ansible.com/, 在galaxy上可以找到别人写好的role.
Roled的目录结构
在 ansible 中,通过遵循特定的目录结构,可以实现对 role 的定义。下面的目录结构是定义了两个 role, 一个名字是 common,另外一个是 webserver,并在 site.yml 中调用这两个 role。
使用带参数的 role
|
|
指定默认的参数
在指定默认参数后,如果在调用时传参数,那么就使用传入的参数值,否则使用默认参数。
与条件语句一起执行
|
|