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 可以使用不同的远程用户或特权升级,这有别于默认的配置文件,它们可以在 hosts
与 tasks
这一级别定义。
属性 | 值 |
---|---|
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
评论已关闭