在用户数据运行命令期间未为 ec2-user 设置 $HOME

lea*_*rnd 5 amazon-ec2 amazon-web-services

我将以下命令放入运行 RedHat 8 AMI ( ami-0fc841be1f929d7d1) 的 EC2 的用户数据中,当它们运行时,mkdir 尝试在根目录创建 .kube,在我看来,$HOME当时尚未设置。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Run Code Online (Sandbox Code Playgroud)

以下是日志来自/var/log/user-data.log

+ mkdir -p /.kube
+ sudo cp -i /etc/kubernetes/admin.conf /.kube/config
++ id -u
++ id -g
+ sudo chown 0:0 /.kube/config
Run Code Online (Sandbox Code Playgroud)

当我通过 SSH 连接到实例时,它$HOME被正确设置为 /home/ec2-user。

你能告诉我我在这里做错了什么吗?

谢谢

Pie*_*rre 7

配置 EC2 服务器后,用户数据脚本将以 root 用户身份运行,因此 $HOME 为空。您可以做的是在用户数据脚本的顶部定义 HOME 环境变量,如下所示(在此处插入用户的主目录):

export HOME=/home/ubuntu
Run Code Online (Sandbox Code Playgroud)

我已经尝试过并且它有效(我安装了 NVM、SDKMAN、sbt、java、git、docker;一切正常)。您可能需要在用户数据脚本末尾执行一些 chown 操作,将某些文件的所有者更改回您的用户。例如,如果您的用户数据在您的主目录中设置了一些文件:

chown ubuntu ~/.foo/bar.properties
Run Code Online (Sandbox Code Playgroud)


Chr*_*ams 2

您正在以 sudo 身份运行,众所周知,它会更改使用用户 shell(例如$HOME)以及基于 shell 上下文的环境变量,例如ssh-agent建立的环境变量。

通常,您可以通过env_keep/etc/sudoers. 更多信息请参见此处,修改此文件时请小心。

Defaults  env_keep=HOME
Run Code Online (Sandbox Code Playgroud)

否则,如果您不想进行上述更改,请确保您拥有执行此操作的权限,而无需运行sudo或传递绝对路径值。

无论如何,我通常会避开重要配置的用户数据,而是使用AnsibleChefPuppet等配置工具提前构建一个预烘焙的 AMI,并按照您想要的方式进行配置。

或者,由于无论如何这都在用户数据中,因此您不太可能已经配置了 sudoers 配置,您应该只指定路径。