自定义 GCE Ubuntu VM 映像

Customizing a GCE Ubuntu VM image

我有一个从 VirtualBox 虚拟机访问的 Google 云平台帐户。我将 Google Compute Engine 用于我目前正在处理的项目,我必须根据那里可用的 Ubuntu 14.04 图像创建自定义图像。

我通过 ssh 进入 Ubuntu 14.04 实例,(从我的 Vbox VM 终端)安装 Matlab 编译器 运行time,并下载我需要的一些其他文件。我按照文档中的步骤创建了自定义图像。

但是,现在我所做的更改只有在我从我的 Vbox VM 终端进行 SSH 时才可用。我需要能够 运行 某个 matlab 程序 通过启动脚本,我怎样才能使所有使用此图像的用户都可以访问我所做的自定义设置?有没有一种方法可以做到这一点,而不必通过从开发人员控制台ssh'ing并重做所有更改来进行编辑?

编辑: 我不认为我很清楚所以我会举一些例子。假设我的 Google 帐户是 alexanderlang。当我从开发人员控制台通过 ssh 进入根据我的自定义图像创建的实例时,bash 提示符如下所示:

alexanderlang@myinstance $

我的 Vbox 用户名是 alex,当我从我的 vbox 终端 ssh 进入同一个实例时,bash 提示如下:

alex@myinstance $

alex@myinstance可以运行matlab程序,但是alexanderlang@myinstance不能。我说的是同一个实例,是从同一个图像创建的。我认为这可能与我的自定义图像的 ssh 密钥有关,但我不知道如何更改或删除这些密钥。

您可以使用 Packer 从库存 GCE VM 映像创建派生映像。 Packer 将使您可以非常轻松地执行以下操作:

  • 使用您指定的映像启动 GCE VM
  • 运行 一些自定义步骤,例如 shell 脚本,或 Chef/Puppet/etc.
  • 将生成的图像保存在您的 Google Cloud Platform 项目中

然后,您可以使用新创建的映像启动任意数量的新 VM。

请注意,由于您的 VM 映像将存储在 Google 云存储中,因此您需要为其使用的 space 付费。 Current pricing 对于 Google 云存储标准 class 是 0.026 美元/GB/月。典型的 VM 映像应小于 1GB。

您可以通过 my GitHub repo 查看我如何使用 Packer 构建 VM 并在其上预安装 Ambari 的完整示例。

当您使用 Developers Console 或 gcloud 通过 ssh 连接到 VM 实例时,通过在 VM 上设置元数据动态创建用户帐户(如果它尚不存在)。问题是:每个工具如何选择您的用户名?

当您使用 Google Developers Console 时,它​​知道的关于您的唯一信息是您的 Google 帐户名,因此它会使用该名称,例如 <first-name>_<last-name> 或类似名称。

当您通过 gcloud 连接到您的实例时,它知道 $USER 的值,因此它会使用它。

请注意,无论哪种情况,您的帐户都具有无密码 sudo 访问权限,因此如果您想从一个帐户切换到另一个帐户,您可以 运行:

sudo su alex

alexanderlang 身份登录后,您就可以访问 alex 可以访问的所有程序。

同样,您可以运行:

sudo su alexanderlang

alex 身份登录时执行相反的操作。


启动脚本 运行 作为 root。要以另一个用户的身份 运行 命令,您需要做两件事:

  • 更改为该用户名
  • 运行 以该用户身份执行命令

sudo su alex 将创建一个新的 shell 并因此忽略脚本的其余部分(直到您手动退出用户 shell,这不是您想要的)。

您可以使用 sudo su alex -c 'command to run' 但由于您想要 运行 的是一个复杂的脚本,您需要先将脚本保存到文件中,然后 运行 它。

您的选择是:

  1. 预先创建 shell 脚本到 运行
  2. 从启动脚本动态生成它

如果脚本永远不变,则执行 (1) 很容易。对于频繁更改的脚本(听起来像是许多动态创建的 VM),您希望使用选项 (2)。

以下是在启动脚本中执行此操作的方法:

cat > /tmp/startup-script-helper.sh <<EOF
# ... put the script contents here ...
EOF

sudo su alex -c '/tmp/startup-script-helper.sh'