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

时间:2014-03-18 10:10:04

标签: linux ansible ansible-playbook

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

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

在shell中我可以输入cd solr*

但在ansible中,我无法做到:

chdir=/var/solr*

有解决方法吗?

5 个答案:

答案 0 :(得分:12)

没有。例如chdir=模块的command参数不支持通配符。

您可以使用register variable来存储ls命令的输出,从而完成您想要的任务:

- shell: ls -d solr*
  register: dir_name
- command: some_command
  args:
    chdir: "{{ dir_name.stdout }}"

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

答案 1 :(得分:7)

正如Larsks所写,密钥是使用string = abc1234,但代码不适用于我当前的ansible版本。所以这里纠正了一个:

1234

答案 2 :(得分:1)

这样定义的任务可以解决问题:

- name: Move internal directories and files
  command: bash -c 'mv /tmp/parent-dir/*  /opt/destination/'

答案 3 :(得分:1)

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

我也很难做到: for index, row in frame.iterrows(): # all rows from df data = row[1].split(";") # get row values - splitting for one_data in data: # loop all values of row for key, val in categories_dict.items(): if one_data in val: data.remove(one_data) data.append(key)

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

答案 4 :(得分:-2)

有点hacky,但是我发现,如果将使用通配符的命令放入脚本中,然后使用ansible'script'命令运行该脚本,那么通配符就可以了。

- name: "some command that needs to use a wildcard"
  script: /script_containing_wildcard_commands.sh