我想在ad-hoc Ansible命令中运行子shell命令。
这是我想要做的:
sudo ansible myservers -m shell -a "touch /var/tmp/$(uname -n)"
它创建远程文件,但使用本地主机的名称,它不会在远程服务器上执行uname命令。
答案 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.html和https://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_hostname
或ansible_fqdn