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?
Ответы
Ответ 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*