我正在通过Ansible执行shell命令。
有时我没有完整的foldername。假设我有dirname solr4.7.0
。
在shell中我可以输入cd solr*
。
但在ansible中,我无法做到:
chdir=/var/solr*
有解决方法吗?
答案 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