如何从远程tgz包安装Splunk及Ansible中利用stdout_lines解压
从Ansible注册的ls输出中提取Splunk包名并解压
方法一:解析ls命令的输出结果
如果你已经通过ls -l获取了文件列表并注册为command_output,可以通过Ansible的过滤器链提取出.tgz包名:
# 假设你已经完成了wget下载步骤 - name: 获取下载目录的文件列表 ansible.builtin.command: ls -l /tmp/ register: command_output - name: 提取Splunk的tgz包文件名 ansible.builtin.set_fact: splunk_package: "{{ command_output.stdout_lines | select('search', '\\.tgz$') | map('regex_replace', '^.*\\s(\\S+\\.tgz)$', '\\1') | first }}" - name: 解压Splunk包到/opt目录 ansible.builtin.command: tar xvzf "/tmp/{{ splunk_package }}" -C /opt
过滤器说明:
select('search', '\\.tgz$'):筛选出所有以.tgz结尾的行map('regex_replace', '^.*\\s(\\S+\\.tgz)$', '\\1'):从每行的ls输出中提取最后一个非空格字段(即文件名)first:取第一个匹配到的结果(确保目录中只有一个Splunk tgz包)
方法二:用Ansible原生模块更可靠(推荐)
解析ls输出容易受格式变化影响,更稳妥的方式是用find模块查找文件,再用unarchive模块解压(支持幂等性,避免重复解压):
- name: 下载Splunk tgz包 ansible.builtin.wget: url: "http://your-splunk-package-url/splunk-x.x.x-linux-x86_64.tgz" dest: "/tmp/" - name: 查找/tmp目录下的Splunk tgz包 ansible.builtin.find: paths: "/tmp" patterns: "splunk-*.tgz" file_type: file register: splunk_package_find - name: 解压Splunk包到/opt目录 ansible.builtin.unarchive: src: "{{ splunk_package_find.files[0].path }}" dest: "/opt" remote_src: yes
优势:
find模块专门用于文件查找,结果结构清晰,无需解析字符串unarchive是Ansible原生模块,自动处理解压逻辑,支持幂等(重复执行不会重复解压)
内容的提问来源于stack exchange,提问作者Kevin_Ray
相关产品推荐
相关产品推荐

