ansible - cat 位于 Ansible 文件目录中的文件

标签 ansible

这是我的角色结构:

$ 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,并且开箱即用是幂等的。

如果我上面的假设是错误的,而你仍然非常想运行 catanswer 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/

相关文章:

ansible - 多环境部署

debian - Ansible nmcli 模块 - 需求问题

ansible - 带有列表和字典的嵌套循环

ansible - 文件行 : Don't insert lines if they already exist

ansible - 在 ansible 中以相反的顺序使用 concat 映射

svn - 文件夹已存在,但它不是 Ansible Subversion check out 中的 Subversion 存储库错误

ansible - 在 ansible playbook 文件中指定 ssh key

linux - 无法导入 docker 或 docker-py - 没有名为 docker 的模块

sublimetext3 - Ansible Vault 不使用 Sublime Text 保存更改

python - 如何提示用户输入主机名,然后从大列表中收集主机名