如何在ansible命令中提到通配符

use*_*180 13 linux ansible ansible-playbook

我正在通过Ansible执行shell命令.

有时我没有完整的foldername.假设我有dirname solr4.7.0.

在shell中我可以输入cd solr*.

但在ansible我做不到:

chdir=/var/solr*

有没有解决方法?

lar*_*sks 13

否.chdir=例如,command模块的参数不支持通配符.

您可以使用寄存器变量来完成您想要的操作以存储ls命令的输出:

- shell: ls -d solr*
  register: dir_name
- command: some_command
  args:
    chdir: "{{ dir_name.stdout }}"
Run Code Online (Sandbox Code Playgroud)

但坦率地说,这是一个丑陋的解决方案.你最好只使用实际的目录名称.如果它在不同的主机上不同,您可以使用主机变量来适当地设置它.

  • 其实,我觉得这很棒。有时您不知道其中包含下载的存档的内部版本号。 (2认同)

Sas*_*sha 7

正如Larsks写的关键是要使用register,但代码不能用于我当前的ansible版本.所以这里纠正一个:

- shell: ls -d solr*
  register: dir_name

- command: chdir={{ item }} some_command
  with_items: dir_name.stdout_lines
Run Code Online (Sandbox Code Playgroud)


小智 5

在命令行上使用 ansible 来执行临时命令,通配符非常有用,例如查看某个文件是否存在于所有系统上。

我也很难做到: $ ansible production -a "ls /mypath/*xxx*"

但将其包装在 bash -c '...' 中有效: $ ansible production -a "bash -c 'ls /mypath/*xxx*'"