2013-01-10 3 views
16

이전에 이미 수행 한 경우 VM 프로비저닝을 피하기 위해 쉘 프로비저러를 얻으려고합니다.이미 프로비저닝 된 경우 Vagrant VM을 재 프로비저닝하지 마십시오.

는 다음 Vagrantfile을 생각해 보면 vagrant up minimal을 실행하면

Vagrant::Config.run do |config| 
    config.vm.define :minimal do |config| 
    # Base image 
    config.vm.box = "lucid32" 
    config.vm.box_url = "http://files.vagrantup.com/lucid32.box" 

    config.vm.provision :shell, :inline => "mkdir /tmp/foobar" 
    end 
end 

, 그것은 처음에 상자와 규정을 만들 것입니다. 그런 다음 vagrant provision minimal을 실행하면 상자 재 작성을 시도하지만 실패합니다 (/ tmp/foobar 디렉토리가 이미 있으므로).

과거에 컴퓨터를 프로비저닝했는지 나중에 기억하고 나중에 재 프로비저닝하는 것을 방지 할 수있는 방법이 있습니까?

더 많은 컨텍스트 : vagrant up minimal을 실행하고 호스트 컴퓨터를 다시 시작한 다음 vagrant up minimal을 다시 실행하면 상자를 다시 프로 비전하려고 시도하고 실패합니다. VirtualBox가 자주 호스트 시스템에서 커널 패닉을 일으키는 경우가 많습니다.

답변

10

당신이 mkdirmkdir -p A를, 그것은 작동합니다 변경하는 경우이 원하는 해답이 될 수 있지만하지 않을 수 있습니다) 진지에서

는하지만, 나는 방랑은 멱등 할 provisioners을 (즉 기대 생각 , 두 번째 실행하면 아무런 조치도 취하지 않습니다).

프로비저닝 스크립트에서 실제로 수행중인 작업에 따라 실제 유출력을 얻는 것이 까다로울 수 있지만 mkdir -p은 좋은 시작입니다. 또한 시스템에 플래그 파일을 생성하고 플래그 파일의 존재를 확인할 수도 있습니다. 존재하는 경우 exit 0입니다.

+0

제공자의 나무 등이 합리적인 것으로 보인다 만들기 :

여기에 두 번 프로비저닝 방지하는 방법의 낮은 이마 예입니다. 반드시 쉬운 것은 아니지만. –

+1

if 문으로 둘러싸인 섹션으로 내 프로비저닝 스크립트를 깰 수 있습니다. 나는 각 섹션의 끝에서 파일을 건 드리면 if 문이 해당 파일이 있는지 확인합니다. 따라서 코드의 각 섹션은 한 번만 실행됩니다. 이것은 매우 적은 복잡성을 추가하며 파일을 확인하고 쓰는 기능이있어서 혼란을 줄일 수 있습니다. 지금까지, 이것은 꽤 잘 작동합니다. 또한 "test -d/path/to/dir || mkdir/path/to/dir"이이 특정 문제를 처리하는 더 좋은 방법 일 수 있음을 제안합니다. 파일에는 -f가 있고 기호 링크에는 -L도 있습니다. "man bash"는 더 많은 것을 가지고 있습니다. – bogeymin

+5

idempotency를 만드는 간단하고 멍청한 방법은 프로비저닝이 끝날 때 (모든 것이 성공했다면)'touch ~/.VM_PROVISIONED'를 터치하고'[-e ~/.VM_PROVISIONED] '를 통해 처음부터 그 존재를 확인하는 것입니다. –

5

이 문제를 조사해 보셨습니까? 특별히 같은 vagrant provision 또는 vagrant reload --provision처럼, 그렇게하도록 지시 할 때

vagrant up --no-provision

$ vagrant up --help 
Usage: vagrant up [vm-name] [options] [-h] 

    --[no-]provision    Enable or disable provisioning 
    --provision-with x,y,z  Enable only certain provisioners, by type. 
    --[no-]parallel    Enable or disable parallelism if provider supports it. 
    --provider provider   Back the machine with a specific provider. 
-h, --help      Print this help 
+0

--no-provision을 사용하면 무조건 프로비져닝을 피하는 것처럼 보입니다. 옵션을 조건부로 스크립트를 사용하여 지정하면 트릭을 수행 할 수 있지만 이상적인 것은 아닙니다. –

4

방랑은 일반적으로 단지 vagrant up에 프로비저닝 코드를 실행합니다. 프로비저닝 스크립트를 다시 실행하지 않으려 고 할 필요가 없습니다. (may not have been the case when you posted the question, however)

요리사 또는 퍼핏을 프로비저닝에 사용하는 경우 이미 모든 항목을 idempotent (으)로 만들었으므로 Salt and Ansible에도 동일하게 적용됩니다.

것은 당신이 쉘 스크립트를 사용하고 있고 당신이 그 (것)들에게 나무 등을 확인하려면, 당신은 if 문에 (파일의 존재와 같은) 어떤 조건을 확인할 수 있습니다 :

if [[! -f "$HOME/bin/something.sh" ]]; then 
    # install something.sh into ~/bin 
fi 

내가 준 매우 일반적인 대답은 제가 mkdir /tmp/foobar이 아니란 것 같습니다. 은 실제로는이고 달성하고자하는 것은 맞지만, 그렇다면 -p을 추가하십시오.

+0

처음으로 프로비저를 실행하는 것이 비교적 최근의 변화 (7 개월 전)라는 점을 언급 해 주셔서 감사합니다. –

-1

오류를 다시 인쇄 할 수 없습니다. 상자가 올라 오면 시설을 사용하여 명시 적으로 발생시키지 않으면 규정하지 않아도됩니다.

더 중요하게도 다른 많은 사람들이 언급 한 것처럼 프로비저닝은 항상 idempotent이어야합니다.

멱등 조리법 동일한 시스템에 여러 번 실행할 수 있으며 그 결과는 항상 동일합니다. 리소스는 레시피에 정의되어 있으며 시스템에서 수행 할 작업을 정의합니다. 주방 클라이언트는 리소스가 변경되지 않았고 수행되는 작업이 매번 같은 방식으로 수행되는 경우 작업이 수행되지 않도록합니다. 레서피가 다시 실행되고 아무 것도 으로 변경되지 않으면 요리사 클라이언트는 아무 것도하지 않습니다.

심판 : https://docs.getchef.com/chef_why.html#idempotence

+0

이것은 처음에'vagrant up --some-option'을 실행했을 때, 그 옵션을 기억하는 것처럼 보입니다. 그래서 다음 번에'vagrant up'을 실행해도'- some-option'을 넘겨 줄 것입니다. 누군가 내가'wagrant up -provision'을 사용하는 것을 문서화했기 때문에 나 자신이 방금 맞았습니다 ... 그리고 내 컴퓨터를 재부팅 한 후에, 나는''막연한 냄새를 맡았습니다. '하고 모든 것을 지워 버렸습니다. – Danosaure

6

당신이 떠들썩한 파티 프로비저닝 스크립트를 사용하는 경우 확률은 멱등되지 않습니다 있습니다.

PROVISIONED="/some-app-dir/PROVISIONED"; 

if [[ -f $PROVISIONED ]]; then 
    echo "Skipping provisioning"; 
    exit; 
else 
    echo "Provisioning"; 
fi 

#...do provisioning things 

touch $PROVISIONED; 
관련 문제