【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 回放定位根因。
相关推荐
律宏阔2 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔2 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴2 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千2 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei372 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei372 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei372 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
AKAMAI2 小时前
随着瓦尔·基尔默的AI分身诞生,生成式AI是否正在将好莱坞推向边缘?
人工智能·云原生·云计算
GeW2 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
GeW2 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux