使用Packer将文件从主机复制到生成的镜像中,无需密码

6

我目前正在使用 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选项。
请问该如何解决?
1个回答

16
你应该使用 file 配置器,类似这样:
"provisioners": [
  {
    "type": "file",
    "source": "source_file",
    "destination": "dest"
  },
  {
    "type": "script",
    "inline": [ "echo do something here" ]
  }
]

查看documentation: provisioners "file"

1
啊,我没意识到我们可以有一个这样的数组,我记得在某个地方读到只能有一个。让我试试那些,虽然我得弄清楚源/目标参数究竟是什么。 - ComputerScientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接