Vagrantfile条件判断语句报错,需实现Hadoop重复安装规避逻辑
Vagrant Hadoop集群部署:解决重复下载Hadoop的语法错误问题
错误根源
你混淆了Vagrantfile的Ruby语法和Shell脚本语法:
- 外层
if node.vm.hostname == "node1"是Ruby代码,必须用end闭合,但你错误使用了Shell的fi,导致语法不匹配。 - 试图在宿主机运行的Ruby代码中判断虚拟机内的目录是否存在,这是无效的——目录存在性判断必须放到虚拟机中执行的Shell脚本里。
修复方案
下面两种方案都能实现"仅当Hadoop未安装时才下载"的需求,且解决语法错误:
方案一:用Vagrant的only参数指定节点(推荐写法)
这种写法更符合Vagrant的规范,代码更简洁:
# 仅在node1节点执行Hadoop部署脚本 node.vm.provision "shell", inline: <<-SHELL, only: "node1" # 虚拟机内判断Hadoop是否已安装 if [ ! -d "/home/vagrant/hadoop" ]; then wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz tar -xvzf hadoop-3.3.4.tar.gz mv hadoop-3.3.4 hadoop fi SHELL
方案二:保留Ruby节点判断(正确闭合语法)
如果坚持用Ruby判断节点,要确保Ruby代码用end闭合,同时将目录判断逻辑移入Shell脚本:
if node.vm.hostname == "node1" node.vm.provision "shell", inline: <<-SHELL if [ ! -d "/home/vagrant/hadoop" ]; then wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz tar -xvzf hadoop-3.3.4.tar.gz mv hadoop-3.3.4 hadoop fi SHELL end # Ruby代码的if必须用end闭合
注意事项
- 执行
vagrant provision时,虚拟机内的Shell脚本会检查/home/vagrant/hadoop目录,只有目录不存在时才会执行下载和解压操作。 - 如果需要加速下载,可以提前将Hadoop压缩包放到宿主机,用
fileprovision先拷贝到虚拟机,再执行解压,避免重复下载。
内容的提问来源于stack exchange,提问作者Dawit
相关产品推荐
相关产品推荐

