답변:
적어도 두 가지 플러그인이 도움이되어야합니다.
스크립트가 거의 모든 vagrant
명령에서 실행되는 것을 신경 쓰지 않는다면 Vagrantfile에서 셸 아웃 (또는 루비 매직 사용)을 할 수도 있습니다.
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernel
모듈에 있으며 여기 에 문서화되어 있습니다 . Kernel
모듈에 포함되어 있습니다 Object
그 방법은 모든 범위에서 사용할 수 있도록 클래스입니다.
(허용 된 답변이 사용자가 방랑자를 사용하고 있는지 확인하지 않기 때문에 완료라고 말합니다. 따라서 스크립트는 OP가 원하는 것이 아닌 각 명령에서 실행됩니다.)
그러나 이것에 대한 간단한 해결책이 있습니다.
ARGV[0]
명령의 첫 번째 인수를 입력 할 수있다 up
, down
, status
, 등 간단히의 값을 확인 ARGV[0]
하여 Vagrantfile에.
이런 식으로 할 것입니다 :
system("
if [ #{ARGV[0]} = 'up' ]; then
echo 'You are doing vagrant up and can execute your script'
./myscript.sh
fi
")
Vagrant.configure('2') do |config|
# ...
end
이것을 Vagrantfile 상단 근처에 두십시오.
module LocalCommand
class Config < Vagrant.plugin("2", :config)
attr_accessor :command
end
class Plugin < Vagrant.plugin("2")
name "local_shell"
config(:local_shell, :provisioner) do
Config
end
provisioner(:local_shell) do
Provisioner
end
end
class Provisioner < Vagrant.plugin("2", :provisioner)
def provision
result = system "#{config.command}"
end
end
end
그런 다음 Vagrantfile을 다음과 같이 호출하십시오.
config.vm.provision "list-files", type: "local_shell", command: "ls"
그리고 다음과 같은 명령 줄을 통해 :
vagrant provision --provision-with list-files
이것은 플러그인처럼 보이지만 실제로는 아닙니다 (그렇지 않으면 표시되지 않음 vagrant plugin list
). 플러그인을 설치할 필요가 없다는 점을 제외하고는이 방법을 사용하지 않는 것이 좋습니다. 따라서 Vagrantfile은 최신 구성 버전 (이 글을 쓰는 현재 버전 2)을 지원하는 모든 컴퓨터에서 작동합니다. 휴대용으로 들리지만 실제로 실행하는 명령에 대한 크로스 플랫폼 문제가 있습니다. Vagrantfile을 이식 가능하게하려면 먼저 고려해야합니다.
@tmatilai의 답변을 기반으로하지만 2019 년에 업데이트 된 vagrant-triggers는 Vagrant로 병합되었습니다. 이제 다음과 같은 작업을 수행 할 수 있습니다.
node.trigger.before [:up, :provision] do |trigger|
trigger.info = "Running ./myscript.sh locally..."
trigger.run = {path: "./myscript.sh"}
end
이 블록은 안으로 들어갑니다 config.vm.define
. 추가 문서 : https://www.vagrantup.com/docs/triggers/
config.vm.define
할 필요는 없습니다. 그것들은 또한 안에 넣을 수 있습니다 Vagrant.configure("2") do |config| ... end
. 마지막으로 Windows 호스트에서 Vagrant는 .ps1
확장 기능 이있는 Powershell 스크립트를 기꺼이 실행 합니다.
@tmatilai가 사용에 대해 말한 것과 일치
system('./myscript.sh')
방랑자 명령이나 시스템에 설치되지 않은 일부 프로 비져 너를 설치하는 것과 같은 일회성 명령에 매우 유용하다는 것을 알았습니다. vagrant
자동 주석 처리를 위해 sed를 추가 하여 명령을 호출 할 때마다 다시 실행되는 것을 피 합니다 Vagrantfile
.
예를 들면 다음과 같습니다.
system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')
그리고 나는 그것을 나의 Vagrantfile의 첫 줄로 만듭니다. 그것은 먼저 방랑 패브릭 플러그인, 직물 및 신사를 설치합니다이 방법 (없이 첫번째 시도 할 것이다 sudo
에 대한 virtualenvs
및에 sudo
실패 할 경우), 행 코멘트 자체.
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
이전에 실행하면 어떻게 vagrant up