我试图使用ansible删除目录中的所有文件,同时保留目录。为此,我在任务上使用with_fileglob
键将所有文件作为item
变量从该目录中移出。我创建了一个最小的示例,在这里显示了我的问题:
Vagrantfile:
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
local.yml:
- name: Test
hosts: all
become: true
tasks:
- name: Test debug
debug:
msg: "{{ item }}"
with_fileglob:
- "/vagrant/*"
我希望获得/ vagrant目录中每个文件的调试消息-因为这是通过Vagrant与VM同步的目录,所以我应该获得有关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
在这里指的是什么预期路径?我已经尝试过使用多个fileglob,但是它们都以这种方式失败了,我还缺少什么?
答案 0 :(得分:2)
由于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
遍历项目。
答案 1 :(得分:1)
Ansible查找插件在本地计算机(启动Ansible的计算机)上执行,而不是在远程计算机上执行。
https://docs.ansible.com/ansible/latest/plugins/lookup.html
查阅插件使Ansible可以从外部源访问数据。这个 除了联系外部,还可以包括读取文件系统 数据存储和服务。像所有模板一样,这些插件是 在Ansible控制机器上进行评估,而不是在目标/遥控器上进行评估。