【问题标题】:vagrant + ubuntu + services + shared folders (nfs) + bootvagrant + ubuntu + services + 共享文件夹 (nfs) + boot
【发布时间】:2015-01-26 06:56:27
【问题描述】:

我有一个 Vagrant 盒子,它可以设置/启动一个 Ubuntu 12.04 VM(Virtualbox),里面有一个 Tomcat 应用程序。 Tomcat 应用程序目录(WAR 文件的结果)实际上是我的项目目录(在主机上)中的 NFS 共享文件夹。

我想让 Tomcat 在 VM 启动时自动启动,但只有在 NFS 目录可供访问之后。

实际上我得到了不同的服务,它们应该按顺序启动(postgres -> tomcat -> apache),因为它们相互依赖。

我怎样才能做到这一点?

我尝试将以下脚本放入/etc/init.d/start_my_app

#!/usr/bin/sh
service postgresql start
service tomcat7 start
service apache2 start

...和`chkconfig -s start_my_app on',但它似乎不起作用。服务未运行。

谁能帮帮我?

这个问题与this one有关。

【问题讨论】:

    标签: ubuntu vagrant boot shared-directory


    【解决方案1】:

    您可以使用 Upstart 脚本代替 init.d 脚本,来监听 Vagrant 自己的 vagrant-mounted 事件,如下所示:

    # /etc/init/my_app.conf
    
    description "Run postgres, apache, and tomcat"
    
    start on vagrant-mounted
    stop on runlevel [016]
    
    script
        service postgresql start
        service tomcat7 start
        service apache2 start
    end script
    

    如果您像我一样期望这会出现在 Vagrant 的文档中,您会非常失望。它唯一的公开致谢是bullet point in the changelog for version 0.9.0

    【讨论】:

      【解决方案2】:

      我建议使用配置自动化工具,例如 Puppet 进行配置 - 我发现它是一种易于学习的声明性语言,并且比 shell 脚本更具可读性/可维护性。

      这是我对木偶清单的尝试,以实现您所描述的:

      mount { "/path/to/mountpoint":
          device  => "hostname:/path/to/nfs",
          fstype  => "nfs",
          ensure  => "mounted",
          options => "defaults",
          atboot  => true,
      }
      ->
      service { "postgresql":
          ensure => running,
      }
      ->
      service {'tomcat':
          name   => "tomcat7",
          ensure => running,
      }
      ->
      service {'apache2':
          ensure => running,
      }
      

      描述了四种资源,nfs 挂载和服务;它们之间的箭头 (->) 确保它们的应用顺序与它们在文件中写入的顺序相同(否则无法保证)。有关语法的详细信息,请查看文档,但我认为这很简单,可以不言自明。

      (当然,通过确保为服务安装软件包,或者正确设置配置文件等,它可以更加精细)

      Vagrant 内置了对 puppet 配置的支持,因此您可以将上述代码放在一个名为 site.pp 的文件中,并将其放在 Vagrantfile 旁边的文件夹中,例如manifests。然后添加到 Vagrantfile 中:

      config.vm.provision "puppet" do |puppet|
          puppet.manifests_path = "manifests"
          puppet.manifest_file  = "site.pp"
      end
      

      我只使用 puppet 作为示例,因为这是我有一些经验的 - 此类自动化工具的其他一些示例是:ChefSaltAnsible

      【讨论】:

      • 我猜您的建议涉及通过 puppet 而不是通过 Vagrant 安装 NFS,以确保 NFS 在启动服务之前运行。对吗?
      • 我相信我理解了您的所有示例,除了与安装 NFS 共享文件夹相关的部分:我需要从 Vagrant 文件中删除 config.vm.synced_folder ".", "/vagrant", type: "nfs" 吗?我如何参考hostname
      • 好吧,我做了一个错误的假设;我以为您已经“手动”安装了 nfs 文件夹,而不是使用 Vagrant 同步文件夹,但实际上这并没有太大区别。您可以保留这两个设置 - 如果在应用 puppet 清单时 nfs 已经可用,则它不会对其执行任何操作,并移至下一个资源。要获取主机名(并检查挂载选项),请尝试启动 VM,并使用不带参数的 mount 命令 - 它应该显示 Vagrant 使用的确切选项(包括主机 ip 或名称),因此您可以根据它更新人偶部分。
      猜你喜欢
      • 2014-02-07
      • 2016-03-21
      • 1970-01-01
      • 2016-01-08
      • 2016-09-08
      • 2017-08-20
      • 1970-01-01
      • 2016-03-28
      • 2016-05-11
      相关资源
      最近更新 更多