一、Ansible playbook 简介
playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。
通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系列 to-do-list ,而被控节点必须要完成。也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。
二、Ansible playbook使用场景
执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。
就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。
使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。
三、Ansible playbook 格式
Ansible ad-hoc可以通过命令行形式远程管理其他主机,适合执行一些临时性简单任务。另外还有一种远程管理的方式叫Playbook,Ansible Playbook中文名称叫剧本,它将经常需要执行的任务写入一个文件,这个文件就叫剧本。
- 剧本中可以包含多个任务
- 剧本写后,我们随时根据剧本,执行相关的任务命令
- Playbook剧本要求按照YAML格式编写
- 适合执行周期性经常执行的复杂任务
YAML是什么?
- YAML是一个可读性高、用来表达数据序列的格式语言
- YAML:YAML Ain't a Markup Language
- YAML以数据为中心,重点描述数据的关系和结构
- YAML的格式要求如下:
- "#"代表注释,一般第一行为三个横杠(---)
- 键值(key/value)对使用":"表示,数组使用"-"表示,"-"后面有空格
- key和value之间使用":"分隔
- ":"后面必须有空格
- 一般缩进由两个或以上空格组成
- 相同层级的缩进必须对齐,缩进代表层级关系
- 全文不可以使用tab键
- 区分大小写
- 扩展名为yml或者yaml
- 跨行数据需要使用>或者|,其中|会保留换行符
Playbook语法格式要求如下:
- playbook采用YAML格式编写
- playbook文件中由一个或多个play组成
- 每个play中可以包含:
hosts(主机)、tasks(任务)、vars(变量)等元素组成 - 使用ansible-playbook命令运行playbook剧本
四、Ansible playbook 核心元素
- hosts: 主机组;
vars: 变量
tasks: 任务列表;
tmplates: 包含了模板语法的文本文件;
handlers: 由特定条件触发的任务;
举例:
①安装运行apache服务:
# vim /tmp/httpd.yml
---
- hosts: web1
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=present
- name: starting httpd service
service: name=httpd state=started
# ansible-playbook /tmp/httpd.yml
转换为ad-hoc:
# ansible web1 -m yum -a 'name=httpd state=present'
# ansible web1 -m service -a 'name=httpd state=started'
②安装并运行nginx服务:
# vim /tmp/nginx.conf
---
- hosts: web1
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
tags: installnginx
- name: copy nginx.conf
copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf
notify: reload #当nginx.conf发生改变时,通知给相应的handlers
tags: reloadnginx #打标签
- name: copy index.html
copy: src=/tmp/index.html dest=/usr/share/nginx/html/index.html
tags: reloadnginx
- name: start nginx service
service: name=nginx state=started
tags: startnginx #打标签
handlers: #注意,与tasks同级
- name: reload
service: name=nginx state=restarted
运行整个剧本:
# ansible-playbook /tmp/nginx.yaml
五、运行前三部曲
检查错误:
# ansible-playbook /tmp/nginx.yaml --syntax-check
列出所有任务:
# ansible-playbook /tmp/nginx.yaml --list-task
列出在那些机器执行:
# ansible-playbook /tmp/nginx.yaml --list-hosts
运行:
# ansible-playbook /tmp/nginx.yaml