У меня есть структура данных в JSON файл, который получает подается в анзибль как дополнительный файл переменных, и это выглядит примерно так:анзибль - перебрать несколько хэшей в одной игре
"files_from_ftp":
{
"file1":
{
"full_name":"very-long-file-name-1"
"url":"ftp://.....very-long-file-name-1.zip"
},
"file2":
{
"full_name":"very-long-file-name-2"
"url":"ftp://.....very-long-file-name-2.zip"
}
},
"files_from_network":
{
"file3":
{
"full_name":"very-long-file-name-3"
"network_path":"file:///SOMEWHERE/ON/THE/NETWORK/very-long-file-name.zip"
}
},
"files_from_s3":
{
"file4":
{
"full_name":"very-long-file-name-4"
"url":"s3://some.s3.bucket/very-long-file-name-4.tar"
}
}
Эти три секции укажите файлы, загружаемые из разных источников.
Они исходят из разных источников, и известно, что некоторые из них являются разными типами (tar-файлы поступают из s3, zip из локальной сети и ftp-сервера), поэтому у меня есть три разных пьес для обработки каждой загрузки. Но в конце каждой игры есть файл, чье имя имеет значение full_name
(все записи в этих хэшах будут имеют элемент с именем full_name
) в каталоге .
После они загружаются, все они обрабатываются одинаково. Сейчас у меня есть три отдельных пьес, которые делают то же самое, но итерация другой хэша, как это:
- name: process files from ftp
shell: some_command -f /home/ubuntu/downloaded_files/{{ item.value.full_name }}
with_dict: files_from_ftp | default({})
- name: process files from network
shell: some_command -f /home/ubuntu/downloaded_files/{{ item.value.full_name }}
with_dict: files_from_network | default({})
- name: process files from s3
shell: some_command -f /home/ubuntu/downloaded_files/{{ item.value.full_name }}
with_dict: files_from_s3 | default({})
Я хотел бы быть в состоянии иметь одну игру, которая обрабатывает все эти хэш, но я не уверен, что это возможно. Я не могу понять синтаксис. То, что я имею в виду в гипотетической (и, вероятно, синтаксически недействительные) Код:
- name: process all downloaded files
shell: some_command -f /home/ubuntu/downloaded_files/{{ item.value.full_name }}
with_dict: (files_from_s3 | default({}))
and (files_from_ftp | default({}))
and (files_from_network | default({}))
В этом примере кода, я воображал, что with_dict
Переберем объединение трех других хэшей.
Имеет ли это смысл? Это то, что я хочу сделать, даже возможно? Было бы проще изменить пьесы, чем структуру данных, так как структура данных в этой ситуации.
Ницца! Для получения дополнительной информации см. Ссылку на PR: https://github.com/ansible/ansible/pull/7872 – ypid
Файлы разбиты на разные хэши, поскольку некоторые из них загружаются с использованием модуля 'get_url', другие с s3, другие копируются по локальной сети. После того, как все они были загружены и предварительно обработаны, есть некоторые общие этапы, которые идентичны и применяются ко всем. Если бы все они были в одном единственном хэше, более поздние шаги были бы легкими, но я не уверен, как бы написать одну игру, которая может загружаться из S3, локальной сети или ftp-сервера, а затем выполнить один из нескольких другие этапы предварительного процесса. – FrustratedWithFormsDesigner
Ну, сложность в этом случае, похоже, доходит до того, что вы хотите написать модуль для управления этим, лучше было бы обрабатывать угловые случаи, такие как файлы, переопределяющие другие файлы, устаревшие файлы и т. Д. И действительно особый случай идемпотентности – Conrado