如何在Ansible中统计AWS S3子文件夹内的文件数量
解决Ansible统计S3指定前缀下各子文件夹文件数量的问题
我懂你的需求啦——你现在的代码只能算出所有文件的总数,但想要按folder/下面的每个子文件夹分别统计文件数量对吧?咱们来修改代码,实现你要的效果。
原代码的问题分析
你现有的CountFilesS3Folder任务直接取了s3_bucket_items.s3_keys | length,这只会返回所有文件的总数量(也就是你看到的11);而且with_items: s3_bucket_items的用法也不对,因为s3_bucket_items是整个注册的结果对象,不是可遍历的列表。
修正后的完整Playbook
我们可以利用Ansible的过滤器实现分组统计,这里给你两种清晰的实现方式:
方式一:一步到位的循环处理
- name: AwsS3 aws_s3: bucket: teste-acme mode: list prefix: folder/ register: s3_bucket_items - name: Count files per subfolder under prefix debug: msg: "{{ item.0 }} {{ item.1 | length }}" loop: "{{ s3_bucket_items.s3_keys | map('split', '/') | map('extract', 1) | list | zip(s3_bucket_items.s3_keys) | groupby(0) }}"
方式二:分步处理更易读
如果觉得上面的链式过滤器有点绕,可以拆成两步,逻辑更直观:
- name: AwsS3 aws_s3: bucket: teste-acme mode: list prefix: folder/ register: s3_bucket_items - name: Prepare folder-file pairs for grouping set_fact: s3_folder_file_pairs: "{{ s3_bucket_items.s3_keys | map('split', '/') | map(lambda x: {'folder': x[1], 'file': '/'.join(x)}) | list }}" - name: Count files per subfolder debug: msg: "{{ item.key }} {{ item.list | length }}" loop: "{{ s3_folder_file_pairs | groupby('folder') }}"
代码逻辑解释
- 第一步(AwsS3任务):和你原来的代码一致,获取指定前缀下的所有文件路径,注册到
s3_bucket_items变量中。 - 提取子文件夹名称:利用
split('/')把每个文件路径拆分成列表,比如folder/bambu/bambu-338400da-1.tgz会被拆成['folder', 'bambu', 'bambu-338400da-1.tgz'],我们取索引为1的元素(也就是子文件夹名)。 - 分组统计:用
groupby过滤器按子文件夹名分组,然后统计每组的长度,就是对应文件夹下的文件数量。
运行后的期望输出
执行后你会得到和需求一致的结果:
ok: [localhost] => { "msg": "bambu 1" } ok: [localhost] => { "msg": "bonsai 1" } ok: [localhost] => { "msg": "sakura 4" } ok: [localhost] => { "msg": "shibazakura 3" } ok: [localhost] => { "msg": "ume 2" }
内容的提问来源于stack exchange,提问作者Vinicius Peres
相关产品推荐
相关产品推荐

