我需要为我的EMR群集(EMR AMI 4.3)中的所有实例更新/etc/hosts
。
整个脚本不过是:
#!/bin/bash
echo -e 'ip1 uri1' >> /etc/hosts
echo -e 'ip2 uri2' >> /etc/hosts
...
此脚本需要以sudo
的身份运行,否则将失败。
从这里:https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html#bootstrapUses
引导操作默认情况下以Hadoop用户身份执行。您可以使用 sudo 以root权限执行引导操作。
好消息...但是我不知道该怎么做,也找不到一个例子。
我尝试了很多事情...包括...
1=1 sudo bash /home/hadoop/myDir/myScript.sh
的run-if引导程序运行本地副本。我始终如一:
在主实例(i-xxx)上,引导操作2返回了非零的返回码
如果我检查“ Setup hadoop调试”步骤的日志,则没有任何提示。
EMR摘要设置(按顺序):
因此,似乎存在一定的风险,因为在安装hadoop之前我以用户Hadoop的身份在搞乱,所以我可能会在上面弄乱东西,但我无法想象。
我认为一定是我的脚本未以“ sudo”运行,并且无法更新/etc/hosts
。
我的问题...如何在EMR上使用引导操作(或其他操作)以sudo的形式运行简单的shell脚本? ...专门更新/etc/hosts
?
答案 0 :(得分:3)
在作为EMR引导操作运行的shell脚本中使用sudo时,我没有遇到任何问题,因此它应该可以工作。您可以使用简单的脚本来测试它是否可以正常工作,该脚本只执行“ sudo ls / root”。
您的脚本正在尝试通过以下方式重定向stdout来附加到/ etc / hosts:
sudo echo -e 'ip1 uri1' >> /etc/hosts
这里的问题是,当使用sudo运行回显时,重定向(>>)却没有。它由基础的hadoop用户运行,该用户无权写入/ etc / hosts。解决方法是:
sudo sh -c 'echo -e "ip1 uri1" >> /etc/hosts'
这将使用sudo在shell中运行整个命令,包括stdout重定向。