방랑하는 동안 호스트 컴퓨터에서 스크립트 실행


40

방랑자가 서버를 프로비저닝 할 때 호스트 컴퓨터에서 bash 스크립트를 실행하고 싶습니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까?

답변:


29

적어도 두 가지 플러그인이 도움이되어야합니다.

스크립트가 거의 모든 vagrant명령에서 실행되는 것을 신경 쓰지 않는다면 Vagrantfile에서 셸 아웃 (또는 루비 매직 사용)을 할 수도 있습니다.

system('./myscript.sh')

Vagrant.configure('2') do |config|
  # ...
end

2
방랑자 트리거는 내가 필요한 것 같습니다.
디지털

이 system () 함수를 어디에서 찾았습니까? 어디에서나 그것에 관한 문서를 찾을 수 없습니다 ...
Cristiano Fontes

1
@CristianoFontes는 Kernel모듈에 있으며 여기문서화되어 있습니다 . Kernel모듈에 포함되어 있습니다 Object그 방법은 모든 범위에서 사용할 수 있도록 클래스입니다.
tmatilai

1
바보 야 나는 방랑 문서를 찾고 있었다. 감사!
Cristiano Fontes

26

단순하고 완벽한 솔루션

(허용 된 답변이 사용자가 방랑자를 사용하고 있는지 확인하지 않기 때문에 완료라고 말합니다. 따라서 스크립트는 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

1
안녕, 믹 ... 좋은 답변 감사합니다. 하지만 [# {ARGV [0]} = 'up']; 창문에서 작동합니다. 그것은 결코 arg를 찾지 못한다
Cristiano Fontes

1
Vagrantfile의 위치에 관계없이 다른 것이 실행되기 전에 스크립트를 먼저 실행합니다. 그것은 당신이하는 일에 충분할 수도 있지만 방랑자 트리거 플러그인은 내가 필요한 것입니다 ...
Vigintas Labakojis

3
@CristianoFontes 시스템 호출 외부의 루비에서 argv 테스트를 수행 할 수 있으며 Windows 및 * nix에서 작동합니다. 이 명령을 사용하여 명령 행에서 up 또는 provision 명령을 찾아서 프로비저닝이 진행 중임을 나타내는 글로벌 루비 변수를 설정합니다. --no-provisioning =) $ provisioning = true $ provisioning = false end
Rhubarb

이것은 실제로 Vagrant가 조언 한 나쁜 습관입니다. "up"명령에 연결하는 플러그인을 작성해야합니다.
SilentICE

1
@ Vagrant 문서 ( docs.vagrantup.com/v2/plugins/commands.html )에서 바로 선택하십시오. 또한 호출시 argv [0]이 플래그가 아니라 '위'임을 확신 할 수 없으므로 취약한 스크립트를 만듭니다. 또한 원시 루비에 빠지면 프레임 워크가 제공 해야하는 캡슐화를 깨뜨릴 수 있습니다. 이 작업을 올바르게 수행하기위한 메커니즘이 있으므로 IMHO는 가능할 때마다이를 사용해야합니다.
SilentICE

9

이것을 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을 이식 가능하게하려면 먼저 고려해야합니다.


1
좋은 대답은, 이것을 사용하여 낮은 포트 포워딩을 설정하겠습니다.
poindexter

6

@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 스크립트를 기꺼이 실행 합니다.
벤 존슨

4

@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실패 할 경우), 행 코멘트 자체.


Vagrantfile의 주석 처리를 제거하지 않고 단순히 방랑자 플러그인 목록을 정리하는 것이 더 쉬워서 팀의 다른 사람들에게 문제를 일으킬 수 있습니다. if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
Jordan

이것의 문제점은 다른 명령에서 트리거된다는 것입니다. vagrant status이전에 실행하면 어떻게 vagrant up
Mick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.