2017-02-16 16 views
4

По сути, я хочу иметь возможность обрабатывать «подстановочные имена файлов» в Linux с помощью ansible. По сути, это означает использование команды ls с частью имени файла, за которой следует «*», чтобы он отображал ТОЛЬКО определенные файлы.Как сохранить вывод команды в массив в Ansible?

Однако я не могу правильно сохранить вывод в переменной, поскольку, вероятно, будет возвращено более одного имени файла. Таким образом, я хочу иметь возможность хранить эти результаты независимо от того, сколько их может быть в массиве во время одной задачи. Затем я хочу получить все результаты из массива в более поздней задаче. Кроме того, поскольку я не знаю, сколько файлов может быть возвращено, я не могу выполнить задачу для каждого имени файла, и массив имеет больше смысла.

Причина этого в том, что файлы в случайном хранилище часто меняются, но они всегда имеют одинаковую первую половину. Это их вторая половина их имен, которые являются случайными, и я не хочу иметь жесткий код, который может быть вообще недоступен.

Я не уверен, как правильно реализовать/манипулировать массивом в незаменимом, поэтому следующий код является примером того, что я пытаюсь выполнить. Очевидно, что он не будет функционировать должным образом, если более чем один имя_файла возвращается, поэтому я прошу помощи по этой теме:

- hosts: <randomservername> 
    remote_user: remoteguy 
    become: yes 
    become_method: sudo 
    vars: 
    aaaa: b 
    tasks: 

- name: Copy over all random file contents from directory on control node to target clients. This is to show how to manipulate wildcard filenames. 
    copy: 
     src: /opt/home/remoteguy/copyable-files/testdir/ 
     dest: /tmp/ 
     owner: remoteguy 
     mode: u=rwx,g=r,o=r 
    ignore_errors: yes 

    - name: Determine the current filenames and store in variable for later use, obviously for this exercise we know part of the filenames. 
    shell: "ls {{item}}" 
    changed_when: false 
    register: annoying 
    with_items: [/tmp/this-name-is-annoying*, /tmp/this-name-is-also*] 

    - name: Run command to cat each file and then capture that output. 
    shell: cat {{ annoying }} 
    register: annoying_words 

    - debug: msg=Here is the output of the two files. {{annoying_words.stdout_lines }} 

    - name: Now, remove the wildcard files from each server to clean up. 
    file: 
     path: '{{ item }}' 
     state: absent 
    with_items: 
    - "{{ annoying.stdout }}" 

Я понимаю, формат YAML получил немного спутаны, но если это неподвижная , этот «будет» работать нормально, он просто не даст мне результат, который я ищу. Таким образом, если бы было 50 файлов, я бы хотел, чтобы они могли манипулировать ими всеми и/или удалять их все .. и т. Д. И т. Д.

Если кто-нибудь здесь может сообщить мне, как правильно использовать массив в вышеупомянутом фрагменте тестового кода, который был бы фантастическим!

+0

Похоже, что ваш вопрос может быть сокращен до пяти строк максимум. Я бы предложил использовать минимальные примеры, которые объясняют проблему и относятся к большему, чем ваш конкретный случай. – techraf

+0

techraf: Я знаю, что могу немного поучиться, но в этом случае я понял, что больше информации было лучше, чем меньше. В будущем я попытаюсь посмотреть, могу ли я немного сократить этот тип текста. – Viscosity

ответ

4

Ansible сохраняет выходные данные shell и действующих модулей в stdout и stdout_lines переменных. Последний содержит отдельные строки стандартного вывода в виде списка.

Чтобы перебрать элементы, используйте:

with_items: 
    - "{{ annoying.stdout_lines }}" 

Вы должны помнить, что анализ ls вывода может вызвать проблемы в некоторых случаях.

+0

Welp, это приятно знать, что stdout_lines использует отдельные строки в виде списка. Однако в моей третьей игре/задаче, если я запускаю ее так, как вы предлагаете, она не работает во время прогона. Неисправность, которую он дает, утверждает, что значение dict/arg не определено, даже если я вижу во время незанятой пьесы -vvv во время второй/play/задачи, которая существует stdout, и у меня есть переменная, зарегистрированная, чтобы попытаться ее поймать. Может быть, моя замена оператора оболочки в третьей игре/задаче имеет проблему? – Viscosity