Ansible PlayBook
是Ansible
的核心组件之一,用于定义自动化任务。采用YAML
格式编写,允许以声明式的方式描述服务器配置、应用部署、服务管理等操作。
PlayBook
即剧本,类似于电影的剧本。一部电影由很多很多个不同的场景组成,类似于第一场戏、第二场戏。一场戏中有很多很多的组成:演员、背景、道具、特效、台词等等,而这一切最终都会由剧本编排,组成最终我们看到的电影。
PlayBook
也是同样的原理,可以将一个一个不同的任务进行编排,最终完成我们想要的效果。
一、Ansible Playbook 的基本结构
一个基本的PlayBook
由以下内容组成:
目标主机(
hosts
):定义在哪些机器上执行任务变量(
vars
):可选的变量任务(
tasks
):具体要执行的操作(调用模块)handlers
:由任务触发的事件(若执行任务后状态发生改变,则执行handlers
中定义的任务)
PlayBook
示例:
- name: Install and start Nginx # Play 的名称
hosts: web_servers # 目标主机组(在 inventory 中定义)
tasks:
- name: Install Nginx # 任务1:安装 Nginx
yum:
name: nginx
state: present
- name: Start Nginx service # 任务2:启动服务
systemd:
name: nginx
state: started
enabled: yes
对应的ad-hoc
:
ansible web_servers -m yum -a "name=nginx state=present"
ansible web_servers -m systemd -a "name=nginx state=started enabled=yes"
为什么每个任务要写一个name
?
我们可以通过指定
name
的方式控制整个PlayBook
从哪里开始运行或只运行某个任务。
1. YAML 基础语法
缩进:必须使用空格(不能使用 Tab),通常
2
个空格缩进(可以不是2
个,但需要统一)键值对:
key: value
(冒号后必须有空格)列表:以
-
开头,表示多个项。类似于Python
中的list
注释:以
#
开头文件的后缀:
*.yaml
或*.yml
---
# 这是一个注释
- name: Play 1 # 这是一个 Play(列表项)
hosts: web_servers # Play 的字典成员(键值对)
become: yes # Play 的字典成员
tasks: # Play 的字典成员(值是一个列表)
- name: Task1 # tasks 列表的子项
新版本的 ansible 模块分了很多个类别,所以新版的
ansible playbook
写模块的时候,写的很细。我们依旧可以使用旧版本的语法去写,也就是只写模块的名称。
2. 执行 PlayBook
ansible-playbook test.yaml
ansible-playbook -C test.yaml # -C=--check 检查语法,并不真正执行
二、实操案例
编写一个 NFS 剧本
NFS
服务端PlayBook
- name: nfs
hosts: nfs_servers # 在inventory文件中定义的主机组
become: yes # 使用root权限
tasks:
# 安装必要的软件包
- name: 安装NFS服务端软件
yum:
name: nfs-utils
state: present
# 创建共享目录
- name: 创建共享目录
file:
path: /data/share
state: directory
mode: '0777'
# 配置NFS导出
- name: 配置NFS导出
lineinfile:
path: /etc/exports
line: "/data/share 192.168.100.0/24(rw,sync,no_root_squash)"
state: present
# 启动NFS服务
- name: 启动NFS服务
service:
name: nfs-server
state: started
enabled: yes
NFS
客户端PlayBook
- name: 配置NFS客户端
hosts: nfs_clients # 在inventory文件中定义的主机组
become: yes # 使用root权限
tasks:
# 安装NFS客户端软件
- name: 安装NFS客户端软件
yum:
name: nfs-utils
state: present
# 创建挂载点目录
- name: 创建挂载点目录
file:
path: /mnt/nfs_share
state: directory
mode: '0777'
# 挂载NFS共享
- name: 挂载NFS共享
mount:
path: /mnt/nfs_share
src: "192.168.100.100:/data/share" # 替换为实际的NFS服务器IP
fstype: nfs
opts: "rw,sync"
state: mounted
# 确保开机自动挂载
- name: 添加到fstab实现开机自动挂载
lineinfile:
path: /etc/fstab
line: "192.168.100.100:/data/share /mnt/nfs_share nfs rw,sync 0 0"
state: present
PlayBook 的简便写法
-name: 06-start
systemd: name=fs state=started enabled=true
三、运行检查规范
检查剧本拼写规范
ansible-playbook your_playbook.yaml --syntax-check
检查这个任务执行的主机对象
ansible-playbook your_playbook.yaml --list-hosts
检查这个剧本需要执行哪些任务
ansible-playbook your_playbook.yaml --list-tasks
ansible-playbook your_playbook.yaml --list-tags
模拟执行剧本
ansible-playbook your_playbook.yaml --check(-C)
真正执行剧本
ansible-playbook your_playbook.yaml