我目前正在使用 packer 根据给定配置生成定制化镜像。packer .json
文件中包含 provisions,这些 provisions 在 packer 教程中有所描述。
我使用了 shell 选项而非在其中输入命令。在 shell 脚本中,我可以编写一系列 sudo apt-get install
命令来定制映像。
问题在于,我需要将一台我拥有的计算机上的文件复制到这些映像中。更明确地说,我自己拥有的计算机也是运行命令packer build example.json
的计算机。
在 shell 脚本中,我该如何执行安全复制,以便从新创建的映像的角度,映像可以安全地将文件从我的计算机复制到自身,而无需输入密码?由于这是一个 shell 脚本,如果我想要输入密码的话是无法完成的。
我理解为避免输入密码,需要公钥/私钥身份验证。在 shell 脚本中,我已经添加了:
sudo ssh-keygen -t rsa -b 2048
sudo scp ~/.ssh/id_rsa.pub user@example.com:/home/user/.ssh/uploaded_key.pub
sudo ssh user@example.com "echo `cat ~/.ssh/uploaded_key.pub` >> ~/.ssh/authorized_keys"
(摘自这个示例和其他地方。根据我的理解,生成的映像正在运行这些命令。)
这种方法和我在StackOverflow上看到的许多方法(例如相关问题)存在两个问题:
- 第一次公钥/私钥身份验证需要密码,但由于完全在shell脚本中完成,因此不知道如何避免它。 - Packer会动态生成映像,因此其他需要手动输入AMI ID的方法无法使用。
一个类似的问题使用了“file”提供类型,但我想使用“shell”类型来解决此问题,但不知道如何同时使用文件和Shell选项。
请问该如何解决?