这是我的角色结构:
\n$ tree my_role\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_role\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 defaults\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 files\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo.conf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 handlers\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 meta\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tasks\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 inventory\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.yml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 vars\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 playbook.yml\nRun Code Online (Sandbox Code Playgroud)\n我想对位于tasks/main.yml 中的文件文件夹中的文件foo.conf 进行cat。
\n我尝试通过提供相关路径直接在tasks.yml中使用,但是,它说找不到该文件。
\n我几乎确定您的确切要求可以改写为:
如何获取位于
files控制器上我的角色文件夹中的文件内容,以便在任何主机上运行的任务中使用它?
答案是使用文件查找:
- name: file lookup demo
debug:
msg: "{{ lookup('file', 'foo.conf') }}"
Run Code Online (Sandbox Code Playgroud)
这比cat在shell:
stdout钥匙。lookup始终在控制器上运行tasks如果您的角色以前使用过,则直接在 playbook 中...)shell它尊重 ansible 的良好实践:当已经有一个模块或过滤器为您完成这项工作并且它是开箱即用的幂等时,它不会使用。如果我的上述假设是错误的,并且您仍然非常想跑步cat,请回答@Marco Badelli(尽管是一个不好的做法)将起作用,但前提是您shell直接从您的角色并在本地主机上运行任务,因为该路径不会存在于任何其他设备上远程目标。
在这种情况下,更好的选择是使用管道查找
- name: pipe lookup demo
debug:
msg: "{{ lookup('pipe', `cat ' ~ role_path ~ '/files/foo.conf`) }}"
Run Code Online (Sandbox Code Playgroud)
尽管这演示了如何轻松获取在控制器上运行的任何命令的结果,但在这种情况下,与文件查找相比,它确实没有明显的优势。例如,只有当任务是在您的角色内部定义的,而不是从其他角色或剧本任务定义的(因为使用了role_pathmagic 变量)时,它才有效。