Ansible Playbook 入门指南:从基础到实战

Ansible Playbook 入门指南:从基础到实战

文章目录

  • [Ansible Playbook 入门指南:从基础到实战](#Ansible Playbook 入门指南:从基础到实战)
    • [一、Playbook 基本结构](#一、Playbook 基本结构)
    • [二、Playbook 运行与常用参数](#二、Playbook 运行与常用参数)
    • 三、核心功能详解
      • [1. 变量与引用](#1. 变量与引用)
      • [2. 条件判断(when)](#2. 条件判断(when))
      • [3. 迭代(loop/with_items)](#3. 迭代(loop/with_items))
      • [4. 模板(Templates)](#4. 模板(Templates))
      • [5. 标签(Tags)](#5. 标签(Tags))
    • [四、Roles 模块化组织](#四、Roles 模块化组织)
      • [使用 Roles 的步骤:](#使用 Roles 的步骤:)
    • 五、总结

Ansible 作为一款强大的自动化运维工具,其核心功能之一便是通过 Playbook 实现任务的批量自动化执行。本文将从 Playbook 的基本结构讲起,逐步深入到变量、条件判断、迭代等高级用法,最后介绍 Roles 模块的使用,帮助你快速掌握 Playbook 的编写与应用。

一、Playbook 基本结构

Ansible Playbook 是一个 YAML 格式的文件,由多个 Play 组成,每个 Play 针对指定主机组执行一系列任务。其核心组成部分包括:

  • Tasks:任务列表,每个任务调用 Ansible 模块执行具体操作
  • Variables:变量定义,提升 Playbook 的灵活性
  • Templates:基于 Jinja2 模板动态生成配置文件
  • Handlers:响应任务状态变化的触发操作(如服务重启)
  • Roles:模块化组织任务、变量等资源,便于复用

一个简单的 Playbook 示例:

yaml 复制代码
---
- name: 部署 Web 服务
  hosts: webservers    # 目标主机组
  remote_user: root    # 执行用户
  tasks:
    - name: 测试主机连通性
      ping:
    - name: 安装 httpd
      yum: name=httpd state=latest
    - name: 启动 httpd 服务
      service: name=httpd state=started enabled=true
  handlers:
    - name: 重启 httpd
      service: name=httpd state=restarted

二、Playbook 运行与常用参数

编写完成后,通过 ansible-playbook 命令运行 Playbook,常用参数如下:

bash 复制代码
# 基本运行
ansible-playbook test.yaml

# 语法检查
ansible-playbook test.yaml --syntax-check

# 查看任务列表
ansible-playbook test.yaml --list-task

# 查看影响的主机
ansible-playbook test.yaml --list-hosts

# 从指定任务开始执行
ansible-playbook test.yaml --start-at-task='安装 httpd'

# 输入 SSH 密码或 sudo 密码
ansible-playbook test.yaml -k    # SSH 密码
ansible-playbook test.yaml -K    # sudo 密码

三、核心功能详解

1. 变量与引用

变量可通过 vars 关键字定义,或通过命令行 -e 参数传递,使用 {``{ 变量名 }} 引用:

yaml 复制代码
- name: 创建用户和组
  hosts: dbservers
  vars:
    groupname: mysql
    username: nginx
  tasks:
    - name: 创建 mysql 组
      group: name={{ groupname }} system=yes
    - name: 创建 nginx 用户
      user: name={{ username }} group={{ groupname }}

命令行传递变量:

bash 复制代码
ansible-playbook test.yaml -e "username=apache"

2. 条件判断(when)

使用 when 关键字实现条件执行,根据主机信息或变量值决定是否执行任务:

yaml 复制代码
- hosts: all
  tasks:
    - name: 仅在 192.168.10.14 执行关机
      command: /sbin/shutdown -r now
      when: ansible_default_ipv4.address == "192.168.10.14"

3. 迭代(loop/with_items)

通过 loopwith_items 实现循环操作,批量处理同类任务:

yaml 复制代码
- name: 批量创建目录和用户
  hosts: dbservers
  tasks:
    - name: 创建测试目录
      file:
        path: "{{ item }}"
        state: directory
      loop:
        - /tmp/test1
        - /tmp/test2

    - name: 创建带组的用户
      user: name={{ item.name }} groups={{ item.groups }}
      loop:
        - { name: 'test1', groups: 'wheel' }
        - { name: 'test2', groups: 'root' }

4. 模板(Templates)

利用 Jinja2 模板动态生成配置文件,步骤如下:

  1. 创建 .j2 模板文件(如 httpd.conf.j2):
ini 复制代码
Listen {{ http_port }}
ServerName {{ server_name }}
  1. 在主机清单定义变量:
ini 复制代码
[webservers]
192.168.10.14 http_port=80 server_name=www.example.com
  1. 在 Playbook 中使用 template 模块:
yaml 复制代码
- name: 部署 httpd 配置
  template:
    src: /opt/httpd.conf.j2
    dest: /etc/httpd/conf/httpd.conf
  notify: 重启 httpd

5. 标签(Tags)

通过 tags 标记任务,实现指定任务的执行:

yaml 复制代码
- hosts: webservers
  tasks:
    - name: 复制 hosts 文件
      copy: src=/etc/hosts dest=/opt/hosts
      tags: only

    - name: 创建测试文件
      file: path=/opt/test state=touch
      tags: always  # 始终执行

执行指定标签的任务:

bash 复制代码
ansible-playbook test.yaml --tags="only"

四、Roles 模块化组织

当 Playbook 变得复杂时,Roles 提供了模块化的组织方式,其目录结构如下:

复制代码
roles/
├── httpd/
│   ├── files/         # 静态文件
│   ├── templates/     # 模板文件
│   ├── tasks/         # 任务(main.yml 为主入口)
│   ├── handlers/      # 处理器
│   ├── vars/          # 变量
│   ├── defaults/      # 默认变量
│   └── meta/          # 依赖关系

使用 Roles 的步骤:

  1. 创建 Roles 目录结构(以 httpd 为例):
bash 复制代码
mkdir -p /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
touch /etc/ansible/roles/httpd/{tasks,handlers,vars}/main.yml
  1. 编写任务(tasks/main.yml):
yaml 复制代码
- name: 安装 httpd
  yum: name={{ pkg }} state=latest
- name: 启动 httpd
  service: name={{ svc }} state=started enabled=true
  1. 定义变量(vars/main.yml):
yaml 复制代码
pkg: httpd
svc: httpd
  1. 在 site.yml 中引用 Roles:
yaml 复制代码
---
- hosts: webservers
  roles:
    - httpd
    - mysql
  1. 运行 Playbook:
bash 复制代码
ansible-playbook /etc/ansible/site.yml

五、总结

Ansible Playbook 通过 YAML 格式的结构化配置,实现了运维任务的自动化与可复用。从简单的单任务执行,到利用变量、条件、迭代等功能处理复杂场景,再到通过 Roles 实现模块化管理,Playbook 为自动化运维提供了灵活而强大的支持。掌握 Playbook 的编写技巧,能显著提升运维效率,减少人为操作失误,是 DevOps 实践中的重要工具。

相关推荐
m0_464608262 小时前
Ansible实现自动化运维
运维·自动化·ansible
小白不想白a2 小时前
【Ansible】使用ansible部署k8s集群前的准备工作脚本
容器·kubernetes·ansible
m0_464608262 小时前
Ansible Playbook:自动化配置管理的利器
运维·自动化·ansible
乌萨奇也要立志学C++3 小时前
【Linux】进程概念(六):进程地址空间深度解析:虚拟地址与内存管理的奥秘
linux·运维
月殇_木言7 小时前
Linux 线程
linux
wangjialelele7 小时前
Linux中的线程
java·linux·jvm·c++
tritone9 小时前
我在阿贝云免费服务器上搭建RustDesk自建服务器(Self-Hosting)的真实体验【推荐】
运维·服务器
2301_800050999 小时前
DNS 服务器
linux·运维·笔记
Lin_Aries_04219 小时前
容器化简单的 Java 应用程序
java·linux·运维·开发语言·docker·容器·rpc