如何使用Ansible amazon.aws.s3_object模块通配符下载S3对象?
Ansible从S3下载匹配模式的动态文件名文件
Ansible的s3_object和s3_object_info模块本身不支持直接在路径中使用通配符(如*)匹配文件,但可以通过先获取对象列表再过滤下载的方式实现需求,具体步骤如下:
1. 获取S3桶中匹配前缀的对象列表
使用s3_object_info模块结合prefix参数,先拉取桶中所有以指定前缀开头的对象(比如你要找backup_2024*.tar.gz,前缀可设为backup_2024):
- name: 获取S3桶中匹配前缀的对象列表 amazon.aws.s3_object_info: bucket: your-target-bucket prefix: backup_2024 register: s3_object_list
2. 过滤符合文件名模式的对象
通过set_fact结合正则表达式,从返回的对象列表中筛选出完全匹配你需求的文件(比如匹配以.tar.gz结尾的文件):
- name: 筛选符合目标模式的S3对象 set_fact: target_files: "{{ s3_object_list.objects | selectattr('key', 'match', '^backup_2024.*\\.tar.gz$') | map(attribute='key') | list }}"
match后的正则可按需调整:比如要匹配任意后缀的文件,可改为^backup_2024.*$;要匹配包含特定字符的文件名,调整正则规则即可。
3. 批量下载匹配的文件
循环遍历筛选后的对象列表,用s3_object模块逐个下载:
- name: 批量下载匹配的S3文件到本地 amazon.aws.s3_object: bucket: your-target-bucket object: "{{ item }}" dest: "/local/download/path/{{ item | basename }}" mode: get loop: "{{ target_files }}"
注意事项
- 确保执行Playbook的节点已配置AWS访问权限(可通过环境变量
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY、本地~/.aws/credentials文件或IAM角色实现)。 - 若使用旧版Ansible的
s3模块(而非amazon.aws集合下的模块),逻辑类似,但推荐使用官方维护的amazon.aws模块以获得更好的兼容性和功能支持。
内容的提问来源于stack exchange,提问作者jerdub1993
相关产品推荐
相关产品推荐

