如何在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
关键说明
变量提取逻辑:
inventory_file:返回清单文件的完整路径,比如/home/user/ansible/inventory/test或/home/user/ansible/inventory/test.inibasename:提取路径中的文件名部分,比如test或test.inisplitext:拆分文件名和后缀,得到类似['test', '.ini']的列表first:取列表第一个元素,最终得到纯文件名test
目录创建任务:
- 因为目标目录在控制节点(而非远程主机),所以需要用
delegate_to: localhost将任务委托到本地执行 become: false是因为控制节点创建普通目录通常不需要sudo权限,可根据实际情况调整
- 因为目标目录在控制节点(而非远程主机),所以需要用
适配无后缀清单文件:如果你的清单文件没有后缀(比如直接叫
test),splitext | first依然能正确返回原文件名,无需额外修改。
内容的提问来源于stack exchange,提问作者The_No1_CousCous
相关产品推荐
相关产品推荐

