Ansible PlayBook应用

1 playbook概述

playbook是Ansible的配置、部署和编排的语言。Playbook可以定制配置,他们可以按照你指定的操作步骤有序执行,支持同步和异步方式。形象点的说就是:如果ansible的各模块(能实现各种功能)是车间里的各工具;

playbook就是指导手册,目标远程主机就是库存和原料对象。

playbook可作为一个适合部署复杂应用程序的基础PlayBook是由一个或多个“play”组成的列表,在play中的内容被我们称之为tasks,也叫任务,也就是说多个tasks组成了一个play,task调用Ansible的各种模块(module)。将多个play组织在一个playbook剧本中,组成一个完整的流程控制集合,完成一个复杂的工作。

1.2yaml语言

Playbook采用YAML语言编写,每一个Ansible的Playbook都是一个YAML格式的文件,因此要学习编写剧本(playbook),我们先来了解YAML语法的基本用法。

1.2.1yaml有如下几个基本规则

1、yaml文件以---开头,以表明这是一个yaml文件,就像xml文件在开头使用宣称它是xml文件一样。但即使没有使用---开头,也不会有什么影响。

2、yaml中使用"#"作为注释符。

3、大小写敏感

4、使用缩进表示层级关系:YAML使用一个固定的缩进风格表示层级结构,同样的缩进代表同样的级别。缩进时不允许使用Tab键,只允许使用空格。

注:缩进的空格数目没有限制,但要求同一层级左对齐。判断是否是同一级别是通过缩进结合换行来实现的。

5、冒号,以冒号结尾的除外,其他所有冒号后面必须有空格。
6、短横线,表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表。

7、关于布尔值的书写格式,即true/false的表达方式。其实playbook中的布尔值类型非常灵活,可分为两种情况:

     模块的参数:这时布尔值作为字符串被ansible解析。接受yes/on/1/true/no/off/0/false。例如上面示例中的update_cache=yes。

    非模块的参数:这时布尔值被yaml解释器解析,完全遵循yaml语法。接受不区分大小写的true/yes/on/y/false/no/off/n。例如gather_facts: True。

建议遵循ansible的官方规范,模块的布尔参数采用yes/no,非模块的布尔参数采用True/False。

8、YAML文件扩展名通常为yml或yaml

1.2.3yaml语法

对于Ansible, 每一个YAML文件都是从一个列表(列表list,又称为序列 sequence)开始。列表中的每一项都是一个键值对,通常它们被称为一个 “哈希” 或 “字典”或映射。所以, 我们需要知道如何在YAML中编写列表和字典。

列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- " 作为开头(一个减号和一个空格)。

具体在ansible playbook中,列表所描述的是局部环境,它不一定要有名称,只要使用"- ",它就表示圈定一个范围,范围内的项都属于该列表

一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格),它一般当作列表项的属性。

k/v的值可同行写也可换行写。同行使用:分隔

v可是个字符串,也可是另一个列表

YAML列表与字典是可以自由组合在一起的,它们之间可以相互嵌套,通过非常灵活的组合,可以帮助我们描述更加复杂的对象属性。

此外, Ansible使用“{ { var }}”来引用变量.。如果一个值以 “{” 开头, YAML 将认为它是一个字典, 所以我们必须引用它, 像这样foo: "{ { var }}"。

下面我们来看一个playbook的例子

在编写剧本之前,我们先来回顾两个简单的ad-hoc命令,比如如下两条命令:

[root@cong11 ~]# ansible web_servers -m ping

[root@cong11 ~]# ansible web_servers -m file -a "path=/tmp/test211 state=directory"

上述命令表示使用ping模块去ping主机组web_servers中的主机,然后再用file模块在主机组web_servers的主机上创建目录,那么,如果把上述命令转换成playbook的表现形式,该如何书写呢?示例如下

Ansible PlayBook应用_第1张图片

---
- hosts: web_servers
  remote_user: root
  tasks:
  - name: ping the host
    ping:
  - name: make directory test
    file:
     path: /data/testfile
     state: directory 

 好了,aa.yml已经编写完成了,但是,我们还没有运行这个剧本,运行剧本需要使用'ansible-playbook'命令,示例如下

[root@cong11 ~]# ansible-playbook /root/aa.yml 

PLAY [web_servers] **************************************************************

TASK [Gathering Facts] **********************************************************
ok: [nginx02]
ok: [nginx01]

TASK [ping the host] ************************************************************
ok: [nginx02]
ok: [nginx01]

TASK [make directory test] ******************************************************
changed: [nginx01]
changed: [nginx02]

PLAY RECAP **********************************************************************
nginx01                    : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
nginx02                    : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

1.3playbook核心元素及常用参数

 1、PlayBook核心元素包括

target:定义PlayBook的远程主机组

variables:定义PlayBook使用的变量

tasks:定义远程主机上执行的任务列表

handlers:处理器,当某条件满足时,触发执行的操作。例如修改配置文件之后,启动跟handlers任务重启相关联的服务

roles :角色,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。

2、target常用参数详解

hosts:运行指定任务的目标主机,可以是一个主机组、主机、多个主机,中间以冒号分隔,也可以用all参数表示所有主机。

remote_user:指定远程主机上的执行任务的用户。

gather_facks:获取远程主机facts基础信息

3、variable常用参数详解

vars:在yaml文件中定义变量赋值。定义格式,变量名:变量值

vars_files:指定变量文件,在文件中定义变量

4、tasks常用参数详解

name:任务显示名称也是屏幕显示信息

module_name: module_args: 需要使用的模块名字: 模块参数Ansible PlayBook应用_第2张图片

 关于task说明:

1、Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。

 2、在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。

 3、每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。   如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。   

4、定义一个task,常见的格式:” module_name: module_args” 例如:yum: name=httpd state=absent update_cache=yes

5、ansible的自带模块中,command模块和shell模块无需使用key=value格式

 5、handler: 常用参数详解

notify: “noti

你可能感兴趣的:(运维)