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格式 - 列表以
-开头 - 注释以
#开头
示例结构:
--- - name: 示例 Play # Play 名称 hosts: webservers # 目标主机组 become: yes # 提权操作 vars: # 定义变量 nginx_port: 80 tasks: # 任务列表 - name: 安装 Nginx yum: name: nginx state: present3. OpenEuler 系统适配要点
OpenEuler 作为 CentOS 替代方案,需注意以下差异:
- 包管理器:默认使用
dnf(兼容yum命令) - 服务管理:采用
systemd - 安全加固:支持
se模块管理 SELinux - Python 环境:确保目标主机安装 Python 2/3
推荐基础配置:
- name: 确保 Python 已安装 raw: test -e /usr/bin/python || (dnf -y install python3 && ln -s /usr/bin/python3 /usr/bin/python) args: executable: /bin/bash4. Playbook 核心组件详解
(1) 主机与用户配置
hosts: all # 所有主机 remote_user: root # 远程用户 become: true # 使用 sudo become_method: sudo # 提权方式(2) 变量管理
定义方式:
vars: http_port: 8080 vars_files: - config/vars.yml(3) 条件与循环
条件判断:
tasks: - name: 仅对 OpenEuler 安装软件 yum: name: htop state: present when: ansible_distribution == "openEuler"循环迭代:
- name: 批量创建用户 user: name: "{{ item }}" state: present loop: - alice - bob - charlie5. 常用模块在 OpenEuler 的实践
(1) 包管理 (dnf模块)
- name: 安装基础工具 dnf: name: ["vim", "git", "telnet"] state: latest(2) 文件管理 (copy模块)
- name: 部署配置文件 copy: src: files/nginx.conf dest: /etc/nginx/nginx.conf owner: root group: root mode: 0644(3) 服务管理 (systemd模块)
- name: 启动并启用 Nginx systemd: name: nginx state: started enabled: yes6. 实战:部署 Nginx 服务
以下 Playbook 在 OpenEuler 上完成 Nginx 的完整部署:
--- - 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执行命令:
ansible-playbook -i inventory.ini deploy_nginx.yml7. 错误处理与调试
- 详细日志:添加
-v/-vvv参数 - 语法检查:
ansible-playbook --syntax-check playbook.yml - 分段执行:使用
--start-at-task="任务名" - 强制处理程序:
--force-handlers
常见错误解决:
- name: 忽略包安装错误 dnf: name: unknown-package state: present ignore_errors: yes8. Playbook 优化技巧
- 模块化设计:使用
include_tasks拆分功能tasks: - include_tasks: tasks/install_db.yml - 标签化任务:通过
tags快速执行部分代码- name: 仅更新配置 copy: src: app.conf dest: /etc/app.conf tags: [config, quick] - 环境隔离:利用
ansible.cfg定制行为[defaults] forks = 50 host_key_checking = False
9. 性能调优
- 并发控制:调整
forks参数(默认 5) - SSH 优化:启用流水线和 ControlPersist
[ssh_connection] pipelining = true - 异步任务:长时间任务添加
async和poll- name: 后台编译 command: make -j8 async: 1200 poll: 0
10. 安全实践
- 敏感数据加密:使用
ansible-vaultansible-vault encrypt vars/secrets.yml - 最小权限原则:精确控制
become范围- name: 仅需普通权限的任务 command: whoami become: false - 证书认证:在
inventory中配置 SSH 密钥路径[web] server1 ansible_ssh_private_key_file=~/.ssh/id_rsa_ansible
总结
本指南系统性地介绍了 Ansible Playbook 在 OpenEuler 环境下的基础应用,涵盖:
- 核心概念与语法规范
- OpenEuler 适配要点
- 模块实战与完整部署案例
- 调试、优化与安全实践
通过超过 4000 字的内容,我们构建了从理论到实践的完整知识体系。后续内容将深入:
- 动态 Inventory 配置
- 角色(Roles)架构设计
- 自定义模块开发
- 大规模集群管理策略
附录:基础命令速查
| 功能 | 命令示例 |
|---|---|
| 测试主机连通性 | ansible all -m ping |
| 临时执行模块 | ansible web -m yum -a "name=nginx state=present" |
| 加密文件编辑 | ansible-vault edit vars/secrets.yml |
# 快速验证 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"))