Skip to content

Ansible 之旅(七) Playbook

Ansible Playbook

什么是 Playbook ?首先 Play 是一组有序的 tasks ,这些任务是可以在 inventory 中的主机执行,而 Playbook 它是一个文本文件,里面包含了一个或多个 Play
Play 可以允许将复杂、冗长的手动管理任务转换为可以预测成功结果的可重复例程。在 Playbook 中,可以保存可读和可执行的 tasks 队列,可以按照应用部署的步骤来编写 Playbook 来进行部署应用或基础架构。

Playbook 格式

首先先看到之前介绍过的 Ad Hoc 命令:

$ ansible -m user -a "name=Tom uid=1200 state=present" demo.example.com

以上命令的作用是在 demo.example.com 上创建一个 Tom 用户,UID 为1200 。这是一个 Task ,把它转化成 Playbook 格式如下:

---
- name: Create Tom User
  hosts: demo.example.com
  tasks:
    - name: Tom exists with UID 1200
      user:
         name: Tom
         uid: 1200
         state: present
...

先不看格式,根据内容相信都能看懂,这就是 Playbook 的易读性,接下来将介绍其格式。
Playbook 文本文件使用的是 YAML 格式书写的,通常后缀是 .yml 。Playbook 主要使用缩进和空格字符来表明数据层次结构,YAML 格式没有严格限制缩进要使用多少空格(一般是两个),但是要遵循以下两个基本原则:
1、层次结构中相同级别的元素(如:相同的列表和项)必须具有相同的缩进。
2、条目中的子条目相对其它条目需要比父目录更缩进。
在 Playbook 文件开头需要输入三个破折号(---),标记文档的开始,同时在文档的结尾也需要输入三个点符号(...),标记文档的结束,当然不写开头和结尾的标记符也是可以的。
介于开头和结尾标记符号之间,Playbook 定义了一些 Play 列表,在 YAML 格式中在每一个列表前面需要添加一个破折号然后紧跟一个空格。
Example:

---
- name: Just an Example
  hosts: webservers
  tasks:
    - first
    - second
    - third
...

Example: 在 demo.example.com 托管主机上安装 httpd 并且启动该服务

---
- name: Configure Web Service on demo.example.com
  hosts: demo.example.com
  tasks:
    - name: Install Web Service
      yum:
        name: httpd
        state: latest

    - name: Start and Enable Web Service
      service:
        name: httpd
        state: started
        enabled: true
...

运行 Playbook

通过 ansible-playbook 命令后面接 Playbook 文件就可以运行 Playbook 。
ansible-playbook 命令选项:

选项 用途
--syntax-check 检查 Playbook 语法检查
-C dry run ,测试运行,不会真的操作
-v -vvv -vvvv 显示详细信息(啰嗦模式),通常配合 -C 使用

多 Play 的 Playbook

在 Playbook 中可以书写多个 Play 可以在不同的托管主机上进行任务。
Example:

---
- name: This is simple playbook with two plays
  hosts: web.example.com
  tasks:
    - name: first task
      yum:
        name: httpd
        status: present

    - name: second task
      service:
        name: httpd
        enabled: true

- name: second play
  hosts: db.example.com
  tasks:
    - name: first task
      service:
        name: mariadb
        status: started
        enabled: true

...

Play 中定义远程用户与权限提升

Plays 可以使用不同的远程用户或特权升级,这有别于默认的配置文件,它们可以在 hoststasks 这一级别定义。

属性
remote_user 远程用户
become 是否进行特权提升:true or false
become_method 特权提升方式:sudo or su
become_user 权限提升至哪个用户

Playbook 语法差异

YAML 语法存在一些变体,可以在 Playbook 中使用的另一种方法。
YAML 注释使用的是(#)号,可以注释一行内容或者右侧内容。
YAML 字符串不需要使用引号括起,但是也可以使用单或双引号。
书写多行内容时可以使用(|)或者(>)符号。
YAML 有些情况可以将多行内容书写成一行,但是一般不建议这样做,如:

name: web
service: httpd
state: started
可以写成:{name:web,service:httpd,state:started}

hosts:
  - servera
  - serverb
  - serverc
可以写成:hosts:[servera,serverb,serverc]

tasks:
  - name: start httpd
    service: name=httpd enabled=true state=started

小菜园 原创文章,未经允许,请勿转载!

本文链接: https://www.imxcai.com/devops/ansible/ansible-playbook.html


发表评论

电子邮件地址不会被公开。 必填项已用*标注