19、Ansible 实战:运行、调试与故障排查

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:
  1. 添加一个任务,使用 vgs vgdata 命令检查名为 vgdata 的卷组是否存在,使用 register 注册命令结果,并在不存在时继续执行:
- name: check if vgdata exists
  command: vgs vgdata
  register: vg_result
  ignore_errors: true
  1. 包含一个 debug 任务,显示变量的值:
- name: show vg_result variable
  debug:
    var: vg_result
  1. 添加一个任务,根据第一个任务中 vgs 命令的结果打印成功或失败消息:
- name: print a message
  assert:
    that:
    - vg_result.rc == 0
    fail_msg: volume group not found
    success_msg: volume group was found
  1. 使用命令 ansible-playbook exercise112.yaml 验证其内容,若未找到 LVM 卷组 vgdata ,应打印 “volume group not found”。
  2. 修改 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
  1. 使用 ansible-playbook --tags all exercise113.yaml 命令运行 Playbook,注意不会运行 debug 任务。
  2. 使用 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: ’’
  1. 使用 ansible-playbook exercise114-1.yaml 命令运行 Playbook,并使用 ansible ansible4 -m reboot 命令重启节点 ansible4
  2. 重启完成后,使用 ansible all -m ping 命令验证连接,主机 ansible4 应给出 “Missing sudo password” 错误。
  3. 输入 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 的更多潜力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值