Я пытаюсь использовать ansible для удаления всех файлов в каталоге, сохраняя при этом каталог. С этой целью я использую клавишу with_fileglob
в задаче, чтобы получить все файлы из этого каталога в виде item
переменных. Я создал минимальный пример, который показывает мою проблему здесь:
Бродячий файл:
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.provision :ansible do |ansible|
ansible.limit = "all"
ansible.playbook = "local.yml"
end
end
локальный.yml:
- name: Test
hosts: all
become: true
tasks:
- name: Test debug
debug:
msg: "{{ item }}"
with_fileglob:
- "/vagrant/*"
Я ожидаю получить отладочное сообщение для каждого файла в каталоге /vagrant — поскольку это каталог, синхронизированный с виртуальной машиной через Vagrant, я должен получить сообщение для Vagrantfile и для local.yml. Вместо этого я получаю следующее запутанное предупреждение:
PLAY [Test] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [default]
TASK [Test debug] **************************************************************
[WARNING]: Unable to find '/vagrant' in expected paths (use -vvvvv to see
paths)
PLAY RECAP *********************************************************************
default : ok=1 changed=0 unreachable=0 failed=0
О каких ожидаемых путях здесь идет речь? Я пробовал это с несколькими файловыми глобусами, и все они терпят неудачу таким образом, что мне не хватает?
Плагины Ansible для поиска выполняются на локальной машине (где вы запускаете Ansible), а не на удаленной(ых).
https://docs.ansible.com/ansible/latest/plugins/lookup.html
Lookup plugins allow Ansible to access data from outside sources. This can include reading the filesystem in addition to contacting external datastores and services. Like all templating, these plugins are evaluated on the Ansible control machine, not on the target/remote.
Поскольку fileglob
работает только на локальном компьютере, я протестировал альтернативу find
и хочу привести здесь пример. Если мы хотим найти все файлы *.jar
, это можно сделать так:
- name: Find jar files
find:
paths: "{{ install_jar_path }}"
patterns: "*.jar"
register: jar_src_file
changed_when: False
jar_src_file
теперь массив. У каждого предмета есть свойство path
.
- set_fact:
first_jar: "{{ jar_src_file.files[0].path }}"
Это даст вам путь к первому файлу jar для целей тестирования. Вы можете перебирать элементы, например, используя with_items
, если это необходимо.
@NateMara Вы можете использовать найти модуль