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

目录

[一、Ansible-navigator 环境搭建与基础操作](#一、Ansible-navigator 环境搭建与基础操作)

[1. 切换工作目录](#1. 切换工作目录)

[2. 配置 navigator 执行环境](#2. 配置 navigator 执行环境)

[3. 镜像仓库登录](#3. 镜像仓库登录)

[4. 启动 navigator 工具](#4. 启动 navigator 工具)

[5. 验证 navigator 环境配置](#5. 验证 navigator 环境配置)

[二、Playbook 编写与执行:基础场景](#二、Playbook 编写与执行:基础场景)

[1. 向 dev 组批量添加用户](#1. 向 dev 组批量添加用户)

[编写 Playbook](#编写 Playbook)

[执行 Playbook](#执行 Playbook)

验证用户创建结果

[2. 定义变量批量安装软件包](#2. 定义变量批量安装软件包)

[编写 Playbook](#编写 Playbook)

[执行 Playbook](#执行 Playbook)

[三、Playbook 进阶编写:条件判断与任务扩展](#三、Playbook 进阶编写:条件判断与任务扩展)

[1. 扩展软件安装任务,添加 Redis 安装](#1. 扩展软件安装任务,添加 Redis 安装)

[编写扩展后的 Playbook](#编写扩展后的 Playbook)

[2. 执行扩展后的 Playbook](#2. 执行扩展后的 Playbook)

[3. 自定义条件失败提示](#3. 自定义条件失败提示)

[四、Playbook 检查与故障排查](#四、Playbook 检查与故障排查)

[1. 开启检查模式验证 Playbook](#1. 开启检查模式验证 Playbook)

[2. 语法校验专项检查](#2. 语法校验专项检查)

[3. 排查模块参数类错误](#3. 排查模块参数类错误)

常见错误场景与解决

修正后重新执行

[4. 分级调试定位问题](#4. 分级调试定位问题)

[五、Playbook 执行结果留存](#五、Playbook 执行结果留存)

[1. 导出执行日志到文件](#1. 导出执行日志到文件)

[2. 生成执行报告(artifact)](#2. 生成执行报告(artifact))

总结

一、Ansible-navigator 环境搭建与基础操作

Ansible-navigator 是 Ansible 核心执行工具,需先完成环境配置,才能开展后续 Playbook 编写与执行操作,核心包含目录切换、配置文件创建、仓库登录等步骤。

1. 切换工作目录

进入指定的专属工作目录,统一管理后续的配置文件和 Playbook 文件,执行命令:

复制代码
cd ~/review-cr1

通过重定向方式创建 ansible-navigator.yml 配置文件,指定执行环境镜像及拉取策略,命令如下:

复制代码
cat > /home/student/review-cr1/ansible-navigator.yml << 'EOF'
---
ansible-navigator:
  execution-environment:
    image: utility.lab.example.com/ee-supported-rhel8:latest
    pull:
      policy: missing
EOF

3. 镜像仓库登录

访问私有镜像仓库前完成登录认证,保障镜像拉取权限,执行命令:

复制代码
podman login utility.lab.example.com

注:原命令中 ytility 为笔误,已修正为 utility,避免登录失败。

完成配置与登录后,直接启动 Ansible-navigator 工具,进入交互式操作界面,执行命令:

复制代码
ansible-navigator

启动后可通过如下命令快速验证配置是否生效,查看当前执行环境镜像信息:

复制代码
ansible-navigator config dump -m stdout | grep execution-environment

二、Playbook 编写与执行:基础场景

基于配置好的 Ansible-navigator 环境,编写 Playbook 实现批量添加用户、批量安装软件包等基础自动化操作,充分利用 Ansible 循环、变量特性简化配置。

1. 向 dev 组批量添加用户

编写 users.yml Playbook,针对 dev 主机组,通过 loop 循环批量创建 joe、sam 用户,使用 ansible.builtin.user 内置模块实现,编写与执行命令如下:

编写 Playbook
复制代码
cat > users.yml << 'EOF'
---
- name: Add users
  hosts: dev
  tasks:
    - name: Add the users joe and sam
      ansible.builtin.user:
        name: "{{ item }}"
        state: present  # 显式指定用户存在,增强可读性
        create_home: yes  # 自动创建用户家目录
      loop:
        - joe
        - sam
EOF
执行 Playbook
复制代码
ansible-navigator run -m stdout users.yml
验证用户创建结果

通过临时命令快速检查 dev 组主机的用户是否创建成功:

复制代码
ansible dev -m ansible.builtin.command -a 'id joe' -m stdout

2. 定义变量批量安装软件包

编写 install_packages.yml Playbook,通过 vars 定义 packages 变量指定软件包列表,使用 ansible.builtin.dnf 模块批量安装并保持最新版本,编写内容如下:

编写 Playbook
复制代码
cat > install_packages.yml << 'EOF'
---
- name: Install packages
  hosts: dev
  become: yes  # 开启特权升级,解决软件安装权限不足问题
  vars:
    packages:
      - httpd
      - mariadb-server
  tasks:
    - name: Install the required packages
      ansible.builtin.dnf:
        name: "{{ packages }}"
        state: latest  # 确保安装最新版本
        update_cache: yes  # 安装前更新dnf缓存
EOF
执行 Playbook
复制代码
ansible-navigator run -m stdout install_packages.yml --become  # --become 触发特权升级

三、Playbook 进阶编写:条件判断与任务扩展

在基础软件安装 Playbook 上进行扩展,增加条件判断逻辑,实现满足指定系统条件时才安装指定软件,提升 Playbook 的灵活性与适用性。

1. 扩展软件安装任务,添加 Redis 安装

编辑 install_packages.yml,保留原有基础软件安装任务,新增 Redis 安装任务,并通过 ansible_facts 系统事实添加条件判断,仅当主机交换内存大于 10MB 时才安装,编写命令与内容如下:

编写扩展后的 Playbook
复制代码
cat > install_packages.yml << 'EOF'
---
- name: Install packages
  hosts: dev
  become: yes
  vars:
    packages:
      - httpd
      - mariadb-server
  tasks:
    - name: Gather system facts  # 显式收集系统事实,确保swap信息可用
      ansible.builtin.setup:
        filter: ansible_swaptotal_mb  # 仅收集swap内存信息,提升效率

    - name: Install the required packages
      ansible.builtin.dnf:
        name: "{{ packages }}"
        state: latest
        update_cache: yes

    - name: Install redis
      ansible.builtin.dnf:
        name: redis
        state: latest
      when: ansible_facts['swaptotal_mb'] > 10  # 条件判断:swap内存>10MB才安装
      register: redis_install_result  # 注册任务执行结果,便于后续查看

    - name: Show redis install result  # 输出Redis安装结果
      ansible.builtin.debug:
        var: redis_install_result
        verbosity: 1
EOF

2. 执行扩展后的 Playbook

以标准输出模式执行更新后的软件安装 Playbook,查看条件执行结果,执行命令:

复制代码
ansible-navigator run -m stdout install_packages.yml --become -v  # -v 显示基础调试信息

3. 自定义条件失败提示

若需在 swap 内存不足时给出明确提示,可新增 assert 模块增强容错性:

复制代码
# 在 Install redis 任务前新增如下任务
- name: Check swap memory for redis
  ansible.builtin.assert:
    that:
      - ansible_facts['swaptotal_mb'] > 10
    fail_msg: "Redis安装失败:主机swap内存不足10MB,当前为 {{ ansible_facts['swaptotal_mb'] }} MB"
    success_msg: "主机swap内存满足Redis安装条件"

四、Playbook 检查与故障排查

Playbook 编写完成后,需先进行检查操作,提前发现并解决缩进、拼写、模块参数等语法与配置错误,保障执行成功率。

1. 开启检查模式验证 Playbook

使用 --check 参数开启检查模式,对 Playbook 进行语法与执行逻辑校验,不实际执行任务,执行命令:

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

2. 语法校验专项检查

单独校验 Playbook 的 YAML 语法和模块调用是否合法,执行命令:

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

3. 排查模块参数类错误

常见错误场景与解决

若执行时出现「fatal:不支持的参数模块 when」类错误,通常是 when 条件放错位置(如写在模块参数内),修正示例如下:

错误写法

复制代码
- name: Install redis
  ansible.builtin.dnf:
    name: redis
    state: latest
    when: ansible_facts['swaptotal_mb'] > 10  # 错误:when是任务级参数,不能写在模块内

正确写法

复制代码
- name: Install redis
  ansible.builtin.dnf:
    name: redis
    state: latest
  when: ansible_facts['swaptotal_mb'] > 10  # 正确:when放在任务层级
修正后重新执行
复制代码
ansible-navigator run -m stdout install_packages.yml --become

4. 分级调试定位问题

若执行仍失败,通过 -v 系列参数开启分级调试,获取更详细的执行日志:

复制代码
# 深度调试:展示远程执行脚本、用户等信息
ansible-navigator run -m stdout install_packages.yml --become -vvvv

五、Playbook 执行结果留存

1. 导出执行日志到文件

通过环境变量指定日志路径,留存执行记录便于后续复盘:

复制代码
ANSIBLE_LOG_PATH=~/review-cr1/playbook_exec.log ansible-navigator run -m stdout install_packages.yml --become

2. 生成执行报告(artifact)

Ansible-navigator 默认生成 JSON 格式的执行报告,可通过如下命令查看:

复制代码
# 列出当前目录的artifact文件
ls -l *-artifact-*.json
# 回放artifact文件,交互查看执行详情
ansible-navigator replay $(ls -t *-artifact-*.json | head -1) -m stdout

总结

  1. Ansible-navigator 环境配置核心是正确指定执行环境镜像,并完成私有仓库登录,避免镜像拉取失败;
  2. Playbook 编写需注意语法规范(如缩进、参数层级),批量操作优先使用 loop 循环,变量定义增强可维护性;
  3. 条件判断(when)需放在任务层级,使用 assert 模块可提前校验前置条件,减少执行失败;
  4. 故障排查优先通过 --syntax-check 校验语法,再通过 -v 分级调试、artifact 回放定位根因。
相关推荐
小白同学_C9 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖9 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
不做无法实现的梦~11 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
默|笙13 小时前
【Linux】fd_重定向本质
linux·运维·服务器
陈苏同学13 小时前
[已解决] Solving environment: failed with repodata from current_repodata.json (python其实已经被AutoDL装好了!)
linux·python·conda
“αβ”13 小时前
网络层协议 -- ICMP协议
linux·服务器·网络·网络协议·icmp·traceroute·ping
阿里云云原生14 小时前
巨人网络《超自然行动组》携手阿里云打造云原生游戏新范式
云原生
不爱学习的老登14 小时前
Windows客户端与Linux服务器配置ssh无密码登录
linux·服务器·windows
小王C语言15 小时前
进程状态和进程优先级
linux·运维·服务器
xlp666hub15 小时前
【字符设备驱动】:从基础到实战(下)
linux·面试