Text 使用Ansible';找不到确切的文件名;s查找模块

Text 使用Ansible';找不到确切的文件名;s查找模块,text,ansible,find,Text,Ansible,Find,我能够在/app目录下找到modules.jar,如下输出所示: find /app -name modules.jar 2>/dev/null /app/axmw/TEST/jboss-eap-7.2.5.CP/misc/modules.jar /app/jboss/modules.jar 如您所见,我们发现了两个文件结果 注意:我需要文件modules.jar的精确匹配 但是,当我使用ansible find模块搜索相同的匹配项时,会发现零个匹配项 tasks: -

我能够在
/app
目录下找到
modules.jar
,如下输出所示:

 find /app -name modules.jar 2>/dev/null

/app/axmw/TEST/jboss-eap-7.2.5.CP/misc/modules.jar
/app/jboss/modules.jar
如您所见,我们发现了两个文件结果

注意:我需要文件
modules.jar的精确匹配

但是,当我使用ansible find模块搜索相同的匹配项时,会发现零个匹配项

  tasks:

    - name: Debug check if Profile Path or server name are valid by checking PATH
      find:
        paths: /app
        file_type: file
        patterns: 'modules.jar'
        excludes: 'log,tmp,.installation'
      tags: always
      register: jarfound

    - name: Number of modules.jar found under /app
      debug:
        msg: "{{ jarfound.matched }}"
输出:

TASK [Debug check if Profile Path or server name are valid by checking PATH] *******************************************************************************************
ok: [10.9.156.126]

TASK [Number of modules.jar found under /app] ********************************************************************************************************************
ok: [10.9.156.126] => {
    "msg": "0"
}
我也尝试了下面的模式,但每次都匹配为“0”

您能解释一下原因吗?

您的任务参数列表中缺少了递归指令。如中所述,此参数的默认值为
no
,因此您无法找到顶级
/app
路径子目录下的文件。只需按如下所示添加
recurse
,即可找到该文件:

  tasks:

    - name: Debug check if Profile Path or server name are valid by checking PATH
      find:
        paths: /app
        file_type: file
        recurse: yes
        patterns: 'modules.jar'
        excludes: 'log,tmp,.installation'
      tags: always
      register: jarfound

    - name: Number of modules.jar found under /app
      debug:
        msg: "{{ jarfound.matched }}"
[Update]查看上一条评论(关于忽略
.installation
文件夹),
excludes
参数仅适用于项目的basename(摘自文档-其基名与excludes模式匹配的项目从模式匹配中剔除)。因此,
排除
不适用于此场景

您有以下选项来获得您想要的。根据场景中的适用性和适用性,您可以使用这些选项中的任何一个

  • 我注意到
    .installation
    文件夹下的文件名是misc.modules.jar,因此,如果切换到regex而不是当前的globs(shell)模式,您可以简单地排除它。为此,添加
    使用_regex:yes
    并将模式更改为
    modules\\\.jar
    ,以使此文件名非常明确。这将起作用,因为与shell模式不同,regex需要匹配整个文件名,而不仅仅是部分文件名
  • 使用find两次,首先使用
    file\u type:directory
    ,您可以将“log、tmp、.installation”排除在外,并获取所有其他目录<代码>排除
  • 这次将起作用,因为您正在搜索文件夹,并且每个文件夹的基本名称将与此
    排除
    匹配。在下面的
    find
    task搜索文件名时,使用此任务中注册的o/p作为
    path
    。我仍然建议在secondfind中使用regex,以进一步限制对整个文件名的搜索
  • 任务中注册的o/p进行后期处理,查找
    任务,并从列表中筛选出包含要明确删除的文件夹的元素。看看哪一个有多个用于此目的的解决方案

  • 如果我给出
    recurse:yes
    我会得到包含
    .installation
    文件夹的文件的输出,我已经排除了该文件夹,如下所示:
    “msg”:“在/app/jboss/.installation/patches/misc.modules.jar找到多个jar”
    你能建议吗?用解决方案更新了答案以解决忽略中间文件夹的问题。