您很可能遇到了已知的 vagrant-aws 问题#72: Failing with EC2 Amazon Linux Images。
编辑 3(2014 年 2 月): Vagrant 1.4.0(2013 年 12 月发布)和更高版本现在支持布尔配置参数config.ssh.pty
。将参数设置为 true 以强制 Vagrant 使用 PTY 进行配置。Vagrant 创建者 Mitchell Hashimoto指出,不能config.ssh.pty
在全局配置上设置,必须直接在节点配置上设置。
这个新设置应该可以解决问题,并且您不再需要下面列出的解决方法。(但请注意,我自己还没有对其进行测试。)有关详细信息,请参阅Vagrant 的 CHANGELOG ——不幸的config.ssh.pty
是,该选项尚未在 Vagrant 文档的SSH 设置下记录。
编辑2:坏消息。看起来即使 aboothook
运行(更新 /etc/sudoers.d/ for !requiretty
)也不会比 Vagrant 尝试 rsync 更快。在我今天的测试期间,我开始在运行时再次看到零星的“mkdir -p /vagrant”错误vagrant up --no-provision
。所以我们回到上一点,最可靠的修复似乎是自定义 AMI 映像,该映像已经包含应用到/etc/sudoers.d
.
编辑:看起来我找到了一种更可靠的方法来解决问题。使用boothook执行修复。我手动确认boothook
在 Vagrant 的 rsync 阶段开始之前执行了作为 a 传递的脚本。到目前为止,它对我来说一直可靠,我不需要创建自定义 AMI 映像。
额外提示:如果您cloud-config
也依赖. 您可以从 GitHub 获取最新版本的write-mime-multipart帮助程序脚本。boothook
cloud-config
使用示意图:
$ cd /tmp
$ wget https://raw.github.com/lovelysystems/cloud-init/master/tools/write-mime-multipart
$ chmod +x write-mime-multipart
$ cat boothook.sh
#!/bin/bash
SUDOERS_FILE=/etc/sudoers.d/999-vagrant-cloud-init-requiretty
echo "Defaults:ec2-user !requiretty" > $SUDOERS_FILE
echo "Defaults:root !requiretty" >> $SUDOERS_FILE
chmod 440 $SUDOERS_FILE
$ cat cloud-config
#cloud-config
packages:
- puppet
- git
- python-boto
$ ./write-mime-multipart boothook.sh cloud-config > combined.txt
然后,您可以将“combined.txt”的内容传递给 aws.user_data,例如通过:
aws.user_data = File.read("/tmp/combined.txt")
很抱歉之前没有提到这一点,但我现在正在自己解决这个问题。:)
原始答案(见上文以获得更好的方法)
TL;DR:最可靠的修复方法是“修补”库存 Amazon Linux AMI 映像,保存它,然后在您的Vagrantfile
. 详情见下文。
背景
在https://github.com/mitchellh/vagrant-aws/pull/70/files描述了一个潜在的解决方法(并在上面的错误报告中链接)。简而言之,将以下内容添加到您的Vagrantfile
:
aws.user_data = "#!/bin/bash\necho 'Defaults:ec2-user !requiretty' > /etc/sudoers.d/999-vagrant-cloud-init-requiretty && chmod 440 /etc/sudoers.d/999-vagrant-cloud-init-requiretty\nyum install -y puppet\n"
最重要的是,这会将操作系统配置为不需要用户的 tty ec2-user
,这似乎是问题的根源。我/认为/puppet
实际修复不需要额外安装软件包(尽管 Vagrant 稍后可能会使用 Puppet 来配置机器,具体取决于您配置 Vagrant 的方式)。
我对所描述的解决方法的经验
我已经尝试过这种解决方法,但 Vagrant 仍然偶尔会因同样的错误而失败。这可能是一个“竞争条件”,其中 Vagrant 恰好运行其 rsync 阶段的速度比 cloud-init (这是aws.user_data
向其传递信息的对象)更快地可以在机器上为 Vagrant 准备 #72 的解决方法。如果 Vagrant 更快,你会看到同样的错误;如果 cloud-init 更快,它就可以工作。
什么会起作用(但需要你付出更多的努力)
绝对有效的是在库存 Amazon Linux AMI 映像上运行命令,然后将修改后的映像(= 创建映像快照)保存为您的自定义 AMI 映像。
# Start an EC2 instance with a stock Amazon Linux AMI image and ssh-connect to it
$ sudo su - root
$ echo 'Defaults:ec2-user !requiretty' > /etc/sudoers.d/999-vagrant-cloud-init-requiretty
$ chmod 440 /etc/sudoers.d/999-vagrant-cloud-init-requiretty
# Note: Installing puppet is mentioned in the #72 bug report but I /think/ you do not need it
# to fix the described Vagrant problem.
$ yum install -y puppet
Vagrantfile
然后,您必须在您的而不是库存的 Amazon中使用此自定义 AMI 图像。明显的缺点是您不再使用库存的 Amazon AMI 映像——这是否是您关心的问题取决于您的要求。
我尝试过但没有成功
作为记录:我还尝试将一个包含bootcmdcloud-config
的内容传递给以与上面嵌入的 shell 脚本相同的方式进行设置。根据 cloud-init 文档,在 EC2 实例的启动周期中“非常早”运行——其想法是指令将在 Vagrant 尝试运行其 rsync 阶段之前运行。但不幸的是,我发现该功能并未在当前 Amazon 的 Linux AMI 的过时版本中实现(例如 ami-05355a6c 具有 cloud-init 0.5.15-69.amzn1 但bootcmd 仅在 0.6.1 中引入)。aws.user_data
!requiretty
bootcmd
bootcmd
bootcmd
cloud-init