You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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压缩包放到宿主机,用file provision先拷贝到虚拟机,再执行解压,避免重复下载。

内容的提问来源于stack exchange,提问作者Dawit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:45:38