4

所以我对 vagrant-aws 插件进行了一些冒险,现在我被困在同步文件夹的问题上。这是配置机器所必需的,这是最终目标。但是,vagrant provision在我的机器上运行会产生

[root@vagrant-puppet-minimal vagrant]# vagrant provision
[default] Rsyncing folder: /home/vagrant/ => /vagrant
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed! 
mkdir -p '/vagrant'

我几乎可以肯定该错误是由于手动 ssh-ing 并运行该命令会产生“权限被拒绝”(显然,非 root 用户正在尝试在根目录中创建目录)。我尝试以 root 身份使用 ssh-ing,但这似乎是一种不好的做法。(亚马逊不喜欢它)如何更改要与 vagrant-aws 同步的文件夹?我似乎找不到那个设置。谢谢!

4

1 回答 1

6

您很可能遇到了已知的 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帮助程序脚本。boothookcloud-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!requirettybootcmdbootcmdbootcmdcloud-init

于 2013-07-02T21:20:15.337 回答