文章目录
一、什么是Playbook
Playbook(剧本)是系统 Ansible 指令的集合,其利用 YAML 语言编写,自上而下按顺序一次执行。它可以实现一些 Ad-Hoc 指令无法实现的操作。
可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。playbooks相当于shell脚本(再或者理解为docker中的Dockerfile),可以把执行的任务写到文件中一次执行,方便调用。 但是它有自己的语法规范。
说明:
ansible的操作方式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一条简单的命令。playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
ad-hoc无法持久使用,playbook可以持久使用。
playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name
二、Playbook语法
playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。
- 在单一一个playbook文件中,可以连续三个连子号(—)区分多个play。还有选择性的连续三个点好(…)用来表示play的结尾,也可省略。所有的列表元素以"-“开头,键值对用”:",后面的空格是必须的。
- 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
- 使用#号注释代码。
- 缩进必须统一,不能空格和tab混用。
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
- YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
- key/value的值可同行写也可以换行写。同行使用:分隔。
- value可以是个字符串,也可以是一个列表
- 一个完整的代码块功能需要最少元素包括 name: task
三、playbook的执行
用法:
ansible-playbook [options] filename.yml
--check或-C 只检测可能会发生的改变,但不真正执行操作
--syntax-check 对剧本进行语法的检查
--list-hosts 列出运行任务的主机
--list-task 检查tasks任务
--limit 主机列表 只针对主机列表中的主机执行
--start-at-task='' 指定从某个task开始运行
-v 显示过程 -vv -vvv 更详细
-k(–ask-pass) 用来交互输入ssh密码
-K(-ask-become-pass) 用来交互输入sudo密码
-u 指定用户
四、Playbook核心元素和基础组件
核心元素:
Playbooks
Variables #变量元素,可传递给Tasks/Templates使用;
Tasks #任务元素,由模块定义的操作的列表,即调用模块完成任务;
Templates #模板元素,使用了模板语法的文本文件;
Handlers #处理器元素,通常指在某事件满足时触发的操作;
Roles #角色元素
playbook的基础组件:
name:
定义playbook或者task的名称(描述信息),每一个play都可以完成一个任务。
hosts:
playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。hosts用于指定要执行指定任务的主机.
user :
remote_user则用于指定远程主机上的执行任务的用户,也可以使用user(基本上是root)
tasks :
任务列表play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
tags :
标签,指定某条任务执行,用于选择运行playbook中的部分代码。
vars:
定义变量(如果不使用内部变量需要提前定义)
vars_files:
调用定义变量文件
notify:
任务执行结果如果是发生更改了的则触发定义在handler的任务执行;Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
handlers:
用于当前关注的资源发生变化时采取一定指定的操作;Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
templates :
模板,即使用模板语法的文件,比如配置文件等
(一)hosts和users
在playbook中的每一个play都可以选择在哪些服务器和以什么用户完成,hosts一行可以是一个主机组、主机、多个主机,中间以冒号分隔,可使用通配模式。其中remote_user表示执行的用户名。
---
- hosts: webserver # 指定主机组,可以是一个或多个组。
remote_user: root # 指定远程主机执行的用户名
指定远程主机sudo切换用
---
- hosts: webserver
become: yes # 2.6版本以后的参数,之前是sudo,意思为切换用户运行
become_user: dxk
(二)tasks list 和action
- Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。
在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。
Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行是幂等的,这意味着多次执行是安全的,因为其结果一致。 - 每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。
- 定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
- ansible的自带模块中,command模块和shell模块无需使用key=value格式
- play中只要执行命令的返回值不为0,就会报错,tasks停止,可以添加 ignore_errors: True 忽略错误,强制返回成功
[root@ansible ~]# vim test.yml
---
- hosts: 192.168.126.97 # 指定主机
remote_user: root # 指定在被管理的主机上执行任务的用户
tasks: # 任务列表↓
- name: disable selinux # 任务名为关闭防火墙
command: '/sbin/setenforce 0' # 使用command模块 执行关闭防火墙命令
- name: start httpd # 任务名 开启httpd
service: name=httpd state=started # 使用service模块 开启httpd 服务
# ignore_errors:True # 忽略错误,强制返回成功
# 检查语法
[root@ansible ~]# ansible-playbook test.yml --syntax-check
playbook: test.yml
# 则表示语法正确
# 执行
[root@ansible ~]# ansible-playbook test.yml
PLAY [192.168.126.97] **********************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.126.97]
TASK [disable selinux] *********************************************************
changed: [192.168.126.97]
TASK [start httpd] *************************************************************
changed: [192.168.126.97]
PLAY RECAP *********************************************************************
192.168.126.97 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 如果需要输出更详细的信息,加 -v 或 -vv参数
(三)handlers与notify
handlers用来用来解决触发时间的,也就是当一个tasks真正的执行后,结果发生了变化。会去触发另一个task。
handlers和notify结合使用触发条件:
Handlers(触发器)
是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。
Notify(通知)
此action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成最后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
handlers是一种触发器,它可以对task进行监控,如果task所指定的任务状态发生变化,则进行notify通知,然后触发额外的一系列操作,看一个示例来帮助理解:
---
- hosts: webservers
remote_user: root
tasks:
- name: install apache
yum: name=httpd state=latest
- name: install configure file for httpd
copy: src=/root/conf/httpd.c