通过 Ansible 控制 Vagrant 插件依赖

Controlling Vagrant plugin dependencies via Ansible

我有一个安装 Vagrant 的 Ansible 剧本,然后指示 Vagrant 安装特定的插件。 Vagrant 在安装它需要的 gem 时遇到问题,并说:

安装nokogiri(1.6.6.2)时出错,Bundler无法继续。
确保 `sudo gem install nokogiri -v '1.6.6.2'` 在捆绑前成功。
stdout:正在安装“vagrant-aws --version '0.5.0'”插件。这可能需要几分钟...

虽然我在使用以下命令安装 Nokogiri 时遇到问题:

$ sudo gem 安装 nokogiri -v '1.6.6.2'

正如 vagrant 所做的那样,我发现我 可以 使用以下命令手动安装 Nokogiri:

$ sudo gem install nokogiri -v 1.6.6.2 -- --use-system-libraries --with-xml2-include=/usr/include/libxml2

即使在我手动安装 gem 之后,如果我手动告诉它安装插件,vagrant 仍然会失败。

有没有办法更好地控制这些依赖关系,以便 vagrant 不会失败并且我的 playbook 会完成?

我认为使用 sudo 安装 ruby gem 是个问题。

我通过安装 Ruby Version Manager 解决了这个问题,它在您的主目录中安装和管理 gems。

安装 RVM 后,我可以在没有 sudo 的情况下安装 nokogiri,但是 vagrant-aws 仍然无法安装,直到我重新安装 vagrant。如果您正在使用 Ansible 构建一个全新的环境,那么您可以在第一次安装 vagrant(或任何其他 ruby 东西)之前安装 RVM。还有other ways to fix your gem permissions

以下是我采取的步骤:

安装Ruby版本管理器(https://rvm.io/rvm/install

curl -sSL https://get.rvm.io | bash -s stable --ruby

不使用 sudo 安装 nokogiri

gem install nokogiri

重新安装 vagrant (http://www.vagrantup.com/downloads)

原来我遗漏了一些关键依赖项:build-essentiallibxslt1-devlibxml2-devzlib1g-dev。我在这里找到了这条评论:https://github.com/mitchellh/vagrant-aws/issues/163#issuecomment-27603855 很有帮助。