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

时间:2018-01-23 14:17:59

标签: bash ansible

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

这是我想要做的:

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

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

2 个答案:

答案 0 :(得分:5)

我找到了解决方案:

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

似乎我必须启动一个shell来执行子shell命令,但它可以工作。

答案 1 :(得分:0)

问题来自命令中的双引号。 它们意味着双引号(包括您的$(...))之间的内容将由执行此命令的外壳程序(您的Ansible控制节点)解释,因此您将获得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 }}'

顺便说一句,如果您最终在剧本中使用此命令,另一种解决方案是使用Ansible事实:例如ansible_hostnameansible_fqdn