【Linux&Ansible】学习笔记合集四

目录

[一、YUM 仓库配置任务故障排查](#一、YUM 仓库配置任务故障排查)

[1. 任务核心代码与执行流程](#1. 任务核心代码与执行流程)

[2. 核心故障:GPG 认证错误](#2. 核心故障:GPG 认证错误)

故障表现

排查与解决方法

[3. 其他常见问题](#3. 其他常见问题)

二、多用户创建任务故障排查

[1. 任务核心代码与执行流程](#1. 任务核心代码与执行流程)

[2. 核心故障排查](#2. 核心故障排查)

(1)变量引用错误

(2)用户组创建失败

[3. 验证任务结果](#3. 验证任务结果)

[三、LVM 存储配置任务故障排查](#三、LVM 存储配置任务故障排查)

[1. 任务核心代码与执行流程](#1. 任务核心代码与执行流程)

[2. 核心故障排查](#2. 核心故障排查)

[(1)磁盘 /dev/vdb 不存在](#(1)磁盘 /dev/vdb 不存在)

(2)存储角色依赖缺失

(3)挂载点目录不存在

[3. 检查模式验证配置](#3. 检查模式验证配置)

[四、Cron 定时任务配置故障排查](#四、Cron 定时任务配置故障排查)

[1. 任务核心代码与执行流程](#1. 任务核心代码与执行流程)

[2. 核心故障排查](#2. 核心故障排查)

[(1)devops 用户不存在](#(1)devops 用户不存在)

[(2)cron 任务执行权限不足](#(2)cron 任务执行权限不足)

[(3)cron 语法错误](#(3)cron 语法错误)

[3. 验证 cron 任务](#3. 验证 cron 任务)

五、网络接口配置任务故障排查

[1. 任务核心代码与执行流程](#1. 任务核心代码与执行流程)

[2. 核心故障排查](#2. 核心故障排查)

[(1)网卡名称 eth1 不存在](#(1)网卡名称 eth1 不存在)

[(2)IP 地址冲突](#(2)IP 地址冲突)

(3)网络角色参数不完整

[3. 验证网络配置](#3. 验证网络配置)

六、核心总结

一、YUM 仓库配置任务故障排查

该任务核心是配置自定义 YUM 仓库、安装 GPG 密钥并部署 rhelver 包,最常见故障为 GPG 密钥认证失败,导致仓库配置或包安装失败。

1. 任务核心代码与执行流程

复制代码
# repo_playbook.yml 核心内容
- name: Repository Configuration
  hosts: webservers

  tasks:
    - name: Ensure Example Repo exists
      ansible.builtin.yum_repository:
        name: example-internal
        description: Example Inc. Internal YUM repo
        file: example
        baseurl: http://materials.example.com/yum/repository/
        gpgcheck: yes

    - name: Ensure Repo RPM Key is Installed
      ansible.builtin.rpm_key:
        key: http://materials.example.com/yum/repository/RPM-GPG-KEY-example
        state: present

    - name: Install rhelver package
      ansible.builtin.dnf:
        name: rhelver
        state: present

执行命令:

复制代码
ansible-navigator run -m stdout repo_playbook.yml

2. 核心故障:GPG 认证错误

故障表现

执行时提示 GPG key retrieval failedpackage rhelver is not signed,任务失败。

排查与解决方法

(1)验证 GPG 密钥地址可达性通过临时命令测试受管主机能否访问密钥地址:

复制代码
ansible webservers -m ansible.builtin.uri -a 'url=http://materials.example.com/yum/repository/RPM-GPG-KEY-example return_content=yes'

若返回 404 / 超时,说明密钥地址错误或网络不通,需修正 rpm_key 模块的 key 参数。

(2)检查 GPG 密钥完整性手动下载密钥并验证指纹,确保密钥未被篡改:

复制代码
# 控制节点下载密钥
curl http://materials.example.com/yum/repository/RPM-GPG-KEY-example -o /tmp/example.key
# 受管主机导入并验证
ansible webservers -m ansible.builtin.copy -a 'src=/tmp/example.key dest=/tmp/example.key'
ansible webservers -m ansible.builtin.command -a 'rpm --import /tmp/example.key && rpm -q gpg-pubkey --qf "%{name}-%{version}-%{release} -> %{summary}\n"'

(3)临时关闭 GPG 检查(测试用)若仅需验证仓库可用性,可临时将 yum_repository 模块的 gpgcheck 设为 no,排除密钥干扰:

复制代码
- name: Ensure Example Repo exists
  ansible.builtin.yum_repository:
    name: example-internal
    description: Example Inc. Internal YUM repo
    file: example
    baseurl: http://materials.example.com/yum/repository/
    gpgcheck: no  # 临时关闭,测试仓库是否可用

3. 其他常见问题

  • 仓库 baseurl 不可达 :用 uri 模块测试 baseurl 是否能访问,确认受管主机网络策略允许访问该地址;
  • dnf 模块依赖缺失 :受管主机需安装 dnf 工具,确保 ansible_python_interpreter 指向的 Python 环境能调用 dnf

二、多用户创建任务故障排查

该任务通过变量文件定义用户信息,批量创建用户和用户组,常见故障为变量引用错误、用户组权限问题

1. 任务核心代码与执行流程

复制代码
# vars/users_vars.yml 变量文件
users:
  - username: ops1
    groups: webadmin
  - username: ops2
    groups: webadmin

# users.yml Playbook
- name: Create multiple local users
  hosts: webservers
  vars_files:
    - vars/users_vars.yml

  tasks:
    - name: Add webadmin group
      ansible.builtin.group:
        name: webadmin
        state: present

    - name: Create user accounts
      ansible.builtin.user:
        name: "{{ item['username'] }}"
        groups: webadmin
      loop: "{{ users }}"

执行命令:

复制代码
ansible-navigator run -m stdout users.yml

2. 核心故障排查

(1)变量引用错误
  • 故障表现:提示 'users' is undefineditem['username'] 不存在;
  • 排查方法:
    1. 检查 vars_files 路径是否正确(相对路径基于 Playbook 所在目录);

    2. debug 模块验证变量加载:

      • name: 验证 users 变量
        ansible.builtin.debug:
        var: users
        verbosity: 1
    3. 确认变量文件语法正确(YAML 缩进为 2 个空格,无语法错误)。

(2)用户组创建失败
  • 故障表现:提示 groupadd: permission denied

  • 解决方法:开启特权升级,确保 Play 有足够权限创建用户组:

    复制代码
    - name: Create multiple local users
      hosts: webservers
      vars_files:
        - vars/users_vars.yml
      become: yes  # 开启 sudo 提权
      become_user: root  # 以 root 执行
    
    tasks:
      - name: Add webadmin group
        ansible.builtin.group:
          name: webadmin
          state: present

3. 验证任务结果

执行后用临时命令验证用户和组是否创建成功:

复制代码
# 检查 webadmin 组是否存在
ansible webservers -m ansible.builtin.command -a 'getent group webadmin'
# 检查 ops1 用户是否在 webadmin 组中
ansible webservers -m ansible.builtin.command -a 'id ops1'

三、LVM 存储配置任务故障排查

该任务通过 rhel_system_roles.storage 角色配置 LVM 存储池和逻辑卷,常见故障为磁盘不存在、角色依赖缺失、权限不足

1. 任务核心代码与执行流程

复制代码
# group_vars/webservers/storage_vars.yml 存储变量
storage_pools:
  - name: apache-vg
    type: lvm
    disks:
      - /dev/vdb
    volumes:
      - name: content-lv
        size: 64m
        mount_point: "/var/www"
        fs_type: xfs
        state: present
      - name: logs-lv
        size: 128m
        mount_point: "/var/log/httpd"
        fs_type: xfs
        state: present

# storage.yml Playbook
- name: Configure storage on webservers
  hosts: webservers
  roles:
    - name: redhat.rhel_system_roles.storage

执行命令:

复制代码
# 先安装存储角色
ansible-galaxy collection install ./redhat-rhel_system_roles-1.19.3.tar.gz -p collections
# 执行 Playbook
ansible-navigator run -m stdout storage.yml

2. 核心故障排查

(1)磁盘 /dev/vdb 不存在
  • 故障表现:提示 No such device /dev/vdb
  • 排查方法:
    1. 用临时命令检查受管主机磁盘列表:

      复制代码
      ansible webservers -m ansible.builtin.command -a 'lsblk'
    2. 修正 storage_vars.yml 中的 disks 参数,指向实际存在的磁盘(如 /dev/vdc);

    3. 若磁盘未初始化,先执行磁盘格式化(需特权): yaml

      复制代码
      - name: 初始化磁盘
        ansible.builtin.command:
          cmd: parted /dev/vdb mklabel gpt
          creates: /dev/vdb1  # 仅当磁盘未分区时执行
        become: yes
(2)存储角色依赖缺失
  • 故障表现:提示 role redhat.rhel_system_roles.storage not found
  • 解决方法:
    1. 确认角色安装路径正确(collections 目录需与 Playbook 同层级);

    2. 检查 ansible.cfgcollections_paths 配置,确保包含角色安装路径:

      复制代码
      [defaults]
      collections_paths = ./collections:/usr/share/ansible/collections
(3)挂载点目录不存在
  • 故障表现:提示 mount point /var/www does not exist

  • 解决方法:在角色执行前创建挂载点目录:

    复制代码
    - name: 创建挂载点目录
      ansible.builtin.file:
        path: "{{ item.mount_point }}"
        state: directory
        mode: '0755'
      loop: "{{ storage_pools[0].volumes }}"
      become: yes

3. 检查模式验证配置

执行前用检查模式测试配置是否合法,避免实际执行时损坏数据:

复制代码
ansible-navigator run -m stdout storage.yml --check

四、Cron 定时任务配置故障排查

该任务创建周期性磁盘使用率记录的 cron 任务,常见故障为用户不存在、权限不足、cron 语法错误

1. 任务核心代码与执行流程

复制代码
# create_crontab_file.yml
- name: Recurring cron job
  hosts: webservers

  tasks:
    - name: Crontab file exists
      ansible.builtin.cron:
        name: Add date and time to a file
        minute: "*/2"
        hour: 9-16
        weekday: 1-5
        user: devops
        job: df >> /home/devops/disk_usage
        cron_file: disk_usage
        state: present

执行命令:

复制代码
ansible-navigator run -m stdout create_crontab_file.yml

2. 核心故障排查

(1)devops 用户不存在
  • 故障表现:提示 user devops does not exist

  • 解决方法:先创建 devops 用户,或修改 user 参数为存在的用户:

    复制代码
    - name: 创建 devops 用户(前置任务)
      ansible.builtin.user:
        name: devops
        state: present
      become: yes
    
    - name: Crontab file exists
      ansible.builtin.cron:
        name: Add date and time to a file
        minute: "*/2"
        hour: 9-16
        weekday: 1-5
        user: devops
        job: df >> /home/devops/disk_usage
        cron_file: disk_usage
        state: present
      become: yes
(2)cron 任务执行权限不足
  • 故障表现:cron 任务已创建,但 /home/devops/disk_usage 无内容;
  • 排查方法:
    1. 检查 devops 用户对 /home/devops 目录的写入权限;

    2. 查看 cron 日志(/var/log/cron),确认任务执行错误:

      复制代码
      ansible webservers -m ansible.builtin.command -a 'grep devops /var/log/cron'
    3. 修正 job 命令的路径,使用绝对路径执行 df

      复制代码
      job: /bin/df >> /home/devops/disk_usage  # 用绝对路径避免环境变量问题
(3)cron 语法错误
  • 故障表现:提示 invalid cron syntax
  • 解决方法:验证 cron 时间参数格式:
    • minute: "*/2":每 2 分钟执行(合法);
    • hour: 9-16:9 点到 16 点(合法);
    • weekday: 1-5:周一到周五(合法,1 = 周一,7 = 周日)。

3. 验证 cron 任务

执行后检查 cron 配置文件和任务状态:

复制代码
# 查看 devops 用户的 cron 任务
ansible webservers -m ansible.builtin.command -a 'crontab -l -u devops'
# 检查 cron 配置文件是否生成
ansible webservers -m ansible.builtin.stat -a 'path=/etc/cron.d/disk_usage'

五、网络接口配置任务故障排查

该任务通过 rhel_system_roles.network 角色配置网卡 IP,常见故障为网卡名称错误、IP 地址冲突、角色参数错误

1. 任务核心代码与执行流程

复制代码
# group_vars/webservers/network.yml 网络变量
network_connections:
  - name: eth1
    type: ethernet
    ip:
      address:
        - 172.25.250.40/24

# network_playbook.yml Playbook
- name: NIC Configuration
  hosts: webservers
  roles:
    - redhat.rhel_system_roles.network

执行命令:

复制代码
ansible-navigator run -m stdout network_playbook.yml

2. 核心故障排查

(1)网卡名称 eth1 不存在
  • 故障表现:提示 Connection eth1 not found
  • 排查方法:
    1. 用临时命令查看受管主机实际网卡名称:

      复制代码
      ansible webservers -m ansible.builtin.command -a 'nmcli device status'
    2. 修正 network.yml 中的 name 参数,指向实际网卡(如 ens33enp0s3):

      复制代码
      network_connections:
        - name: ens33  # 替换为实际网卡名称
          type: ethernet
          ip:
            address:
              - 172.25.250.40/24
(2)IP 地址冲突
  • 故障表现:任务执行成功,但网卡无法启用;
  • 排查方法:
    1. 测试 IP 地址是否被占用:

      复制代码
      ansible webservers -m ansible.builtin.command -a 'ping -c 1 172.25.250.40'
    2. 更换未被占用的 IP 地址(如 172.25.250.41/24)。

(3)网络角色参数不完整
  • 故障表现:IP 配置未生效,提示 missing required parameters

  • 解决方法:补充网络连接的必要参数(如启用连接、设置网关):

    复制代码
    network_connections:
      - name: ens33
        type: ethernet
        state: up  # 启用连接
        ip:
          address:
            - 172.25.250.40/24
          gateway4: 172.25.250.1  # 配置网关(可选)
          dns:
            - 8.8.8.8
            - 8.8.4.4

3. 验证网络配置

执行后检查网卡 IP 和连接状态:

复制代码
# 查看网卡 IP 配置
ansible webservers -m ansible.builtin.command -a 'ip addr show ens33'
# 检查网络连接状态
ansible webservers -m ansible.builtin.command -a 'nmcli connection show ens33'

六、核心总结

  1. 仓库配置:重点排查 GPG 密钥可达性 / 完整性、baseurl 网络连通性,临时关闭 GPG 检查可快速定位问题;
  2. 用户创建 :确保变量加载正确、开启特权升级,用 debug 模块验证变量,用 id 命令验证结果;
  3. 存储配置:先确认磁盘存在且未被占用,检查角色安装路径,用检查模式测试配置合法性;
  4. Cron 任务:保证用户存在、命令使用绝对路径,查看 cron 日志定位执行错误;
  5. 网络配置 :匹配实际网卡名称,补充必要的网络参数(如 state: up),避免 IP 地址冲突。
相关推荐
小白同学_C14 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖14 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
testpassportcn14 小时前
AWS DOP-C02 認證完整解析|AWS DevOps Engineer Professional 考試
网络·学习·改行学it
不做无法实现的梦~15 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
默|笙17 小时前
【Linux】fd_重定向本质
linux·运维·服务器
游乐码17 小时前
c#变长关键字和参数默认值
学习·c#
陈苏同学18 小时前
[已解决] Solving environment: failed with repodata from current_repodata.json (python其实已经被AutoDL装好了!)
linux·python·conda
“αβ”18 小时前
网络层协议 -- ICMP协议
linux·服务器·网络·网络协议·icmp·traceroute·ping
饭碗、碗碗香18 小时前
【Python学习笔记】:Python的hashlib算法简明指南:选型、场景与示例
笔记·python·学习
不爱学习的老登19 小时前
Windows客户端与Linux服务器配置ssh无密码登录
linux·服务器·windows