使用ansible ad-hoc命令检测目录时环境变量HOSTNAME不显示问题
问题根因
该现象由shell变量提前在本地解析导致:
- 你使用双引号
"包裹了-a参数后的shell命令,在控制端执行ansible命令时,控制端本地的shell会优先解析双引号范围内的$HOSTNAME变量 - 若控制端环境的
$HOSTNAME变量为空,解析后下发到远端主机执行的实际命令会变为:
因此最终仅返回if test -d /the/dir/; then echo ' exists'; fiexists结果。
修复方案
方案1:外层改用单引号包裹命令
单引号内的变量不会被本地shell解析,命令会原封不动下发到远端,由远端shell解析自身的$HOSTNAME变量:
ansible all -i hosts.list -m shell -a 'if test -d /the/dir/; then echo "$HOSTNAME exists"; fi'
方案2:双引号内转义$符
如果必须使用双引号(例如需要嵌套插入控制端本地变量的场景),给$添加反斜杠转义,避免本地提前解析变量:
ansible all -i hosts.list -m shell -a "if test -d /the/dir/; then echo '\$HOSTNAME exists'; fi"
可选方案:调用Ansible内置主机变量
如果不想依赖远端系统的环境变量,也可以直接使用Ansible采集的内置主机名变量,该变量由控制端解析后下发:
ansible all -i hosts.list -m shell -a 'if test -d /the/dir/; then echo "{{ ansible_hostname }} exists"; fi'
内容的提问来源于stack exchange,提问作者darego101
相关产品推荐
相关产品推荐

