【问题标题】:ansible include with array slicesansible 包含数组切片
【发布时间】:2017-04-07 14:54:56
【问题描述】:

在 Ansible 2.2 中,我想遍历从 S3 读取的大量文件。

这是我的role/tasks/main.yml

- 名称:模拟从 S3 读取的变量 设置事实: list_of_files_to_import:[ "a.tar.gz", "b.tar.gz", "c.tar.gz", "d.tar.gz", "e.tar.gz", "f.tar.gz", "g.tar.gz", "h.tar.gz", ... “zz.tar.gz” ] - 名称:处理来自 S3 的每个文件 包括:子模块.yml with_items: list_of_files_to_import

这里是role/tasks/submodule.yml

--- - 名称:恢复表 {{ item }} 调试:var={{ item }}

因为文件太多而崩溃。

我发现我可以对数组进行切片并一次发送部分:

- 名称:处理来自 S3 的每个文件 包括:子模块.yml with_items: "{{ list_of_files_to_import[0:5] }}" - 名称:处理来自 S3 的每个文件 包括:子模块.yml with_items: "{{ list_of_files_to_import[5:10] }}" - 名称:处理来自 S3 的每个文件 包括:子模块.yml with_items:“{{ list_of_files_to_import[10:15] }}” - 名称:处理来自 S3 的每个文件 包括:子模块.yml with_items:“{{ list_of_files_to_import[15:20] }}”

我不想对所有这些小块进行硬编码,而是想尝试类似的东西

- 名称:处理来自 S3 的每个文件 包括:子模块.yml with_items: "{{ list_of_files_to_import[{{start}}:{{end}}] }}"

但是我们cannot get variable-defined variable names

如何在 Ansible 2.2 中处理大量项目?

【问题讨论】:

  • 列表有多大?崩溃的原因是什么?包含太多?
  • 大约 300 个文件。我看到的唯一原因是“内存不足”。但是,是的,它似乎无法处理这么多的包含。
  • 我不确定您的详细信息,但看起来有点像问题#16391。如果是这种情况,该问题应该在下一个 Ansible 版本中得到解决。
  • @Doomy 你可能是对的。我最终用 Bash 解决了它。我会发布我的解决方案。

标签: amazon-s3 ansible


【解决方案1】:

我最终用一个 shell 脚本解决了这个问题,用一些 --extra-vars 反复调用 playbook 来指定要处理的文件。

这只是因为 S3 中的文件列表具有相似的文件名。基本上,它会遍历文件名并一次处理每个文件名。

#!/usr/bin/env bash # 如果年/月组合有效,则返回 0(true) 有效的() { 年=$1 mn=$2 # 不要在本月之后的月份运行 if [ "$yr" -eq "2017" -a "$mn" -gt "$(date +%m)" ] 然后 返回 1 菲 返回 0 } # 从 2002 年到今年的每一年 `seq 2002 $(date +%Y)`中的年份 做 # 对于每个零填充的月份,01-12 `seq -f "%02g" 01 12` 中的月份 做 # 对于库存中的每种类型的项目 用于小部件装饰物中的对象 做 如果有效 $year $month; 然后 ansible-playbook playbook_name.yml --extra-vars "object=$object year=$year month=$month" 别的 echo 跳过无效的组合 $object $year $month 菲 完毕 完毕 完毕

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2018-04-13
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多