# :-: Playbooks 介绍
[TOC]
Playbooks 是用完成许多由 ansible 命令行组合的 YAML 描述文件
### 执行一个 playbook
```
ansible-playbook XXX.yml
ansible-playbook XXX.yml --list-host //查看影响哪些机器
```
### Playbook 语言示例
Playbook 是由多个 `play` 组成。
一个 `play` 包含了被定义好的主机,和许多系列 `task`,每一个`task`对应一个`ansible` 任务。
下面的示例中,仅包含了一个`play`
```
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg-httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify: // 执行到notify时,会通知执行对应的handlers
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
// 无论这个handlers被notify通知多少次
//都只会在执行完所有task后,才会执行一次
service: name=httpd state=restarted
```
### Playbook 基础
##### 执行任务用户的选择
1. 可以为每一个play ,分别的选择目标主机和用户身份去执行task
```
---
- host: group-1
remote_user: root
```
2. 分别在每一个task中定义远程用户
```
---
- hosts: group-1
remote_user: root
tasks:
- name: test connect
ping:
remote_user: zwh
```
3. 使用 `sudo` 执行命令
在 play 中执行 sudo
```
---
- hosts: group-1
remote_user: zwh
sudo: yes
```
在每一个task中执行 sudo
```
---
- hosts: group-1
remote_user: zwh
tasks:
- service: name=ssh state=restarted
sudo: yes
```
使用 sudo 切换到 其他用户
```
---
- hosts: group-1
remote_user: zwh
sudo: yes
sudo_user: other_user
```
##### tasks列表
1、`tasks`会在`play`所选中的所有主机中进行任务,一旦某一个`task`执行过程中某一台主机出现错误,则在接下来所有的`tasks`中将这台主机剔除掉。
2、一个`task`会执行一个模块任务。
3、每一个`task`必须有一个名称`name`,这样在运行`playbook`时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个`task`的。
### 使用变量
```
---
- hosts: group-1
vars:
service_name: 80
tasks:
- name: use var value
service: name={{ service_name }} state=restarted
```
### Handlers 在发生改变时执行的操作
比如,当一个服务的配置文件发生更改时,需要重启这个服务来生效
<br/>
当更新完这个配置文件后,就会通过`notify`来通知`handlers`在`tasks`完成后来进行相应的操作,
但是不管有多少次`notify`通知执行`handlers`,里面相应的操作只会执行一次。
> handlers 会按照声明的顺序执行
```
tasks:
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
```
