Сценарий sed не выполняется в Vagrantfile - PullRequest
2 голосов
/ 13 мая 2019

Я не могу на всю жизнь заставить себя работать с бродячей подготовкой. Я хочу внести изменения в /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, но он не изменился.

Что не так?

РЕДАКТИРОВАТЬ: Я обновил код с предложением от Алекса ниже. Теперь он использует inline: << - SHELL и экранирует ВСЕ экранированные символы (так что двойной экранирующий символ). Это работает! </p>

1 Ответ

1 голос
/ 13 мая 2019

Проблема в том, что ваш 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 и другие \ были интерпретированы 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

См. Также этот связанный ответ.

...