Ansible Playbook使用通配符重命名Node Exporter目录失败求助
Node Exporter解压后重命名目录异常问题
问题背景
通过Ansible下载并解压Node Exporter归档包,解压环节正常,但重命名目录时出现异常:执行完Playbook后,/usr/local/bin下出现两个文件夹,重命名后的node_exporter为空,原版本目录node_exporter-1.6.1.linux-amd64保留了所有目标文件(LICENSE、NOTICE、node_exporter)。需求是将这些文件迁移到/usr/local/bin/node_exporter目录中。
原Playbook代码
- name: Download and unarchive Node Exporter ansible.builtin.unarchive: src: https://github.com/n_e/node_exporter-1.6.1.linux-amd64.tar.gz dest: /usr/local/bin remote_src: yes - name: Rename Node Exporter directory ansible.builtin.shell: | find /usr/local/bin/ -depth -type d -name 'node_exporter*' -exec mv {} node_exporter \; - name: Change owner of node_exporter directory ansible.builtin.file: path: /usr/local/bin/node_exporter state: directory recurse: true owner: nodex group: nodex
执行结果
/usr/local/bin$ ls node_exporter* node_exporter: node_exporter-1.6.1.linux-amd64: LICENSE NOTICE node_exporter
最佳实现方案
问题原因
unarchive模块直接解压到/usr/local/bin后,会生成带版本号的子目录,所有目标文件都在该子目录内。- 后续的
shell命令逻辑错误:当node_exporter目录已存在(比如重复执行Playbook),mv会把版本目录移动到node_exporter目录下,而非替换,最终形成空目录+嵌套结构;即使是首次执行,find可能匹配到刚创建的空目录,导致重命名逻辑混乱。
修正后的Playbook
利用unarchive模块的extra_opts参数直接处理归档结构,无需后续重命名操作,更简洁可靠:
# 先创建目标目录并设置基础权限 - name: Create Node Exporter target directory ansible.builtin.file: path: /usr/local/bin/node_exporter state: directory owner: nodex group: nodex mode: '0755' # 下载并直接解压文件到目标目录,跳过顶层版本目录 - name: Download and extract Node Exporter files ansible.builtin.unarchive: src: https://github.com/n_e/node_exporter-1.6.1.linux-amd64.tar.gz dest: /usr/local/bin/node_exporter remote_src: yes # --strip-components=1 移除归档内的顶层版本目录,直接解压内部文件到目标目录 extra_opts: ["--strip-components=1"] # 检查目标二进制文件是否存在,避免重复执行 creates: /usr/local/bin/node_exporter/node_exporter # 确保所有文件权限正确 - name: Set correct ownership for Node Exporter files ansible.builtin.file: path: /usr/local/bin/node_exporter state: directory recurse: true owner: nodex group: nodex
可选:清理旧版本目录
如果需要清理遗留的旧版本目录,可添加以下任务:
- name: Remove old Node Exporter version directory ansible.builtin.file: path: /usr/local/bin/node_exporter-1.6.1.linux-amd64 state: absent
内容的提问来源于stack exchange,提问作者AbreQueVoy
相关产品推荐
相关产品推荐

