2016-10-08 2 views
1

Ich benutze Vagrant, um eine multiple VM-Umgebung zu Forschungszwecken zu implementieren, und es war so weit toll. Aber jetzt muss ich jeden Docker-Container an einen bestimmten CPU-Kern anheften, aber ich weiß nicht, wie man das mit Vagrant macht. Ich weiß, dass ich die "args" -Klausel auf der Vagrantfile verwenden kann, um den Parameter "--cpuset" an den docker run-Befehl zu übergeben, aber ich weiß nicht, wie ich es in einer Schleife verwenden soll, da ich mehrere Container starte und Ich muss jeden Container an einen anderen CPU-Kern (z. B. Node1 Pins zu Core # 0, Node2 Pins zu Core # 1, usw.).Vagrant: Übergabe von Docker Argumente an mehrere Container mit vagrant

Mein aktuelles Vagrantfile ist wie folgt, ohne die CPU Pinning Sache:

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! 
VAGRANTFILE_API_VERSION = "2" 

# choose how many machines the cluster will contain 
N_VMS = 32 

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 
    config.vm.box = "tknerr/baseimage-ubuntu-14.04" 
    config.vm.network "private_network", ip: "192.168.121.2" 
    config.vm.provider "docker" do |v| 
    v.has_ssh = true 
    end 

    hosts_file = [] 
    1.upto(N_VMS) do |i| 
    config.vm.define vm_name = "node#{i}" do |config| 
     config.vm.hostname = vm_name 
    end 
    end 

    script = <<-SCRIPT 
     apt-get -y update 
     apt-get -y install libcr-dev mpich2 mpich2-doc arp-scan openssh-server nano make 
    SCRIPT 
    script.sub! 'N_VMS', N_VMS.to_s 
    config.vm.provision "shell", inline: script 

end 

Antwort

0

Am Ende definieren, war ich an der falschen Stelle suchen. Die richtige Stelle zum Hinzufügen des "--cpuset-cpus" war im config.vm.define Block.

Der Code endete wie folgt sein:

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! 
VAGRANTFILE_API_VERSION = "2" 

# choose how many machines the cluster will contain 
N_VMS = 32 

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 
    config.vm.box = "tknerr/baseimage-ubuntu-14.04" 
    config.vm.network "private_network", ip: "192.168.121.2" 
    config.vm.provider "docker" do |v| 
    v.has_ssh = true 
    end 

    2.upto(N_VMS+1) do |i| 
    config.vm.define vm_name = "node#{i}" do |config| 

     # CPU PINNING CONFIG  
     config.vm.provider "docker" do |docker| 
     docker.create_args = ['--cpuset-cpus=' + ((i/2)-1).to_s] 
     end 

     config.vm.hostname = vm_name 
    end 
    end 

    script = <<-SCRIPT 
     apt-get -y update 
     apt-get -y install libcr-dev mpich2 mpich2-doc arp-scan openssh-server nano make 
    SCRIPT 
    script.sub! 'N_VMS', N_VMS.to_s 
    i=1 
    config.vm.provision "shell", inline: script 

end 
0

Angenommen, Sie vagrant vm in der Schleife config wollen, wie die vagrantfile auf der Ruby-Sprache basieren, so dass Sie beinhalten können Die Entwicklungsmöglichkeit für die vagrantfile, hier ist ein Beispiel, Sie können Ihre "--cpuset" Config in der vm define hinzufügen.

# -*- mode: ruby -*- 
# vi: set ft=ruby : 
# read vm and chef configurations from JSON files 
nodes_config = (JSON.parse(File.read("nodes.json")))['nodes'] 
VAGRANTFILE_API_VERSION = "2" 
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 
    nodes_config.each do |node| 
    node_name = node[0] # name of node 
    node_values = node[1] # content of node 
      # puts node_name 
    # puts node_values['box'] 
    config.vm.define node_name do |config| 
     config.vm.box = node_values['box'] 
     config.vm.hostname = node_name 
     config.vm.network :private_network, ip: node_values['ip'] 
        config.vm.provider :virtualbox do |vb| 
      vb.customize ["modifyvm", :id, "--memory", node_values['memory']] 
      vb.customize ["modifyvm", :id, "--name", node_name] 
     end 
    end 
end 

nodes.json die vm zu definieren, können Sie Ihre

{ 
    "nodes": { 
    "jenkins.example.com": { 
     "info": "jenkins master server", 
     "box": "../Vgrant-boxes/centos65_virtualbox_50G.box", 
     "ip": "192.168.35.101", 
     "ports": [], 
     "memory": 512 
    }, 
    "node01.example.com": { 
     "info": "tomcat app host server", 
     "box": "../Vgrant-boxes/centos65_virtualbox_50G.box", 
     "ip": "192.168.35.121", 
     "ports": [], 
     "memory": 512 
    }, 
    "node02.example.com": { 
     "info": "jboss app host server", 
     "box": "../Vgrant-boxes/centos65_virtualbox_50G.box", 
     "ip": "192.168.35.122", 
     "ports": [], 
     "memory": 512 
    }, 
    "node03.example.com": { 
     "info": "oracle xe server", 
     "box": "../Vgrant-boxes/centos65_virtualbox_50G.box", 
     "ip": "192.168.35.123", 
     "ports": [], 
     "memory": 512 
    }, 
    "node04.example.com": { 
     "info": "artifactory server", 
     "box": "../Vgrant-boxes/centos65_virtualbox_50G.box", 
     "ip": "192.168.35.124", 
     "ports": [], 
     "memory": 512 
    } 
    } 
} 
+0

Ich denke, diese Methode nicht für Docker Provider funktioniert, da die Argumente i passieren müssen, um auf die „Docker run“ Befehl ist. Laut Vagrant-Dokumenten werden diese Argumente mit dem Befehl config.vm.provision übergeben, aber ich bin mir nicht sicher, wie ich sie verwenden soll. –

+0

@LuisCarlosJersak Vielleicht können Sie auf [diese] verweisen (https://github.com/cloudhuang/vagrant-ci-env/blob/master/Vagrantfile), die ich verwendet habe, um die Kochrezepte bereitzustellen. –

Verwandte Themen