HashiCorp Packer构建GCP Ubuntu镜像后如何获取SSH密码创建sudo用户
Packer 构建阶段的 SSH 密码是什么?
你当前使用的googlecompute构建器默认没有设置任何静态SSH密码。构建过程中Packer会自动生成临时SSH密钥对,注入到临时构建实例里完成连接认证,构建结束后临时实例会被销毁,临时密钥也直接作废,不存在通用的预设SSH密码。
Ubuntu 20.04的官方GCE镜像默认就禁用了密码方式的SSH登录,只允许密钥认证。
构建后如何获取root、packer等sudo权限用户的密码?
默认配置下构建出的镜像里,root、packer用户都没有设置可用密码,你找不到所谓的"默认密码"——因为根本就没配置。
如果你需要用密码登录相关账号,必须在Packer构建阶段通过provisioner主动给对应用户设置密码;如果已经构建完镜像没做这个配置,只能在使用该镜像创建实例后,通过GCE平台注入的SSH密钥登录实例,再手动给用户设置密码,没有其他捷径。
如何创建拥有sudo权限的用户账户
有两种实现方式,推荐第一种直接把配置固化到镜像里,后续用该镜像创建的所有实例都自带配置好的sudo用户,不用重复操作。
方式一:在Packer构建流程中直接配置(推荐)
你原来的packer.json有个小语法问题:builders数组最后一项多了多余的尾逗号,直接运行会报JSON解析错误,补上provisioners段做用户配置即可,参考配置如下:
{ "builders": [ { "type": "googlecompute", "project_id": "project-id", "source_image": "ubuntu-2004-focal-v20220615", "ssh_username": "packer", "zone": "us-west1-a" } ], "provisioners": [ { "type": "shell", "inline": [ "apt-get update -y", "useradd -m -s /bin/bash devuser", "echo 'devuser:YourCustomPassword' | chpasswd", "usermod -aG sudo devuser", "echo 'devuser ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/devuser", "chmod 0440 /etc/sudoers.d/devuser" ] } ] }
配置说明:
- 把
devuser替换为你想要的自定义用户名,YourCustomPassword替换为实际要设置的密码 - 不需要sudo免密的话,删除写入sudoers配置和修改权限的两行即可
- 生产环境不要硬编码明文密码,建议用Packer变量从环境变量读取密码,避免凭证泄露
- 如果需要给packer、root用户设置密码,或者开启SSH密码登录,在inline数组里追加对应命令即可
改完配置重新执行packer build packer.json,生成的新镜像里就自带配置好的sudo用户了。
方式二:镜像构建完成后手动创建
如果你不想重新构建镜像,可以先用生成的镜像创建GCE实例,在实例启动配置里添加你本地的SSH公钥,启动后用密钥登录实例,依次执行以下命令创建sudo用户即可:
# 替换devuser为目标用户名 sudo useradd -m -s /bin/bash devuser # 替换后面的密码为自定义密码 sudo echo 'devuser:YourCustomPassword' | chpasswd sudo usermod -aG sudo devuser # 配置免密sudo可选 sudo echo 'devuser ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/devuser sudo chmod 0440 /etc/sudoers.d/devuser
注意:Ubuntu默认锁定root用户的直接登录权限,就算设置了root密码,也需要修改sshd_config的
PermitRootLogin配置才允许root直接通过SSH登录。
内容的提问来源于stack exchange,提问作者kristen_1024

