我一生都无法从事无业游民的配置工作。我想对/ 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并转义了所有转义符(所以是两次转义符)。可行!
答案 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相关的答案。