使用Vagrant运行特定的配置块

时间:2015-04-12 03:35:48

标签: vagrant chef

我想在新配置的服务器上的Vagrant文​​件中运行单独的配置块。目前,当我从CI服务器运行时

vagrant up

以下块成功执行

config.vm.provider :linode do |provider, override|   
    #creates a new instance etc .. the following block runs on this instance
end
config.vm.provision :chef_solo do |chef|
    chef.provisioning_path = "/tmp/deploy"
    chef.cookbooks_path = ["cookbooks"]
    chef.add_recipe = "mydeployagent" 
end

现在我想在之后运行一个单独的供应商。 (CI服务器中的单独任务),即

config.vm.provision :chef_solo do |chef|
    chef.provisioning_path = "/tmp/deploy"
    chef.cookbooks_path = ["cookbooks"]
    chef.add_recipe = "mydeploydatabaseagent" 
end

我正在试图找出我需要的东西

  1. 运行vagrant以便它只执行第一个提供块

  2. 运行vagrant,以便它只在1中创建的实例上运行第二个配置程序块。

  3. 提前致谢

2 个答案:

答案 0 :(得分:2)

来自Vagrant docs

Vagrant.configure("2") do |config|
  # ... other configuration

  config.vm.provision "bootstrap", type: "shell" do |s|
    s.inline = "echo hello"
  end
end
  

如果您只想运行a,则可以使用--provision-with标志   特定供应商,如果您指定了多个供应商。对于   例如,如果你有一个shell和Puppet配置器而且只想要   运行shell一个,你可以做vagrant配置--provision-with   贝壳。 --provision-with的参数可以是提供者类型   (例如" shell")或供应商名称(例如" bootstrap"来自   上文)。

答案 1 :(得分:0)

Chef主要是管理一个理想的状态,所以你应该希望它确保每次运行你的两个食谱(并且它们应该是幂等的)。

我不知道有什么方法可以告诉流浪汉使用不同参数的同一个辅助工具两次(我只能考虑流浪文件中的丑陋黑客)

如果第二个配方依赖于第一个配方已被执行,那么您可以添加一个警卫跳过第二个配方,直到第一个配方运行。

有了厨师独奏,你可以这样做:

  • mydeployagent /食谱/ default.rb
[...Whatever your recipe has to do (agent install, configuration, etc...]

# On a particular resource on your first recipe, 
# trigger a notification to make a file which will be used as a guard for second recipe
remote_file "/opt/target/mydeplaoyagent" do
  source [.. your source..]
  notifies :create,"file[/opt/mydeployagent.initialized]"
end

file "/opt/mydeployagent.initialized" do
 action :nothing
end
  • mydeploydatabaseagent /食谱/ default.rb
#start the recipe by a guard to avoid doing anythng if first recipe has not been run
return unless ::File::exists?("/opt/mydeployagent.initialized")

[... your second recipe code here ...]

在您的流浪文件中,您可以将两个食谱添加到您的供应商中,如:

config.vm.provision :chef_solo do |chef|
    chef.provisioning_path = "/tmp/deploy"
    chef.cookbooks_path = ["cookbooks"]
    chef.add_recipe = "mydeployagent" 
    chef.add_recipe = "mydeploydatabaseagent"
end

显然,如果它不是幂等的,那么防护装置也可以在第一个配方上使用,但我强烈建议重新考虑它以便能够多次运行,当你和你时,你会很高兴让它运行#39; ll有一个配置更改要在这个配方管理的文件中传播(并且相信我,你将有一个像这样的更新来管理一天)。