【问题标题】:Shared and automated vagrant box共享和自动化的流浪者盒子
【发布时间】:2012-01-11 17:43:09
【问题描述】:

我正在考虑使用 Vagrant 开发 Django 应用程序,但我有点困惑,我不确定我想做的事情是否可行。

我成功安装了 lucid32 盒子并创建了一个新的 vagrant“实例”,其中包含一个 Vagrantfile、一些共享目录和转发端口。

  • 第一个问题是,在我看来,在团队中工作时,这似乎不是最佳选择。我们(例如,我和其他 10 位开发人员)如何共享该框,以便共享对它的每次更改?例如,如果在 6 个月内我们需要 postgresql,我需要让它工作而不需要安装 11 次 postgresql。

  • 另外,当盒子启动时,我怎样才能让东西(如:postgresql、django、this-service 等)启动?我认为我不必每次都需要 ssh 并手动启动 n 次所有 n 的东西。

  • 最后:我不太明白 puppet 和 chef 之类的东西是否旨在完全替代手动安装(例如,通过 pip 或 apt-get)。是这样吗?

谢谢。
我很抱歉英语不好。 :-)

【问题讨论】:

    标签: automation vagrant


    【解决方案1】:

    我想说,您选择 Vagrant 已经是您正在寻找的一个好的开始,但现在您需要更深入地研究 Chef 或 Puppet,以进一步自动化您的配置过程。

    我想在您的场景中一个不错的选择是首先将 Vagrantfile 和相应的 Puppet 清单作为您项目的一部分置于版本控制之下。此外,与这台机器有关的所有配置也应纳入版本控制和/或通过某种工件存储库提供。

    其次,在团队中建立规则,如果认为环境的更改(至少应该存在更长时间的更改)被认为已为其他团队成员准备好,则需要签入这些规则。

    关于您的第二个问题,回到我的开头:Puppet(我喜欢)或 Chef 是您选择的工具,可以为您和您的同事在未来节省大量工作。我会在这里坚持 Puppet,因为我不太了解 Chef。

    使用 puppet,您可以管理您想要的所有内容,包括安装包、更改配置并确保某些服务正在运行,或者总体而言,系统具有您想要的状态。更好的是,如果您或其他团队成员对他/她的盒子进行了一些恶意更改,您可以回滚您的 Vagrantfile/Puppet 清单中的更改,输入

    vagrant destroy && vagrant up
    

    盒子很容易恢复到最后的版本化状态。

    以如下清单文件为例:

    package { "mysql-server-5.1":
      ensure => present
    }
    
    file { "/etc/mysql/my.cnf":
      owner => "root",
      content => "http://myrepository.local/myProject/configurations/mysql/my.cnf",
      require => Package["mysql-server-5.1"]
    }
    
    service { "mysql":
      ensure => running,
      subscribe => File["/etc/mysql/my.cnf"],
      require => File["/etc/mysql/my.cnf"]
    }
    

    它的作用是,它首先检查你的盒子中操作系统的包机制(示例中的名称假设是最近的 Ubuntu),如果安装了包“mysql-server-5.1”,如果没有安装会安装它。通过 'require' 属性,第二个指令将在第一个指令之后执行(并且仅当它有效时),将 MySQL 配置更改为您也已签入和/或发布到您可以访问的位置的配置(也可以是放入与 Vagrantfile 相同的文件夹中,然后将在 /vagrant 下的框中可用)。最后一步,只有在配置更改有效时才会执行,这将确保“mysql”服务已启动并运行,或者如果在更改配置时它已经在运行,则会重新启动。

    现在你可以在你的 Vagrantfile 中连接这个清单了:

    Vagrant::Config.run do |config|
    
      config.vm.box = "lucid32"
      config.vm.box_url = "http://files.vagrantup.com/lucid32.box"
    
      config.vm.define "node1" do |cfg|
        cfg.vm.network "10.23.5.11"
        cfg.vm.provision :puppet do |puppet|
          puppet.manifests_path = "manifests"
          puppet.manifest_file = "node1.pp"
        end
      end
    end
    

    除了对这样的环境进行“尝试性”之外的所有更改,所有团队成员都可以轻松地进行相同的设置,并且触手可及。

    我个人喜欢在盒子上手动尝试一些东西,当我找到正确的设置和配置时,将其转换为 Puppet 清单,以备日后使用并与团队成员共享。

    由于 Puppet(以及 Chef 也)几乎可以管理您需要的所有内容(用户、cron 作业、程序包、服务、文件……),因此对于此类问题来说,它是一个不错的选择,您甚至可以从中受益如果您愿意,以后可以使用这些配置来配置登台或测试环境。他们在 Puppet 方面有更多选择,通读 the language guide 应该会让您知道您可以用它做些什么。

    希望我能帮上忙:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多