Ansible 实战:运行、调试与故障排查
一、运行 Playbook
1. 逐步执行 Playbook
使用命令
ansible-playbook --step exercise111.yaml
逐步执行 Playbook 的所有任务。按
y
确认第一步,然后按
c
自动继续。此 Playbook 会在复制模板文件任务时失败,因为目标目录不存在。需注意,
--syntax-check
和
--check
选项不会检查 Playbook 中的逻辑错误,因此未能检测到该问题。
2. 编辑 Playbook 文件
编辑
exercise111.yaml
文件,确保模板任务包含以下修正行(替换以
dest:
开头的旧行):
dest: /etc/httpd/conf/httpd.conf
3. 列出 Playbook 任务
使用命令
ansible-playbook --list-tasks exercise111.yaml
列出 Playbook 中的所有任务。
4. 从指定任务开始运行 Playbook
为避免再次运行整个 Playbook,可使用
ansible-playbook --start-at-task="copy template file" exercise111.yaml
从指定任务开始运行 Playbook 直至完成。
二、使用模块进行故障排查
1. 故障排查模块概述
| 模块名称 | 用途 |
|---|---|
| debug | 可视化 Playbook 中某一点的情况,分析变量行为 |
| uri | 检查 Web 服务器是否可用,或检查 API 端点的可访问性和返回信息 |
| stat | 检查文件状态 |
| assert | 执行特定条件操作,根据条件判断任务是否成功 |
2. 使用 debug 模块
debug
模块有两个参数:
msg
参数用于打印消息,
var
参数用于打印变量的值。使用
var
参数时,无需使用
{{ varname }}
结构,直接使用
varname
即可;若在
msg
参数中使用变量,则需使用
{{ varname }}
语法。
3. 使用 uri 模块
以下是使用
uri
模块的示例:
---
- name: test webserver access
hosts: localhost
become: no
tasks:
- name: connect to the web server
uri:
url: http://ansible2.example.com
return_content: yes
register: this
failed_when: "’welcome’ not in this.content"
- debug:
var: this.content
该 Playbook 使用
uri
模块连接到 Web 服务器,
return_content
参数捕获 Web 服务器内容并存储在变量中,
failed_when
语句在注册变量中不包含 “welcome” 时使模块失败,最后使用
debug
模块显示变量内容。
4. 使用 stat 模块
stat
模块可用于检查文件状态,但并非用于大规模文件系统完整性检查的工具。若需要大规模文件系统完整性检查,应使用 Linux 实用工具如
aide
。以下是使用
stat
模块的示例:
---
- name: create a file
hosts: all
tasks:
- file:
path: /tmp/statfile
state: touch
owner: ansible
- name: check file status
hosts: all
tasks:
- stat:
path: /tmp/statfile
register: stat_out
- fail:
msg: "/tmp/statfile file owner not as expected"
when: stat_out.stat.pw_name != ’root’
此示例中,先创建一个文件,然后使用
stat
模块检查文件状态,若文件所有者不是
root
,则使用
fail
模块使 Playbook 失败。
5. 使用 assert 模块
assert
模块类似于
fail
模块,可执行特定条件操作。它使用
that
选项定义条件列表,若任何一个条件为
false
,任务失败;若所有条件为
true
,任务成功。根据任务的成功或失败,模块使用
success_msg
或
fail_msg
选项打印消息。以下是使用
assert
模块的示例:
---
- hosts: localhost
vars_prompt:
- name: filesize
prompt: "specify a file size in megabytes"
tasks:
- name: check if file size is valid
assert:
that:
- "{{ (filesize | int) <= 100 }}"
- "{{ (filesize | int) >= 1 }}"
fail_msg: "file size must be between 0 and 100"
success_msg: "file size is good, let\’s continue"
- name: create a file
command: dd if=/dev/zero of=/bigfile bs=1 count={{ filesize }}
此示例中,使用
vars_prompt
定义变量
filesize
,使用
assert
模块检查文件大小是否在 1 到 100 之间,由于
vars_prompt
定义的变量默认类型为字符串,因此使用 Jinja2 过滤器
int
将其转换为整数。
6. 练习:使用模块进行故障排查
以下是使用模块进行故障排查的练习步骤:
1. 打开编辑器创建
exercise112.yaml
文件并定义 Playbook 头:
---
- name: using assert to check if volume gr
oup vgdata exists
hosts: all
tasks:
-
添加一个任务,使用
vgs vgdata命令检查名为vgdata的卷组是否存在,使用register注册命令结果,并在不存在时继续执行:
- name: check if vgdata exists
command: vgs vgdata
register: vg_result
ignore_errors: true
-
包含一个
debug任务,显示变量的值:
- name: show vg_result variable
debug:
var: vg_result
-
添加一个任务,根据第一个任务中
vgs命令的结果打印成功或失败消息:
- name: print a message
assert:
that:
- vg_result.rc == 0
fail_msg: volume group not found
success_msg: volume group was found
-
使用命令
ansible-playbook exercise112.yaml验证其内容,若未找到 LVM 卷组vgdata,应打印 “volume group not found”。 -
修改 Playbook,使其运行
vgs cl命令,在 CentOS 8 上应给出肯定结果,验证是否会打印success_msg。
三、使用标签
1. 标签的使用
在使用较大的 Playbook 时,Ansible 允许使用
tags
属性。标签是应用于任务、块或 Play 的标签,使用
ansible-playbook --tags
或
ansible-playbook --skip-tags
命令可指定要执行的标签。以下是使用标签的简单 Playbook 示例:
---
- name: using tags example
hosts: all
vars:
service:
- vsftpd
- httpd
tasks:
- yum:
name:
- httpd
- vsftpd
state: present
tags:
- install
- service:
name: "{{ item }}"
state: started
enabled: yes
loop: "{{ services }}"
tags:
- services
使用
ansible-playbook --tags "install" listing1115.yaml
命令可只执行带有
install
标签的任务。
2. 列出任务和标签
使用
ansible-playbook --list-tasks --list-tags
命令可获取任务和标签的概述。例如:
[ansible@control rhce8-book]$ ansible-playbook --list-tags --list-tasks listing1115.yaml
playbook: listing1115.yaml
play #1 (all): using tags example. TAGS: []
tasks:
yum. TAGS: [install]
service. TAGS: [services]
TASK TAGS: [install, services]
3. 特殊标签
除了普通标签,还有一些特殊标签,如下表所示:
| 标签名称 | 用途 |
| ---- | ---- |
| all | 执行所有任务 |
| never | 除非明确请求,否则不执行任务 |
| debug | 用于标记调试任务 |
4. 练习:使用标签简化调试
以下是使用标签简化调试的练习步骤:
1. 重写之前创建的
exercise112.yaml
Playbook,在
debug
任务中包含
tags: [never, debug ]
行:
---
- name: using assert to check if volume gr
oup vgdata exists
hosts: all
tasks:
- name: check if vgdata exists
command: vgs vgdata
register: vg_result
ignore_errors: true
- name: show vg_result variable
debug:
var: vg_result
tags: [ never, debug ]
- name: print a message
assert:
that:
- vg_result.rc == 0
fail_msg: volume group not found
success_msg: volume group was found
-
使用
ansible-playbook --tags all exercise113.yaml命令运行 Playbook,注意不会运行debug任务。 -
使用
ansible-playbook --tags all,debug exercise113.yaml命令运行 Playbook,注意此时会运行debug任务。
四、故障排查常见场景
1. 分析连接问题
要连接到受管主机,需要满足以下条件:
- 具有 IP 网络连接。
- 远程主机上的 SSH 服务可访问。
- 安装了 Python。
- 配置了权限提升。
此外,还可通过
ansible_host
参数指定如何连接到远程主机。可使用
ping
模块测试与远程主机的连接,该模块检查 IP 连接、SSH 服务可访问性、sudo 权限提升和 Python 栈的可用性,且无需任何参数。以下是使用
ping
模块的示例:
[ansible@control rhce8-book]$ ansible all -m ping
ansible2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
ansible1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
ansible3 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
ansible4 | FAILED! => {
"msg": "Missing sudo password"
}
2. 分析认证问题
在远程主机上执行任务时,以下设置会影响认证:
-
remote_user
设置确定在受管节点上使用的用户账户。
- 为
remote_user
配置 SSH 密钥以实现平滑认证。
-
become
参数需设置为
true
。
-
become_user
需设置为
root
用户账户。
- 正确设置 Linux sudo。
3. 练习:故障排查连接问题
以下是故障排查连接问题的练习步骤:
1. 使用编辑器创建
exercise114-1.yaml
文件并添加以下内容:
---
- name: remove user from wheel group
hosts: ansible4
tasks:
- user:
name: ansible
groups: ’’
-
使用
ansible-playbook exercise114-1.yaml命令运行 Playbook,并使用ansible ansible4 -m reboot命令重启节点ansible4。 -
重启完成后,使用
ansible all -m ping命令验证连接,主机ansible4应给出 “Missing sudo password” 错误。 -
输入
ansible ansible4 -m raw -a “usermod -aG wheel ansible” -u root -k命令,将用户ansible添加到wheel组。
通过以上步骤,我们可以深入了解 Ansible 的运行、调试和故障排查方法,提高工作效率和系统稳定性。
五、Ansible 操作流程总结
1. 运行 Playbook 流程
graph LR
A[开始] --> B[逐步执行 Playbook]
B --> C{是否失败}
C -- 是 --> D[编辑 Playbook 文件]
C -- 否 --> E[列出 Playbook 任务]
D --> E
E --> F[从指定任务开始运行 Playbook]
F --> G[结束]
2. 故障排查模块使用流程
| 模块 | 使用步骤 |
|---|---|
| debug |
1. 确定要分析的变量;2. 使用
debug
模块,根据需要选择
msg
或
var
参数
|
| uri |
1. 确定要检查的 Web 服务器或 API 端点;2. 使用
uri
模块连接并获取内容;3. 使用
failed_when
语句判断结果;4. 使用
debug
模块显示内容
|
| stat |
1. 确定要检查的文件;2. 使用
stat
模块检查文件状态;3. 使用
when
语句判断文件状态是否符合预期;4. 根据需要使用
fail
模块
|
| assert |
1. 确定要检查的条件;2. 使用
assert
模块,定义
that
条件列表;3. 设置
fail_msg
和
success_msg
|
3. 使用标签操作流程
graph LR
A[开始] --> B[定义 Playbook 并添加标签]
B --> C{选择执行方式}
C -- 执行指定标签 --> D[使用 ansible-playbook --tags 命令]
C -- 跳过指定标签 --> E[使用 ansible-playbook --skip-tags 命令]
D --> F[列出任务和标签]
E --> F
F --> G[结束]
六、常见问题及解决方案
1. Playbook 运行失败问题
| 问题描述 | 可能原因 | 解决方案 |
|---|---|---|
| 复制模板文件任务失败 | 目标目录不存在 | 编辑 Playbook 文件,修正目标目录路径 |
| 任务因条件不满足失败 | 变量类型不匹配、条件逻辑错误 | 使用 Jinja2 过滤器转换变量类型,检查条件逻辑 |
2. 连接和认证问题
| 问题描述 | 可能原因 | 解决方案 |
|---|---|---|
| 无法连接到远程主机 | IP 网络问题、SSH 服务不可用、Python 未安装、权限提升未配置 | 检查网络连接,确保 SSH 服务正常,安装 Python,配置权限提升 |
| 认证失败 |
remote_user
设置错误、SSH 密钥未配置、
become
参数未设置、
become_user
未设置为
root
、sudo 未正确设置
|
检查
remote_user
设置,配置 SSH 密钥,设置
become
参数为
true
,设置
become_user
为
root
,正确配置 sudo
|
七、总结
通过对 Ansible 的运行、调试和故障排查的学习,我们掌握了一系列实用的技巧和方法。在运行 Playbook 时,我们可以逐步执行、编辑文件、选择从指定任务开始,提高效率。故障排查模块如
debug
、
uri
、
stat
和
assert
为我们解决各种问题提供了有力工具。标签的使用让我们能够灵活控制任务的执行,特殊标签更方便了调试工作。同时,我们也学会了分析和解决常见的连接和认证问题。
在实际应用中,我们可以根据具体需求选择合适的方法和模块,按照操作流程进行操作,遇到问题时参考常见问题及解决方案,快速定位和解决问题,从而更好地利用 Ansible 进行自动化管理,提升工作效率和系统稳定性。
希望这些内容能帮助你在 Ansible 的使用中更加得心应手,不断探索和实践,挖掘 Ansible 的更多潜力。
超级会员免费看
1131

被折叠的 条评论
为什么被折叠?



