一、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的格式要求如下:
  1. "#"代表注释,一般第一行为三个横杠(---)
  2. 键值(key/value)对使用":"表示,数组使用"-"表示,"-"后面有空格
  3. key和value之间使用":"分隔
  4. ":"后面必须有空格
  5. 一般缩进由两个或以上空格组成
  6. 相同层级的缩进必须对齐,缩进代表层级关系
  7. 全文不可以使用tab键
  8. 区分大小写
  9. 扩展名为yml或者yaml
  10. 跨行数据需要使用>或者|,其中|会保留换行符

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