2015-07-29 3 views
3

У меня есть структура данных в 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 Переберем объединение трех других хэшей.

Имеет ли это смысл? Это то, что я хочу сделать, даже возможно? Было бы проще изменить пьесы, чем структуру данных, так как структура данных в этой ситуации.

ответ

2

Я лично думаю, что вам следует перейти от использования хэша файлов к списку хэшей. Однако:

В анзибль 2.0 вы сможете сделать hash_merge так:

- shell: echo "{{ item.value.full_name }}" 
    with_dict: files_from_s3|hash_merge(files_from_ftp)|hash_merge(files_from_network) 

Что вы уже можете настроить, добавив этот hash_merge filter plugin

+1

Ницца! Для получения дополнительной информации см. Ссылку на PR: https://github.com/ansible/ansible/pull/7872 – ypid

+0

Файлы разбиты на разные хэши, поскольку некоторые из них загружаются с использованием модуля 'get_url', другие с s3, другие копируются по локальной сети. После того, как все они были загружены и предварительно обработаны, есть некоторые общие этапы, которые идентичны и применяются ко всем. Если бы все они были в одном единственном хэше, более поздние шаги были бы легкими, но я не уверен, как бы написать одну игру, которая может загружаться из S3, локальной сети или ftp-сервера, а затем выполнить один из нескольких другие этапы предварительного процесса. – FrustratedWithFormsDesigner

+0

Ну, сложность в этом случае, похоже, доходит до того, что вы хотите написать модуль для управления этим, лучше было бы обрабатывать угловые случаи, такие как файлы, переопределяющие другие файлы, устаревшие файлы и т. Д. И действительно особый случай идемпотентности – Conrado

Смежные вопросы