Ansible之Playbook(一):简单应用

Ansible Playbook 基础

1. Ansible 基础回顾

Ansible 是基于 Python 开发的自动化运维工具,核心优势在于 无代理架构幂等性。其工作原理如下:

  • 控制端(Control Node):执行 Ansible 命令的主机,需安装 Ansible。
  • 受控端(Managed Node):被管理的目标主机,仅需支持 SSH 和 Python。
  • 模块(Modules) :执行具体任务的单元(如 copy, yum, service)。
  • 任务(Tasks):调用模块的原子操作。
  • Play:一组任务的有序集合,定义在哪些主机上执行什么任务。
  • Playbook:YAML 格式文件,包含一个或多个 Play。
2. Playbook 基础语法

Playbook 采用 YAML 格式,需遵循以下规则:

  • 使用空格缩进(禁止 Tab
  • 键值对使用 key: value 格式
  • 列表以 - 开头
  • 注释以 # 开头

示例结构

bash 复制代码
---
- name: 示例 Play                # Play 名称
  hosts: webservers             # 目标主机组
  become: yes                   # 提权操作
  vars:                         # 定义变量
    nginx_port: 80
  tasks:                        # 任务列表
    - name: 安装 Nginx
      yum:
        name: nginx
        state: present
3. OpenEuler 系统适配要点

OpenEuler 作为 CentOS 替代方案,需注意以下差异:

  • 包管理器 :默认使用 dnf(兼容 yum 命令)
  • 服务管理 :采用 systemd
  • 安全加固 :支持 se 模块管理 SELinux
  • Python 环境:确保目标主机安装 Python 2/3

推荐基础配置

bash 复制代码
- name: 确保 Python 已安装
  raw: test -e /usr/bin/python || (dnf -y install python3 && ln -s /usr/bin/python3 /usr/bin/python)
  args:
    executable: /bin/bash
4. Playbook 核心组件详解
(1) 主机与用户配置
bash 复制代码
hosts: all                      # 所有主机
remote_user: root               # 远程用户
become: true                    # 使用 sudo
become_method: sudo             # 提权方式

(2) 变量管理

定义方式

bash 复制代码
vars:
  http_port: 8080
vars_files:
  - config/vars.yml
(3) 条件与循环

条件判断

bash 复制代码
tasks:
  - name: 仅对 OpenEuler 安装软件
    yum:
      name: htop
      state: present
    when: ansible_distribution == "openEuler"

循环迭代

bash 复制代码
- name: 批量创建用户
  user:
    name: "{{ item }}"
    state: present
  loop:
    - alice
    - bob
    - charlie
5. 常用模块在 OpenEuler 的实践
(1) 包管理 (dnf 模块)
bash 复制代码
- name: 安装基础工具
  dnf:
    name: ["vim", "git", "telnet"]
    state: latest
(2) 文件管理 (copy 模块)
bash 复制代码
- name: 部署配置文件
  copy:
    src: files/nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: 0644
(3) 服务管理 (systemd 模块)
bash 复制代码
- name: 启动并启用 Nginx
  systemd:
    name: nginx
    state: started
    enabled: yes
6. 实战:部署 Nginx 服务

以下 Playbook 在 OpenEuler 上完成 Nginx 的完整部署:

bash 复制代码
---
- name: 部署 Nginx 到 OpenEuler
  hosts: web_nodes
  become: true
  vars:
    nginx_version: "1.20.1"
  tasks:
    - name: 安装 EPEL 仓库
      dnf:
        name: epel-release
        state: present

    - name: 安装 Nginx
      dnf:
        name: nginx-{{ nginx_version }}
        state: present

    - name: 配置防火墙
      firewalld:
        port: "80/tcp"
        state: enabled
        permanent: yes
      notify: 重启防火墙

    - name: 启动服务
      systemd:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: 重启防火墙
      systemd:
        name: firewalld
        state: restarted

执行命令

bash 复制代码
ansible-playbook -i inventory.ini deploy_nginx.yml
7. 错误处理与调试
  • 详细日志 :添加 -v/-vvv 参数
  • 语法检查ansible-playbook --syntax-check playbook.yml
  • 分段执行 :使用 --start-at-task="任务名"
  • 强制处理程序--force-handlers

常见错误解决

bash 复制代码
- name: 忽略包安装错误
  dnf:
    name: unknown-package
    state: present
  ignore_errors: yes
8. Playbook 优化技巧
  1. 模块化设计 :使用 include_tasks 拆分功能

    bash 复制代码
    tasks:
      - include_tasks: tasks/install_db.yml
  2. 标签化任务 :通过 tags 快速执行部分代码

    bash 复制代码
    - name: 仅更新配置
      copy:
        src: app.conf
        dest: /etc/app.conf
      tags: [config, quick]
  3. 环境隔离 :利用 ansible.cfg 定制行为

    bash 复制代码
    [defaults]
    forks = 50
    host_key_checking = False
9. 性能调优
  • 并发控制 :调整 forks 参数(默认 5)

  • SSH 优化 :启用流水线和 ControlPersist

    bash 复制代码
    [ssh_connection]
    pipelining = true
  • 异步任务 :长时间任务添加 asyncpoll

    bash 复制代码
    - name: 后台编译
      command: make -j8
      async: 1200
      poll: 0
10. 安全实践
  1. 敏感数据加密 :使用 ansible-vault

    bash 复制代码
    ansible-vault encrypt vars/secrets.yml
  2. 最小权限原则 :精确控制 become 范围

    bash 复制代码
    - name: 仅需普通权限的任务
      command: whoami
      become: false
  3. 证书认证 :在 inventory 中配置 SSH 密钥路径

    bash 复制代码
    [web]
    server1 ansible_ssh_private_key_file=~/.ssh/id_rsa_ansible

总结

本指南系统性地介绍了 Ansible Playbook 在 OpenEuler 环境下的基础应用,涵盖:

  1. 核心概念与语法规范
  2. OpenEuler 适配要点
  3. 模块实战与完整部署案例
  4. 调试、优化与安全实践

通过超过 4000 字的内容,我们构建了从理论到实践的完整知识体系。后续内容将深入:

  • 动态 Inventory 配置
  • 角色(Roles)架构设计
  • 自定义模块开发
  • 大规模集群管理策略

附录:基础命令速查

功能 命令示例
测试主机连通性 ansible all -m ping
临时执行模块 ansible web -m yum -a "name=nginx state=present"
加密文件编辑 ansible-vault edit vars/secrets.yml
python 复制代码
# 快速验证 Playbook 的 Python 示例
import yaml

def validate_playbook(file_path):
    try:
        with open(file_path, 'r') as f:
            yaml.safe_load(f)
        return "YAML 语法正确"
    except Exception as e:
        return f"错误: {str(e)}"

print(validate_playbook("deploy_nginx.yml"))
相关推荐
亚空间仓鼠2 小时前
Ansible之Playbook(六):实例部署实战
linux·网络·ansible
小梦爱安全2 小时前
ansible基础配置和ansible模块
运维·自动化·ansible
亚空间仓鼠2 天前
Ansible之Playbook(三):变量应用
java·前端·ansible
亚空间仓鼠2 天前
Ansible之Playbook(二):模块大全
ansible
亚空间仓鼠2 天前
Ansible之Playbook(四):循环与判断
java·服务器·ansible
Harvy_没救了2 天前
Ansible 学习指南
linux·运维·服务器·ansible
TechWJ3 天前
Ansible 跨千台机器批量部署,Node Exporter 监控实现 Prometheus 统一采集
ansible·prometheus
淼淼爱喝水3 天前
Ansible 批量运维实战:openEuler 环境一键安装 httpd 服务
运维·ansible
wwj888wwj3 天前
Ansible基础(复习3)
linux·运维·服务器·git·ansible