【问题标题】:Ansible: How to use the file extracted from FIND module?Ansible:如何使用从 FIND 模块中提取的文件?
【发布时间】:2020-06-30 16:14:03
【问题描述】:

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

- 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

在这里,我希望将 file_name 的内容复制到 new.txt 中。它正在查找文件但无法复制它,因为它没有任何可以达到目的的属性,例如“内容”或“文件”。

用可能的方法给我建议。

【问题讨论】:

    标签: ansible


    【解决方案1】:

    find 总是会返回一个文件列表。

    如果您确定您的find 只会匹配单个文件,您可以复制您的文件以获取第一个元素(因此在files 数组中的位置0),然后获取它的path

    - copy:
        src: "{{ file_name.files.0.path }}"
        dest: /home/usr/Desktop/myinfo/new.txt
        remote_src: yes
    

    为了进一步调试,您可以这样做:

    - debug:
        msg: "{{ file_name }}"
    

    为了查看变量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 不是路径,而是文件。

    所以你也应该更正你的find 任务:

    - find:
        paths: '/home/usr/Desktop/files/'
        use_regex: yes
        pattern: (info)
        file_type: file
      register: file_name
    

    这次调试会产生:

    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_name.files.0.path

    - debug:
        msg: "{{ file_name.files.0.path }}"
    

    会成功

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

    这就是说,正如您的问题所写,您不需要查找,您可以这样做:

    - copy:
       src: home/usr/Desktop/files/info.txt
       dest: /home/usr/Desktop/myinfo/new.txt
       remote_src: yes
    

    【讨论】:

    • 哦,那是我的错,我不是要在 Find 模块中添加 ,而在这里发帖并没有检查。谢谢你。
    • 好吧,但是我想找一个文件(从一个几乎有 20 个文件的目录中),然后将内容复制到另一个文件中。如果我只有一个不需要查找的文件,则可以直接使用复制模块。也许还有其他方法可以做到这一点?我想在文件名中找到一些功能,如果文件具有这些功能,则选择该文件(例如,文件名中的“id”-userid.txt),然后将该文件的内容复制到其他文件。你得到了我要找的东西...?
    • 然后看答案的开头我提出了正确的copy语法
    • 谢谢它的工作:} 不知道(file_name.files.0.path),我们可以像这样提取文件。这太棒了!
    • @Mizkax 最重要的是:您不必知道它。也许你最终会记住它,因为你会使用find 太多以至于它会打印在你的记忆中。但是你可以推断这个调试结果并分析返回的列表/字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2021-06-27
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多