Ansible Playbook 实践

Ansible Playbook 实践

一、Playbook 基础规范

(一)YAML 格式要求

  • 文件标识:以 --- 开头,明确为 YAML 文件,结尾可加 ...(可选,用于标记文件结束)。
  • 注释规则:用 # 实现注释,可注释整行(如 # 安装 httpd 服务)或行内内容(如 name: httpd # 服务名),注释内容不会被 Ansible 解析。
  • 字符串与布尔值
    • 字符串:一般无需引号,但若包含特殊字符(如空格、:、{})或引用变量(如 "{{ ansible_hostname }}"),需用双引号包裹。
    • 布尔值:在模块参数中,支持 yes/on/1/true(表示 "是")和 no/off/0/false(表示 "否"),Ansible 会自动解析为布尔类型。
  • 缩进规则:严格使用空格缩进(不支持 Tab),同一层级缩进量一致(推荐 2 个或 4 个空格),缩进错误会导致 Playbook 执行失败。

(二)Playbook 结构

每个 Play 包含 hosts(定义目标主机 / 组 )和 tasks(任务列表,按序执行 ),所有匹配 hosts 的主机都会收到任务指令,Ansible 筛选执行。

详细的字段:

|--------------|--------------------------------------------|-----------------------|
| 字段​ | 作用​ | 示例​ |
| name​ | 为 Play 命名,便于识别任务用途(非必填,但推荐添加,执行时会显示)​ | name: 部署 httpd 服务​ |
| hosts​ | 定义目标主机 / 主机组(从 Inventory 中匹配),支持多组(用逗号分隔)​ | hosts: test01,web​ |
| become​ | 是否切换为特权用户(如 root),默认 no,需提权时设为 yes​ | |
| become_user​ | 指定提权后的目标用户(默认 root),可按需改为其他特权用户​ | |
| tasks​ | 任务列表,按顺序执行,每个任务调用一个 Ansible 模块​ | 见下文实操场景示例​ |
| vars​ | 定义当前 Play 的变量(局部变量,仅在当前 Play 生效)​ | |
| vars_files​ | 引入外部变量文件(如 YAML/JSON 格式),适合变量较多的场景​ | |
| handlers​ | 触发式任务(仅在被 notify 调用时执行),常用于服务重启、配置重载​ | 见下文 "Handlers 组件" 示例​ |
| templates​ | 引入 Jinja2 模板文件,用于动态生成配置文件(如根据主机名生成不同配置)​ | |

二、Playbook 执行与验证

  • 测试执行:用 ansible-playbook -C 剧本名.yml 测试,不实际执行任务 。
  • 实际执行:ansible-playbook 剧本名.yml ,执行后按需用命令(如 curl、df -Th 等 )验证结果 。

三、Playbook 实操场景

主机清单:
**node1 属于 test01 主机组

node2 属于 test02 主机组
node3 和 node4 属于 web 主机组
node5 属于 test05 主机组
web 组属于 webtest 主机组**

(一)Node1 部署 httpd 服务(httpd.yml)

任务说明:依次安装 httpd、创建 /www 链接、写入网页内容、重启服务并设自启、配置防火墙允许 http 访问 ,实现 curl http://node1 访问到指定内容。

复制代码
cat httpd.yml

---

- name: wed

hosts: node1

tasks:

- name: install httpd

yum:

name: httpd

state: present

- name: create link

file:

src: /var/www/html

dest: /www

state: link

- name: file index

copy:

content: "welcome to luoqi\n"

dest: /var/www/html/index.html

setype: httpd_sys_content_t

- name: restart httpd

service:

name: httpd

state: restarted

enabled: yes

- name: httpd firewalld

firewalld:

service: http

permanent: yes

state: enabled

immediate: yes

结果展示:

(二)Node2 分区与挂载(parted.yml)

任务说明:先创建 1000MiB 主分区,格式化为 ext4,建挂载点 /testdir 并挂载分区,用 ansible node2 -m shell -a 'df -Th' 验证挂载。

复制代码
cat parted.yml

---

- name: cipanfenqu

hosts: node2

tasks:

- name: create parted

parted:

device: /dev/vdb

number: 1

part_type: primary

part_start: 10MiB

part_end: 1010MiB

state: present

- name: filesystem parted

filesystem:

dev: /dev/vdb1

fstype: ext4

- name: mount file

file:

path: /testdir

state: directory

- name: mount parted

mount:

path: /testdir

src: /dev/vdb1

fstype: ext4

state: mounted

结果展示:

(三)Node3 LVM 配置与挂载(lv.yml)

任务说明:创建分区,装 LVM 工具,建卷组 datastorage、逻辑卷 database,格式化为 xfs 后挂载到 /lv,用 ansible node3 -m shell -a 'df -Th' 验证 。

复制代码
cat lv.yml

---

- name: lv

hosts: node3

tasks:

- name: create /dev/vdb1

parted:

device: /dev/vdb

number: 1

part_type: primary

part_start: 10MiB

part_end: 2010MiB

state: present

- name: install lvm2

yum:

name: lvm2

state: present

- name: create datastorage

lvg:

vg: datastorage

pvs: /dev/vdb1

- name: create database

lvol:

lv: database

size: 800M

vg: datastorage

- name: lv filesystem

filesystem:

dev: /dev/datastorage/database

fstype: xfs

- name: mount file

file:

path: /lv

state: directory

- name: mount

mount:

path: /lv

src: /dev/datastorage/database

fstype: xfs

state: mounted

结果展示:

(四)多组软件包管理(tools.yml)

任务说明:分 Play 实现,先给 test01、test02、web 组装 php 和 tftp;

再给 test01 组装 RPM Development Tools 组;

最后升级 test01 组所有包到最新 。

复制代码
cat tools.yml

---

- name: yum install

hosts:

- test01

- test02

- web

tasks:

- name: install php and tftp

yum:

name:

- php

- tftp

state: present

- name: yum install group

hosts: test01

tasks:

- name: install group

yum:

name: "@RPM Development Tools"

state: present

- name: yum latest

hosts: test01

tasks:

- name: latest

yum:

name: '*'

state: latest

(五)计划任务配置(jihua.yml)

任务说明:在 test02 组主机,为 student 用户设每 5 分钟执行 echo "hello tarena" 的计划任务 。

复制代码
cat jihua.yml

---

- name: jihua

hosts: test02

tasks:

- name: cron student

cron:

name: aa

user: student

minute: '*/5'

job: echo "hello tarena"

state: present

结果展示:

(六)Web 开发环境配置(webdev.yml)

任务说明:在 test01 组主机,建 webdev 组和 /webdev 目录(权限 2775 含 SetGID ),创建符号链接,写入网页文件,实现 http://node1/webdev/ 访问显示指定内容 。

复制代码
cat webdev.yml

---

- name: webdev

hosts: test01

tasks:

- name: create group

user:

name: webdev

state: present

- name: mkdir

file:

path: /webdev

group: webdev

mode: '2775'

state: directory

- name: link

file:

src: /webdev

dest: /var/www/html/webdev

state: link

- name: create file

copy:

content: "It's works!\n"

dest: /webdev/index.html

setype: httpd_sys_content_t

结果展示: