第五章:Ansible 实操
本章聚焦于 Ansible 的动手实践,从核心的 Playbook 编写到进阶的角色应用,旨在通过具体案例,让读者熟练掌握使用 Ansible 进行自动化部署和管理的能力。
第1节:Ansible Playbook 核心实践
5.1 Playbook 结构与核心组件
-
Playbook 结构: 再次强调,Playbook 是由一个或多个 Play 组成的 YAML 文件。每个 Play 的核心是
hosts
和tasks
。 -
核心组件实践:
handlers
和notify
是实现服务状态管理的常用组合。notify
: 在一个task
中,如果其状态发生了改变(例如,配置文件被更新),它可以通过notify
指令触发一个或多个handler
。handlers
:handler
本质上也是一个task
,但它只有在被notify
触发时才会执行。这确保了服务只在必要时才重启,避免了不必要的服务中断。
示例:更新 Nginx 配置并重启服务
- hosts: webservers
tasks:
- name: Copy nginx config file
copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
notify: Restart Nginx
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
5.2 模块应用
- 掌握常用模块: 熟练使用
copy
,template
,file
,yum
/apt
,service
,command
,shell
等模块是编写 Playbook 的基础。 template
vscopy
:copy
模块只是简单地复制文件,而template
模块会使用 Jinja2 模板引擎对文件进行渲染,将变量替换为实际值后再复制到目标主机。这在需要为不同主机生成不同配置文件时非常有用。
5.3 变量与调试
- 变量定义与作用域: 掌握在不同位置(
vars
块、vars_files
、group_vars
/host_vars
、命令行)定义变量的方法及其优先级。 - 基础调试技巧:
-
-v
,-vv
,-vvv
: 增加 Ansible 输出的详细程度,帮助定位问题。 -
--check
(Check Mode): “演习”模式。Ansible 会检查任务将要做的更改,但不会实际执行它们。 -
--diff
: 当文件内容发生变化时,显示具体的差异。 -
debug
模块: 在 Playbook 中打印变量的值或自定义信息,是调试的利器。- name: Debug OS Family
debug:
var: ansible_facts['os_family']
-
5.4 实践案例:自动化部署 Nginx
- 目标: 编写一个 Playbook,完成在指定主机上安装 Nginx、推送自定义首页、并启动服务的全过程。
- 步骤:
- 安装 Ansible: 在控制节点上安装 Ansible。
- 创建 Inventory: 定义要管理的
webservers
主机组。 - 创建 Playbook (
deploy_nginx.yml
):- 使用
yum
或apt
模块安装 Nginx。 - 使用
copy
或template
模块将一个自定义的index.html
文件部署到 Nginx 的网站根目录。 - 使用
service
模块确保 Nginx 服务已启动并设置为开机自启。
- 使用
- 应用条件判断 (
when
): 可以在 Playbook 中加入when
条件,使其能够同时兼容 CentOS 和 Ubuntu 系统(例如,根据ansible_facts['os_family']
的值选择使用yum
还是apt
模块)。
第2节:Ansible 进阶应用与角色实践
5.5 角色核心与结构
- 角色核心作用: 解耦和复用。将一个复杂的部署任务(如部署一个 LAMP 应用)分解为多个独立的角色(如
apache
,mysql
,php
),使 Playbook 更加清晰、易于管理和分享。 - 掌握标准化目录结构: 严格遵循官方推荐的角色目录结构是编写高质量角色的前提。
5.6 ansible-galaxy
ansible-galaxy
: 是 Ansible 官方的用于管理角色的命令行工具。ansible-galaxy init <role_name>
: 快速创建一个符合标准结构的角色骨架。ansible-galaxy install <role_name>
: 从 Ansible Galaxy 社区或其他 Git 仓库安装别人分享的角色。ansible-galaxy list
: 列出已安装的角色。
5.7 协同工作与调用
- 协同工作: 理解角色内部各部分(
tasks
,vars
,templates
,handlers
)是如何协同工作的。例如,tasks/main.yml
中的任务可以notify
handlers/main.yml
中的处理器,并使用vars/main.yml
中定义的变量和templates/
目录下的模板。 - 调用方法: 掌握在主 Playbook 中通过
roles:
列表调用一个或多个角色的方法。理解角色的执行顺序以及变量的覆盖关系。
5.8 实践案例:创建 Nginx 角色并管理定时任务
- 目标: 将上一节的 Nginx 部署 Playbook 改造为一个标准化的角色,并使用
cron
模块添加一个定时任务。 - 步骤:
-
创建角色: 使用
ansible-galaxy init nginx_role
创建角色骨架。 -
组织角色内容:
- 将安装、配置、启停 Nginx 的任务写入
nginx_role/tasks/main.yml
。 - 如果需要,将 Nginx 配置文件模板放入
nginx_role/templates/
。 - 将重启 Nginx 的 handler 放入
nginx_role/handlers/main.yml
。
- 将安装、配置、启停 Nginx 的任务写入
-
创建主 Playbook 调用角色: 创建一个新的 Playbook,使用
roles:
关键字调用nginx_role
。 -
使用
cron
模块: 在角色的tasks/main.yml
中,增加一个新任务,使用cron
模块来创建一个定时任务(例如,每天定时备份 Nginx 日志)。- name: Add cron job for log rotation
cron:
name: "Rotate Nginx Logs"
minute: "0"
hour: "2"
job: "/usr/sbin/logrotate /etc/logrotate.d/nginx"
-