Ansible playbook
playbok介绍
Ansible playbook中文名称为剧本,是一个文件,存放经常需要执行的任务,这个剧本中可以包含多个任务,随时根据剧本执行相关的任务命令。
相比Ansible ad-hoc方式适合执行一些临时性的简单任务。Ansible playbook的方式更适合复杂任务的管理,以及经常要完成的周期性任务。
playbook剧本需要按照YAML格式编写。YAML(YAML Ain’t a Markup Language)是一种可读性高、用来表达数据序列的格式语言。YAML以数据为中心,重点描述数据的关系和结构,比传统的xml方式更加简洁。
YAML文件语法规范:
- 文件扩展名为yml或者yaml
- "#"代表注释,一般第一行为三个横杠
- 键值对使用":"表示,数组使用"-"表示
- 缩进由两个或以上空格组成,相同层级的缩进必须对齐,如果缩进不对,则有语法错误
- 全文不可使用tab键,必须使用空格
- 区分大小写
- 跨行数据需要使用>或者|(|会保留换行符)
YAML格式的键值对数据:
- key和value之间使用":"分隔
- ":"后面必须有空格
- 缩进代表层级关系
playbook语法格式
一个剧本(即playbook)由一个或多个play组成,每个play用于在指定的主机上,通过模块和参数执行相应的任务。每个play中包含:hosts(主机)、tasks(任务)、vars(变量)等元素。
使用ansible-playbook命令运行playbook。
单目标单任务Playbook
# 编写用于连通性的playbook
[root@pubserver ansible]# vim test.yml
---
- name: test network
hosts: all
tasks:
- name: test via ping
ping:
[root@pubserver ansible]# ansible-playbook test.yml
PLAY [all] ************************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [web1]
ok: [db1]
ok: [web2]
TASK [ping] ***********************************************************************************************
ok: [db1]
ok: [web1]
ok: [web2]
PLAY RECAP ************************************************************************************************
db1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
多目标多任务Playbook
多目标多任务的playbook中,每个play的hosts由一个或多个组或主机组成,多个组或主机之间使用逗号分隔;每个play的tasks由一个或多个任务组成,多个任务按顺序执行。
在dbs组的主机和web1上创建/tmp/demo目录,权限是0755。将控制端/etc/hosts拷贝到目标主机的/tmp/demo中。
[root@pubserver ansible]# vim fileop.yml
---
- name: create dir and copy file
hosts: dbs,web1
tasks:
- name: create dir
file:
path: /tmp/demo
state: directory
mode: '0755'
- name: copy file
copy:
src: /etc/hosts
dest: /tmp/demo/hosts
[root@pubserver ansible]# ansible-playbook fileop.yml
PLAY [create dir and copy file] ************************************************
TASK [Gathering Facts] *********************************************************
ok: [db1]
ok: [web1]
TASK [create dir] **************************************************************
changed: [db1]
changed: [web1]
TASK [copy file] ***************************************************************
changed: [web1]
changed: [db1]
PLAY RECAP *********************************************************************
db1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
多play playbook
一个playbook中可以有多个play。
在webservers组中的主机上,创建用户bob,附加组是adm;在db1主机上,创建/tmp/hi.txt,其内容为Hello World
[root@pubserver ansible]# vim cruserfile.yml
---
- name: create user
hosts: webservers
tasks:
- name: create bob
user:
name: bob
groups: adm
- name: create file
hosts: db1
tasks:
- name: make file
copy:
dest: /tmp/hi.txt
content: "Hello Word"
[root@pubserver ansible]# ansible-playbook cruserfile.yml
PLAY [create user] *************************************************************
TASK [Gathering Facts] *********************************************************
ok: [web2]
ok: [web1]
TASK [create bob] **************************************************************
changed: [web1]
changed: [web2]
PLAY [create file] *************************************************************
TASK [Gathering Facts] *********************************************************
ok: [db1]
TASK [make file] ***************************************************************
changed: [db1]
PLAY RECAP *********************************************************************
db1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0