Ansible:如何使用从FIND模块提取的文件?

Ansible:如何使用从FIND模块提取的文件?,ansible,Ansible,我被这件小事缠住了。我已经根据模式找到了一个文件,现在我想将该文件的内容复制到另一个文件。另一个文件可能是空的,也可能不是空的。因此,另一个文件中的全部内容应替换为找到的文件。这两个文件都存在于目标计算机中 - find: paths: '/home/usr/Desktop/files/info.txt' use_regex: yes pattern: (info) file_type: file register: file_name - copy: sr

我被这件小事缠住了。我已经根据模式找到了一个文件,现在我想将该文件的内容复制到另一个文件。另一个文件可能是空的,也可能不是空的。因此,另一个文件中的全部内容应替换为找到的文件。这两个文件都存在于目标计算机中

- find:
   paths: '/home/usr/Desktop/files/info.txt'
   use_regex: yes
   pattern: (info)
   file_type: file
  register: file_name
 
- copy:
   src: "{{file_name}}"
   dest: /home/usr/Desktop/myinfo/new.txt
   remote_src: yes
在这里,我希望将文件名的内容复制到new.txt。它正在查找文件,但无法复制它,因为它没有任何像“content”或“files”这样的属性


向我推荐一些可能的方法。

find
将始终返回文件列表

如果您确信您的
find
将只匹配一个文件,那么您可以复制文件以获取第一个元素(因此在
files
数组中的位置
0
),然后获取其
路径

-复制:
src:“{file_name.files.0.path}”
dest:/home/usr/Desktop/myinfo/new.txt
遥控器:是的

为了进一步调试,您可以执行以下操作:

-调试:
msg:“{{file_name}}”
为了查看变量
文件名的结构并更正您的剧本

在您的情况下,这将使您:

ok: [localhost] => {
    "msg": {
        "changed": false,
        "examined": 0,
        "failed": false,
        "files": [],
        "matched": 0,
        "msg": "/home/usr/Desktop/files/info.txt was skipped as it does not seem to be a valid directory or it cannot be accessed\n"
    }
}
因为,
/home/usr/Desktop/files/info.txt
不是路径,而是文件

因此,您还应该更正
查找任务:

-查找:
路径:'/home/usr/Desktop/files/'
使用正则表达式:是
模式:(信息)
文件类型:文件
寄存器:文件名
这次调试将产生:

ok: [localhost] => {
    "msg": {
        "changed": false,
        "examined": 1,
        "failed": false,
        "files": [
            {
                "atime": 1593535103.2879748,
                "ctime": 1593535103.2879748,
                "dev": 112,
                "gid": 0,
                "gr_name": "root",
                "inode": 2360831,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "mode": "0644",
                "mtime": 1593535103.2879748,
                "nlink": 1,
                "path": "/home/usr/Desktop/files/info.txt",
                "pw_name": "root",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 0,
                "uid": 0,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": false
            }
        ],
        "matched": 1,
        "msg": ""
    }
}
然后调试
file\u name.files.0.path

-调试:
msg:“{file_name.files.0.path}”
会让步

ok: [localhost] => {
    "msg": "/home/usr/Desktop/files/info.txt"
}

也就是说,正如您的问题所写,您不需要查找,您只需执行以下操作:

-复制:
src:home/usr/Desktop/files/info.txt
dest:/home/usr/Desktop/myinfo/new.txt
遥控器:是的

find
将始终返回文件列表

如果您确信您的
find
将只匹配一个文件,那么您可以复制文件以获取第一个元素(因此在
files
数组中的位置
0
),然后获取其
路径

-复制:
src:“{file_name.files.0.path}”
dest:/home/usr/Desktop/myinfo/new.txt
遥控器:是的

为了进一步调试,您可以执行以下操作:

-调试:
msg:“{{file_name}}”
为了查看变量
文件名的结构并更正您的剧本

在您的情况下,这将使您:

ok: [localhost] => {
    "msg": {
        "changed": false,
        "examined": 0,
        "failed": false,
        "files": [],
        "matched": 0,
        "msg": "/home/usr/Desktop/files/info.txt was skipped as it does not seem to be a valid directory or it cannot be accessed\n"
    }
}
因为,
/home/usr/Desktop/files/info.txt
不是路径,而是文件

因此,您还应该更正
查找任务:

-查找:
路径:'/home/usr/Desktop/files/'
使用正则表达式:是
模式:(信息)
文件类型:文件
寄存器:文件名
这次调试将产生:

ok: [localhost] => {
    "msg": {
        "changed": false,
        "examined": 1,
        "failed": false,
        "files": [
            {
                "atime": 1593535103.2879748,
                "ctime": 1593535103.2879748,
                "dev": 112,
                "gid": 0,
                "gr_name": "root",
                "inode": 2360831,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "mode": "0644",
                "mtime": 1593535103.2879748,
                "nlink": 1,
                "path": "/home/usr/Desktop/files/info.txt",
                "pw_name": "root",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 0,
                "uid": 0,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": false
            }
        ],
        "matched": 1,
        "msg": ""
    }
}
然后调试
file\u name.files.0.path

-调试:
msg:“{file_name.files.0.path}”
会让步

ok: [localhost] => {
    "msg": "/home/usr/Desktop/files/info.txt"
}

也就是说,正如您的问题所写,您不需要查找,您只需执行以下操作:

-复制:
src:home/usr/Desktop/files/info.txt
dest:/home/usr/Desktop/myinfo/new.txt
遥控器:是的

哦,这是我的错,我不是有意添加“查找”模块,而在这里发布的帖子并没有检查这一点。谢谢。好吧,但我想找到一个文件(从一个几乎有20个文件的目录中),然后将内容复制到另一个文件。复制模块可以直接使用,如果我只有一个文件,我不需要找到。也许还有别的办法?我想在文件名中找到一些功能,如果文件有这些功能,请选择该文件(例如,file name-userid.txt中的“id”),然后将该文件的内容复制到其他文件。你知道我在找什么吗…?然后看看答案的开头,我提出了正确的
copy
syntaxThank it worked:}不知道(file_name.files.0.path),我们可以像这样提取文件。这太棒了@Mizkax最重要的是:你不必知道。也许你最终会记住它,因为你将使用
find
太多,以至于它会打印在你的记忆中。但是你可以从调试结果和分析返回的列表/dict中扣除。哦,这是我的错,我不是有意添加Find模块,而在这里发布时没有检查这一点。谢谢。好吧,但我想找到一个文件(从一个几乎有20个文件的目录中),然后将内容复制到另一个文件。复制模块可以直接使用,如果我只有一个文件,我不需要找到。也许还有别的办法?我想在文件名中找到一些功能,如果文件有这些功能,请选择该文件(例如,file name-userid.txt中的“id”),然后将该文件的内容复制到其他文件。你知道我在找什么吗…?然后看看答案的开头,我提出了正确的
copy
syntaxThank it worked:}不知道(file_name.files.0.path),我们可以像这样提取文件。这太棒了@Mizkax最重要的是:你不必知道。也许你最终会记住它,因为你将使用
find
太多,以至于它会打印在你的记忆中。但您可以从调试结果和分析返回的列表/目录中扣除此项。