Подтвердить что ты не робот

Ansible: Есть ли что-то вроде with_fileglobs для файлов на удаленной машине?

Я пытаюсь превратить эти строки в нечто, что можно положить в незанятую пьесу:

# Install Prezto files
shopt -s extglob
shopt -s nullglob
files=( "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/!(README.md) )
for rcfile in "${files[@]}"; do
    [[ -f $rcfile ]] && ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile##*/}"
done

До сих пор у меня есть следующее:

- name: Link Prezto files
  file: src={{ item }} dest=~ state=link
  with_fileglob:
    - ~/.zprezto/runcoms/z*

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

Есть ли способ сделать это, или я должен просто использовать оболочку script?

4b9b3361

Ответ 1

Чистый Незаменимый способ очистки нежелательных файлов, соответствующих glob:

- name: List all tmp files
  find:
    paths: /tmp/foo
    patterns: "*.tmp"
  register: tmp_glob

- name: Cleanup tmp files
  file:
    path: "{{ item.path }}"
    state: absent
  with_items:
    - "{{ tmp_glob.files }}"

Ответ 2

Решение Bruce P работает, но для этого требуется файл сложения и становится немного грязным. Ниже приведено чистое решение.

Первая задача захватывает список имен файлов и сохраняет их в файлах_to_copy. Вторая задача добавляет каждое имя файла к указанному вами пути и создает символические ссылки.

- name: grab file list
  shell: ls /path/to/src
  register: files_to_copy
- name: create symbolic links
  file:
    src: "/path/to/src/{{ item }}"
    dest: "path/to/dest/{{ item }}"
    state: link
  with_items: files_to_copy.stdout_lines

Ответ 3

Файловый модуль действительно смотрит на сервере, где ansible работает для файлов при использовании with_fileglob и т.д. Поскольку вы хотите работать с файлами, которые существуют исключительно на удаленной машине, тогда вы можете сделать пару вещей. Один из подходов заключался бы в том, чтобы скопировать оболочку script в одну задачу, а затем вызвать ее в следующей задаче. Вы даже можете использовать тот факт, что файл был скопирован как способ запустить только script, если он еще не существует:

- name: Copy link script
  copy: src=/path/to/foo.sh
        dest=/target/path/to/foo.sh
        mode=0755
  register: copied_script

- name: Invoke link script
  command: /target/path/to/foo.sh
  when: copied_script.changed

Другим подходом было бы создание всей командной строки, которая делает то, что вы хотите, и вызывать ее с помощью модуля оболочки:

- name: Generate links
  shell: find ~/.zprezto/runcoms/z* -exec ln -s {} ~ \;

Ответ 4

Вы можете использовать with_lines для выполнения этого:

- name: Link Prezto files
  file: src={{ item }} dest=~ state=link
  with_lines: ls ~/.zprezto/runcoms/z*