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 优化技巧
-
模块化设计 :使用
include_tasks拆分功能bashtasks: - include_tasks: tasks/install_db.yml -
标签化任务 :通过
tags快速执行部分代码bash- name: 仅更新配置 copy: src: app.conf dest: /etc/app.conf tags: [config, quick] -
环境隔离 :利用
ansible.cfg定制行为bash[defaults] forks = 50 host_key_checking = False
9. 性能调优
-
并发控制 :调整
forks参数(默认 5) -
SSH 优化 :启用流水线和 ControlPersist
bash[ssh_connection] pipelining = true -
异步任务 :长时间任务添加
async和pollbash- name: 后台编译 command: make -j8 async: 1200 poll: 0
10. 安全实践
-
敏感数据加密 :使用
ansible-vaultbashansible-vault encrypt vars/secrets.yml -
最小权限原则 :精确控制
become范围bash- name: 仅需普通权限的任务 command: whoami become: false -
证书认证 :在
inventory中配置 SSH 密钥路径bash[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 |
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"))