在Ansible ad-hoc中运行子 shell 命令

5
我希望在一个临时的Ansible命令中运行一个子Shell命令。
这是我想要做的事情:
sudo ansible myservers -m shell -a "touch /var/tmp/$(uname -n)"

它创建了远程文件,但使用本地主机的名称命名,它不会在远程服务器上执行uname命令。

好吧,有人删掉了Ansible标签,我不知道为什么... - tonio94
1
我又添加了Ansible标签... - nwinkler
2个回答

10

我找到了解决方案:

sudo ansible myservers -m shell -a '/bin/bash -c "toto=`uname -n` ; touch /var/tmp/\$toto.json;"'

看起来我必须启动一个shell来执行子shell命令,但这样可以正常工作。


1

问题出在你的命令中双引号。 这意味着双引号之间的内容(包括你的$(...))将由执行此命令的 shell(即你的 Ansible 控制节点)解释,因此你会得到 Ansible 控制节点名称。

如果你使用单引号代替双引号,则控制节点的 shell 就不会解释内容,并会将其“原样”传递给 Ansible 主机。然后,这些 Ansible 主机将解释$(...),因此你将获得目标主机名。

请参考 http://www.gnu.org/software/bash/manual/html_node/Single-Quotes.htmlhttps://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html

因此,可以通过以下方式解决:

ansible myservers -m shell -a 'touch /var/tmp/$(uname -n)'

(我不明白为什么你要使用sudo

或者(如果你清单中的主机名足够好),你可以使用:

ansible myservers -m shell -a 'touch /var/tmp/{{ inventory_hostname }}'

顺便提一下,如果您在playbook中使用此命令,另一个解决方案是使用Ansible事实:ansible_hostnameansible_fqdn等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接