You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中按清单文件名创建同名文件夹并引用该变量?

Ansible:根据清单文件名生成对应目录并保存锁文件

原脚本与需求

你的原Ansible脚本用于更新RHEL系统并锁定所有包版本,最后将锁文件拉取到控制节点的ansible/inventory/dnf_lockFiles/目录下。现在需要根据当前使用的清单文件名,在该目录下创建同名子文件夹,将锁文件存入其中(比如清单文件名为test,最终路径为ansible/inventory/dnf_lockFiles/test/versionlock.list)。

解决方案

Ansible内置了inventory_file变量,它会返回当前使用的清单文件的完整路径。我们可以用过滤器提取纯文件名(不带路径和后缀),再基于这个值创建目录、调整拉取路径。

修改后的完整脚本

---
- name: Update Red Hat system and lock version
  hosts: "{{ host }}"
  become: true
  vars:
    # 提取清单文件名(去掉路径和后缀)
    inventory_name: "{{ inventory_file | basename | splitext | first }}"
    # 定义锁文件的目标目录
    lock_file_target_dir: "ansible/inventory/dnf_lockFiles/{{ inventory_name }}"
  tasks:
    - debug: msg="Host is {{ ansible_fqdn }}"
    
    - name: install dnf versionlock plugin
      dnf:
        name: dnf-plugin-versionlock
        state: latest

    - name: unlock all packages
      shell: dnf versionlock delete "*"

    - name: Update all packages
      dnf:
        name: '*'
        state: latest
  
    - name: lock all packages
      shell: dnf versionlock add "*"

    - name: 创建锁文件的目标目录
      file:
        path: "{{ lock_file_target_dir }}"
        state: directory
        mode: '0755'
      # 目录创建在控制节点,所以委托到本地执行
      delegate_to: localhost
      become: false

    - name: 拉取锁定包列表到控制节点
      fetch:
        src: /etc/dnf/plugins/versionlock.list
        dest: "{{ lock_file_target_dir }}/versionlock.list"
        flat: yes

关键说明

  1. 变量提取逻辑:

    • inventory_file:返回清单文件的完整路径,比如/home/user/ansible/inventory/test或/home/user/ansible/inventory/test.ini
    • basename:提取路径中的文件名部分,比如test或test.ini
    • splitext:拆分文件名和后缀,得到类似['test', '.ini']的列表
    • first:取列表第一个元素,最终得到纯文件名test
  2. 目录创建任务:

    • 因为目标目录在控制节点(而非远程主机),所以需要用delegate_to: localhost将任务委托到本地执行
    • become: false是因为控制节点创建普通目录通常不需要sudo权限,可根据实际情况调整
  3. 适配无后缀清单文件:如果你的清单文件没有后缀(比如直接叫test),splitext | first依然能正确返回原文件名,无需额外修改。

内容的提问来源于stack exchange,提问作者The_No1_CousCous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:47:19