sed脚本未在Vagrantfile中执行

时间:2019-05-12 22:28:21

标签: sed vagrant

我一生都无法从事无业游民的配置工作。我想对/ etc / hosts进行内联更改。

我已经验证了sed命令在外壳中运行时可以正常工作。

这是我的Vagrantfile:

# vi: set ft=ruby :

########### Global Config ###########
machines = ["admin2"]
num_hdd_per_osd = 3
vagrant_box = %q{bento/ubuntu-18.04}
#####################################


machines.each do |machine| 
    Vagrant.configure("2") do |config|
        config.vm.define machine do |node| #name vagrant uses to reference this VM
            node.vm.box = vagrant_box
            node.vm.hostname = machine
            node.vm.network "private_network", ip: "192.168.0.#{ machines.index(machine) + 10}"

            node.vm.provider "virtualbox" do |vb|
                # Display the VirtualBox GUI when booting the machine
                vb.gui = false
                vb.name = machine # name virtualbox uses to refer to this vm
                # Customize the amount of memory on the VM:
                vb.memory = "1048"
                # Core Count
                vb.cpus = "2"
            end

            if node.vm.hostname.include? "admin"
                node.vm.provision "shell", inline: <<-SHELL
                    sed -i.bak -e 's,\\(127\\.0\\.0\\.1[[:space:]]*localhost\\),\\1aa,' /etc/hosts
                SHELL
            end
        end
    end
end

我应该看到/ etc / hosts更改为127.0.0.1 localhostaa,但未更改。

怎么了?

编辑:我根据下面Alex的建议更新了代码。现在,它使用内联:<<-SHELL并转义了所有转义符(所以是两次转义符)。可行!

1 个答案:

答案 0 :(得分:1)

问题在于您的Vagrantfile是Ruby代码,而您的sed脚本位于Ruby here字符串中。

如果您尝试使用这种简化的Ruby脚本:

# test.rb
puts <<-SHELL
sudo sed -i.bak -e 's,\(127\.0\.0\.1[[:space:]]*localhost\),\1aa,' /etc/host
SHELL

您可能会看到问题:

▶ ruby test.rb  
sudo sed -i.bak -e 's,(127.0.0.1[[:space:]]*localhost),aa,' /etc/host

也就是说,\1和其他\在here字符串中插值之前已经由Ruby解释过。

您最好的选择是使用<<'SHELL'表示法,类似于在Bash中所做的事情:

node.vm.provision "shell", inline: <<-'SHELL'
  sed -i.bak -e 's,\(127\.0\.0\.1[[:space:]]*localhost\),\1aa,' /etc/hosts
SHELL

另一种选择是在\1中转义反斜杠。另外,请注意,据我所知,那里也不需要调用sudo

但是,如果您需要在此脚本中插入字符串,则可以执行以下操作:

# test.rb
mystring = 'aa'
$script = "sed -i.bak -e '" +
  's,\(127\.0\.0\.1[[:space:]]*localhost\),\1' + "#{mystring},' /etc/hosts"

然后在预配器中:

node.vm.provision "shell", inline: $script

另请参阅与this相关的答案。