Ansible Playbook

Ansible PlayBook

如何使用Ansible Playbook来执行复杂任务。其中包括要如何检查Playbook的语法。

PlayBook和临时命令

临时命令可以作为一次性命令临时的在目标主机上执行一项简单的任务。但是要发挥ansible全部实力的话就要用playbook来完成对选定主机的一个或一组指定的有序任务。playbook是一个文本文件,是以YAML格式编写的文本文件,拓展名通常使用yml保存。

如果当vim识别到该文本文件是yaml格式的话,自动将tab键的制表符改为2个空格,以便格式正确。
修改$HOME/.vimrc文件,在其中添加规则:autocmd FileType yaml setlocal ai ts=2 sw=2 et

Playbook格式

使用---三个破折号作为playbook的开头,...三个英文句号作为playbook结尾(结尾非必须)。

在这两个标记之间,会以一个play列表的形式来定义playbook。YAML列表中的项目以一个破折号加空格开头。

1
2
3
- apple
- orange
- grape

play本身是一个简直对集合。确保同一个play中的键应当具有相同的缩进量。下面的例子显示了具有三个键的YAML代码片段,其中前两个键具有简单的值。第三个将含有三个项目的列表作为值。

1
2
3
4
5
6
- name: example
hosts: webservers
tasks:
- first
- second
- third

上面实例play有三个键name、hosts、tasks,他们有着相同的缩紧。第一行的name前面加了一个破折号和一个空格,表示他是第一个键,下面的两个键hosts与tasks和name这个键是同级的。

name通常作为一个play的开头,用来描述这个play是干嘛的,可以省略但是不推荐这么做。

hosts指定了要在哪些主机目标上运行这个playbook,前面了解过为如何为主机分组,所以此处可以填写在inventory中编排好的主机或组。

hosts: 可以使用通配符(*)、&与符号、!非符号进行匹配。也可以使用逗号来分割使用的不同的主机或组。⚠️注意:如果要使用这种模式来匹配主机,为了不与shell字符冲突,应使用''一对单引号来包裹你的匹配模式。

tasks是该play要运行的任务列表。下面的例子中所表达的是:在一个叫example的Play中执行两个简单的任务task1和task2的PlayBook写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
- name: example
hosts: webservers
tasks:
- name: task1
service:
name: httpd
enabled: true
- name: task2
user:
name: testuser
uid: 2000
state: present
...

一个更长点的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
---
- name: Enable internet services
hosts: serverb.lab.example.com
become: yes
tasks:
- name: Install internet services
yum:
name:
- firewalld
- httpd
- mariadb-server
- php
- php-mysqlnd
state: latest

- name: Enable Firewalld service
systemd:
name: firewalld
state: started
enabled: yes

- name: Allow 80 tcp port in firewalld
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes

- name: Enable httpd services
systemd:
name: httpd
state: started
enabled: yes

- name: Enable mariadb services
systemd:
name: mariadb
state: started
enabled: yes

- name: Add Web content
get_url:
url: http://materials.example.com/labs/playbook-review/index.php
dest: /var/www/html/index.php
mode: 0644


- name: Check services working well
become: false
hosts: localhost
tasks:
- name: check services correct
uri:
url: http://serverb.lab.example.com
status_code: 200
...

执行playbook

ansible-playbook playbook.yml

检查编写的playbook中的语法错误

ansible-playbook –syntax-check playbook.yml

使用自动检查有时并不能精确的定位到问题位置所在,但是几乎都在问题的附近,也能提供一些指导。

以检查模式运行playbook

ansible-playbook -C playbook.yml

使用检查模式运行playbook并不会对目标主机进行任何更改。可以用来在真正运行前进行一次测试。