Ansible Playbook 是实现批量、可重复管理任务的核心工具。
一、创建 Ansible Inventory(清单)
Inventory 是 Ansible 识别受管主机的核心配置,它定义了 "管理哪些主机",支持静态与动态两种形式,日常操作中以静态清单为主。
1.1 清单核心概念
-
主机可归属一个或多个组,组通常按主机角色(如 web 服务器、数据库服务器)或地理位置(如东部数据中心、西部数据中心)划分。
-
静态清单以 INI 或 YAML 格式存储;动态清单从云提供商、LDAP 数据库等外部来源生成。
1.2 静态清单配置规则
-
组名用方括号
[]
标识,组内主机以主机名或 IP 地址列出,每行一个条目。 -
支持 "组嵌套",通过
:children
后缀实现,例如将usa
和canada
组归入north-america
组。 -
可通过
[START:END]
语法简化主机列表,如server[01:20].example.com
匹配 20 台服务器,192.168.[4:7].[0:255]
匹配 4 个网段。
1.3 清单验证与路径设置
-
默认静态清单路径为
/etc/ansible/hosts
,但推荐在工作目录中自定义,并通过ansible-navigator run -i 路径
指定。 -
验证命令:
ansible-navigator inventory -m stdout --list
列出所有主机,--graph 组名
查看组内主机,--host 主机名
验证单主机是否在清单中。
二、管理 Ansible 配置文件
配置文件控制 Ansible 的行为与连接方式,核心文件包括ansible.cfg
(Ansible 核心配置)和ansible-navigator.yml
(导航器配置),需掌握优先级与关键参数设置。
2.1 核心配置文件与优先级
-
ansible.cfg
优先级:项目目录 > 用户主目录(~/.ansible.cfg
) > 系统默认(/etc/ansible/ansible.cfg
),Ansible 仅使用最高优先级文件的设置。 -
查看当前生效配置:执行
ansible --version
或ansible -v
,可显示当前使用的配置文件路径。
2.2 关键配置参数
ansible.cfg
主要包含[defaults]
和[privilege_escalation]
两个 section,核心参数如下:
参数 | 作用 |
---|---|
inventory |
指定清单文件路径,如./inventory |
remote_user |
连接受管主机的用户名,默认与控制节点当前用户一致 |
ask_pass |
是否提示输入 SSH 密码,使用 SSH 公钥时设为false |
become |
是否自动提权,设为true 时默认切换到 root |
become_method |
提权方式,默认sudo ,可选su |
become_ask_pass |
是否提示输入提权密码,默认false |
2.3 导航器配置(ansible-navigator.yml)
-
格式支持 JSON 或 YAML,用于配置执行环境(如容器镜像)和 Playbook 工件生成。
-
示例配置:指定容器镜像
utility.lab.example.com/ee-supported-rhel8:latest
,禁用 Playbook 工件生成(需输入密码时必须禁用)。
2.4 连接与提权优化
-
推荐提前配置 SSH 免密登录,通过
ssh-copy-id 用户名@受管主机
分发公钥,避免重复输入密码。 -
安全最佳实践:不在
ansible.cfg
全局开启become: true
,而是在单个 Play 中按需设置,减少权限滥用风险。
三、编写和执行 Playbook
Playbook 是 YAML 格式的任务集合,一个 Playbook 可包含多个 Play,每个 Play 针对特定主机组执行任务,需掌握格式规则、模块选择与执行命令。
3.1 Playbook 核心概念
-
Play :包含
name
(描述)、hosts
(目标主机组)、tasks
(任务列表)三大核心字段,按顺序执行任务。 -
Task :通过 "模块 + 参数" 实现具体操作,如用
ansible.builtin.dnf
安装软件、ansible.builtin.service
管理服务。 -
幂等性 :多数模块支持幂等(如
state: present
),重复执行时仅在主机状态不匹配时修改,避免重复操作。
3.2 YAML 格式规则
-
缩进:仅用空格(不可用 Tab),同级元素缩进一致,子元素比父元素多缩进 2 个空格。
-
文档标记:开头用
---
标识文档开始,结尾...
可省略;列表项用- 空格
开头,如tasks
下的多个任务。 -
字符串:可不加引号,含特殊字符时用单 / 双引号;多行字符串用
|
保留换行,用>
将换行转为空格。
3.3 模块选择与文档查询
-
模块分类:按功能分为文件(
copy
/file
)、软件(dnf
/apt
)、系统(service
/user
)、网络(get_url
)等类别,优先使用ansible.builtin
内置模块。 -
文档查询:
ansible-navigator doc 模块名
查看详细文档,-l
列出所有模块,-s
显示模块参数摘要;也可访问Ansible 官方文档获取示例。 -
特殊场景:无对应模块时,可用
ansible.builtin.command
(无 shell 特性)或ansible.builtin.shell
(支持管道 / 变量)执行自定义命令,但需谨慎使用(非幂等)。
3.4 执行与验证命令
操作 | 命令 | 说明 |
---|---|---|
语法检查 | ansible-navigator run -m stdout 文件名 --syntax-check |
仅验证格式,不执行任务 |
空运行(预演) | ansible-navigator run -m stdout 文件名 --check |
模拟执行,显示预期变更,不实际修改 |
执行 | ansible-navigator run -m stdout 文件名 |
实际执行,-v /-vv /-vvv 可增加输出详细度 |
查看结果 | PLAY RECAP | 输出中显示ok (成功)、changed (变更)、failed (失败)数量 |
四、实施 Multiple Plays(多 Play)
当需对不同主机组执行不同任务时,可在一个 Playbook 中编写多个 Play,实现 "一次执行,多组管理",需注意远程用户与提权的灵活配置。
4.1 多 Play 编写示例
一个 Playbook 可包含多个 Play,每个 Play 独立设置hosts
和tasks
,例如:
yaml
---
- name: 配置Web服务器
hosts: webservers
tasks:
- name: 安装httpd
ansible.builtin.dnf:
name: httpd
state: latest
- name: 启动httpd服务
ansible.builtin.service:
name: httpd
state: started
enabled: true
- name: 配置数据库服务器
hosts: db-servers
tasks:
- name: 安装mariadb
ansible.builtin.dnf:
name: mariadb-server
state: latest
- name: 启动mariadb服务
ansible.builtin.service:
name: mariadb
state: started
enabled: true
4.2 按 Play 配置用户与提权
-
每个 Play 可单独设置
remote_user
(覆盖全局配置)和提权参数,例如对数据库服务器使用高权限用户:yaml
- name: 管理数据库配置 hosts: db-servers remote_user: dbadmin become: true become_user: root tasks: - name: 修改数据库配置文件 ansible.builtin.file: path: /etc/my.cnf owner: root group: root
总结
本章核心是 "从配置到执行" 的全流程:通过 Inventory 定义管理范围,用配置文件优化连接与提权,以 Playbook 实现任务自动化,最终通过
ansible-navigator
验证与执行。实践建议:
从简单任务入手,如 "安装软件 + 启动服务",熟悉 YAML 格式与模块参数。
优先使用幂等模块,避免直接用
shell
命令,确保 Playbook 可重复执行。定期验证清单与配置文件,通过
--check
预演执行结果,减少生产环境风险。