这是我的角色结构:
$ tree my_role
.
├── my_role
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ │ └── foo.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
└── playbook.yml
我想 cat 位于 tasks/main.yml 文件夹中的文件 foo.conf。
我试图通过提供相关路径直接在 tasks.yml 中使用,但是它说找不到文件。
最佳答案
我几乎可以肯定your exact requirement可以改写为:
How can I get the content of a file situated in my role's
files
folder on the controller to use it in a task running on any host?
答案是使用 file lookup :
- name: file lookup demo
debug:
msg: "{{ lookup('file', 'foo.conf') }}"
在 shell
任务中,这比 cat
有很多优势:
- 它直接提供您要查找的内容,而无需运行单独的任务、注册它的结果并获取特定的 .
stdout
键。 - 无论目标主机如何,它都会工作
lookup
always run on the controller - 它可以处理位于 file search path 中的任何文件无需指定其确切路径,也无需指定该任务的定义位置(例如,在剧本中直接
tasks
如果您之前使用过角色...) - 它尊重 ansible 的良好实践:当已经有一个模块或过滤器为您完成工作时,它不会使用
shell
,并且开箱即用是幂等的。
如果我上面的假设是错误的,而你仍然非常想运行 cat
,answer from @Marco Badelli (虽然是一种不好的做法)将起作用,但前提是您直接从您的角色和本地主机上运行 shell
任务,因为该路径不存在于任何其他远程目标上。
在这种情况下更好的选择是使用 pipe lookup
- name: pipe lookup demo
debug:
msg: "{{ lookup('pipe', `cat ' ~ role_path ~ '/files/foo.conf`) }}"
虽然这演示了如何轻松获得在 Controller 上运行的任何命令的结果,但在这种情况下,它确实没有比文件查找明显的优势。例如,只有当任务是在您的角色中定义的,而不是来自其他角色或剧本任务时,它才会起作用(因为使用了 role_path
魔术变量)。
关于ansible - cat 位于 Ansible 文件目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67305395/