2013-01-10 46 views
16

我試圖得到一個shell供應方,以避免另配一個虛擬機實例,如果它已經這樣做了前面。避免另配一個流浪VM如果已提供

考慮以下Vagrantfile:

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 up minimal,它最初將箱子和提供它。如果你然後運行vagrant provision minimal它會嘗試重新配置這個盒子,但會失敗(因爲/ tmp/foobar目錄已經存在)。

有沒有一種方法,使流浪記住它是否已經過去供應的機器,避免以後再供應呢?

更多背景:如果我運行vagrant up minimal,重新啓動我的主機,然後再次運行vagrant up minimal,它會嘗試另配箱和失敗。由於VirtualBox經常導致我的主機上發生內核恐慌,所以經常會發生這種情況。

回答

10

這可能不是你想要的答案,但如果你改變mkdirmkdir -p,它的工作;)

在所有的嚴重性,不過,我想流浪預計爲冪等供應方(即,如果第二次運行,它將不採取任何行動)。

這可能是棘手實現真正冪等,這取決於你實際做在置備的腳本是什麼,但mkdir -p是一個良好的開端。你也可以在系統上創建一個標誌文件,並首先檢查該標誌文件是否存在;如果存在,只需exit 0

+0

使供應方冪似乎是合理的。雖然不一定容易。 –

+1

我將供應腳本分成if語句包圍的部分。我觸摸每個部分末尾的文件,if語句檢查是否存在該文件。所以每段代碼只能運行一次。這增加了很少的複雜性,並且我有用於檢查和寫入文件以減少混亂的功能。到目前爲止,這工作得很好。我還建議「test -d/path/to/dir || mkdir/path/to/dir」可能是處理這個特定問題的更好方法。還有-f用於文件,-L用於符號鏈接。 「男人bash」有更多。 – bogeymin

+5

創建冪等性的簡單和愚蠢的方法是在調配結束時觸摸〜/ .VM_PROVISIONED(提供的所有內容都是成功的),並通過'[-e〜/ .VM_PROVISIONED]'檢查它是否存在。 –

5

你看過這個嗎?

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供應代碼,當你明確告訴它這樣做,比如用vagrant provisionvagrant reload --provision。真的沒有必要爲避免再次運行配置腳本而走出困境。 (這may not have been the case when you posted the question, however

如果您使用的廚師或木偶置備他們已經設計,使一切idempotent,我會承擔同樣是鹽和Ansible如此。

如果你使用shell腳本,你想讓他們冪等,您可以在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'。我自己剛剛碰到那個,因爲有人記錄了使用'vagrant up --provision'......並且在重啓我的機器之後,我做了一個'vagrant up',並且所有的東西都被消滅了。 – Danosaure

6

如果你使用一個bash腳本配置,賠率是它不會冪等。

這裏有一個如何避免供應兩次低眉頭例如:

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

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

#...do provisioning things 

touch $PROVISIONED;