Ansible 的 Playbook模式
一、playbook 概述
1.1、什么是playbook
playbook 称之为剧本,故名思意,就是将要做的事/流程实现编排好,要具体执行任务的就是,就照着剧本排练好的流程执行就行了
剧本是ansible的精髓所在。
1.2 为何要用playbook
简单的任务用ad-hoc命令行模式就行,复杂的任务还是要用playbook,playbook还有很多命令行模式没有的高级功能,接下来我们来一一介绍
1.3 playbook的构成
一个playbook需要按照yaml格式组织到文件中,playbook是由一个或多个 play 组成的列表。
play由以下部分构成
- 1、Target Section:
- hosts:用于指定在哪些主机上运行 play
- name:当前play的名字/描述,可以省略
- remote_user:用于指定在远程主机上,以哪个用户的身份执行任务
- 其他…
- 2、Variable Section:定义运行 play 时,使用的变量
- 3、Task Section:定义要在远程主机上运行的任务列表,可以包含多个task
- name:任务的名字。用来描述任务是做什么的
- ‘module: options’:调用的 module 和传递给 module 的参数
- notify:用于指定通知哪些 handler
- 需要注意的是:默认情况下,仅在任务执行成功,并且远程主机发生变动的情况下,才会执行 notify
- 其他…
执行剧本
ansible-playbook --syntax-check a.yaml # 检查语法
ansible-playbook -C a.yaml # 通过-C选项可以测试playbook的执行情况,但不会真的执行:
ansible-playbook a.yaml -vv # 执行并打印任务运行结果以及任务的配置信息
打印详细信息
-v:打印任务运行结果
-vv:打印任务运行结果以及任务的配置信息
-vvv:包含了远程连接的一些信息
二、YAML 语法
语法 | 描述 |
---|---|
缩进 | YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用TAB |
冒号 | 以冒号结尾的除外,其他所有冒号后面所有必须有空格 |
短横线 | 表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一列表 |
- 中国:
上海:
北京:
- 朝阳
- 昌平
- 海淀
转换为json格式如下
{
"中国": {
"上海": null,
"北京": {
"朝阳": null,
"昌平": null,
"海淀": null
}
}
}
三、playbook实战
3.1、环境准备
准备环境,后续试验就以其作为背景展开
主机 | IP | 身份 |
---|---|---|
m01 | 192.168.71.11 | 控制端 |
lb01 | 192.168.71.12 | 受控端 |
nfs | 192.168.71.13 | 受控端 |
web01 | 192.168.71.14 | 受控端 |
web02 | 192.168.71.15 | 受控端 |
db01 | 192.168.71.16 | 受控端 |
在控制端添加/etc/hosts
192.168.71.12 lb01
192.168.71.13 nfs
192.168.71.14 web01
192.168.71.15 web02
192.168.71.16 db01
3.2.配置主机清单
[root@m01 ~]# cat /etc/ansible/hosts
[lb]
lb01 ansible_ssh_pass='1'
[nfs_server]
nfs ansible_ssh_pass='1'
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
[db_server]
db01 ansible_ssh_pass='1'
[www:children]
lb
nfs_server
web_group
db_server
[nginx:children]
lb
web_group
3.3 创建并切入工作目录
mkdir /workspace
cd /workspace
3.4.编写base.yml
[root@m01 workspace]# cat base.yml
- hosts: all
tasks:
- name: Stop Selinux
selinux:
state: disabled
- name: Stop Firewalld
systemd:
name: firewalld
state: stopped
- name: Create www Group
group:
name: www
gid: 1666
state: present
- name: Create www User
user:
name: www
uid: 1666
group: www
shell: /sbin/nologin
create_home: false
state: present
执行剧本
[root@m01 workspace]# ansible-playbook base.yml
3.5 部署nfs剧本
[root@lb workspace]# cat nfs.yaml
- hosts: nfs_server
tasks:
- name: Install nfs-util
yum:
name: nfs*
state: present
- name: mkdir /data
file:
path: "/data"
state: directory
- name: Config nfs
copy:
content: "/data 192.168.71.0/24(rw,sync,all_squash)"
dest: /etc/exports
- name: Start nfs-server
systemd:
name: nfs-server
state: restarted
enabled: true
执行剧本
[root@m01 lnmp]# ansible-playbook nfs.yml