2

我有以下正在工作的命令:

my_host_shell.inline = 'vagrant ssh router3 -c "/usr/sbin/cli -f /tmp/provision01_router3.sh"'

(“vagrant ssh”在主机中启动,连接到虚拟机,将“provision01_router3.sh”脚本(已经位于虚拟机中)提供给 cli 解释器)。

现在我希望将“router3”和“provision01_router3.sh”字符串替换为变量,因为它们对于每个虚拟机都是不同的。我尝试了很多方法,包括以下方法,但没有一个有效...

my_host_shell.inline = '"vagrant ssh " + node.vm.hostname +  " -c /usr/sbin/cli -f /tmp/" + script[:script_name]'

你能帮忙调试这条线吗?

这里是完整的 Vagrantfile(见最后几行): https ://github.com/XiaoJu/junos_vagrant_virtual_lab/

VAGRANTFILE_API_VERSION = "2"
require "vagrant-host-shell"
require "vagrant-junos"
mynodes=[
    {
    :hostname => "router3",
    :box => "juniper/ffp-12.1X47-D15.4-packetmode",
    :ram => 512,
    :cpus => 2,
    :myscripts => [
        {
            :script_name => "provision01_router3.sh"
        },
        {
            :script_name => "provision02_all.sh"
        }
    ],
    :interfaces => [
        {
            :subnet_name => "3-to-6",
            :subnet_ip => "172.23.10.13"
        },
        {
            :subnet_name => "3-to-4",
            :subnet_ip => "172.23.3.13"
        },
        {
            :subnet_name => "exit3",
            :subnet_ip => "10.10.2.13"
        }
    ]
    } ]

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box_check_update = false
    mynodes.each do |machine|
        config.vm.define machine[:hostname] do |node|
            node.vm.box = machine[:box]
            node.vm.hostname = machine[:hostname]

            node.vm.provider "virtualbox" do |vb|
                vb.check_guest_additions = false
                vb.customize ["modifyvm", :id, "--memory", machine[:ram], "--cpus", machine[:cpus]]
            end

            # assign ip addresses to interfaces
            machine[:interfaces].each do |subnet|
                node.vm.network "private_network",
                            autoconfig: false,
                            ip: subnet[:subnet_ip],
                            virtualbox__intnet: subnet[:subnet_name]
            end

            # provision each node
            machine[:myscripts].each do |script|
                node.vm.provision "file",
                              source: script[:script_name], 
                              destination: '/tmp/' + script[:script_name]
                node.vm.provision :host_shell do |my_host_shell|
                              # my_host_shell.inline = 'vagrant ssh router3 -c "/usr/sbin/cli -f /tmp/provision01_router3.sh"'
                              my_host_shell.inline = '"vagrant ssh " + node.vm.hostname +  " -c /usr/sbin/cli -f /tmp/" + script[:script_name]'
                end
            end
        end
    end 
end
4

1 回答 1

3

使用字符串插值;它将使您的代码更具可读性:

my_host_shell.inline = "vagrant ssh #{node.vm.hostname} -c \"/usr/sbin/cli -f /tmp/#{script[:script_name]}\""
于 2016-03-01T03:02:02.110 回答