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"))
相关推荐
Hy行者勇哥4 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
芷栀夏6 天前
飞牛NAS怎么部署Immich?家庭照片自动备份与远程访问教程
服务器·nginx·ansible
悠然南风16 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠25 天前
ansible编辑
网络·ansible
芳心粽伙饭1 个月前
Ansible课后作业
ansible
烁3471 个月前
Ansible初识
ansible
烁3471 个月前
Ansible安装部署调试
ansible
烁3471 个月前
Ansible命令
ansible
小义_1 个月前
【Ansible】(三)基础配置与连接设置
云原生·ansible
炸炸鱼.1 个月前
Ansible 企业级实战:Playbook 与 Roles 完全指南
网络·ansible