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
太多,以至于它会打印在你的记忆中。但您可以从调试结果和分析返回的列表/目录中扣除此项。