2013-10-28 20 views
13

我嘗試添加:如何使用Salt Stack執行多個命令?

mypack: 
    pkg: 
    - installed 
    - pkgs: 
     - mercurial 
     - git 
    cmd.run: 
     - name: 'mkdir -p /opt/mypack' 
    cmd.run: 'hg pull -u -R /opt/mypack || hg clone -R /opt https://...' 
    cmd.run: 'ln -s /opt/mypack/etc/init.d/xxx /etc/init.d/xxx' 

但出於某種原因,這個國家似乎執行/安裝,但該命令沒有執行,或者至少不是所有的人。

我需要一個解決方案來運行多個命令並在部署失敗時失敗。

我知道我可以編寫一個bash腳本幷包含這個bash腳本,但是我正在尋找一種僅適用於YAML文件的解決方案。

+0

編輯:沒關係,顯然我不能在評論中張貼代碼塊。我想我會留下一個真實的答案。 – basepi

+1

嘿索林,這個問題是否回答? –

+1

另一年,另一個刺激索林接受答案。 –

回答

43

你想這樣的:

cmd-test: 
    cmd.run: 
    - name: | 
     mkdir /tmp/foo 
     chown dan /tmp/foo 
     chgrp www-data /tmp/foo 
     chmod 2751 /tmp/foo 
     touch /tmp/foo/bar 

還是這個,這是我希望,這裏的腳本是從主機下載:

cmd-test: 
    cmd.script: 
    - source: salt://foo/bar.sh 
    - cwd: /where/to/run 
    - user: fred 
+0

第二個版本更好的一個原因是日誌最終更清晰 - 否則嵌入腳本的整個文本會在輸出日誌中出現(卡在一行)多次。 –

+1

謝謝SteveBennett。我希望@sorin會將我的答案標記爲解決方案。 –

+0

爲什麼我在Salt的文檔中找不到提及'-name:|'的內容?不是很好,可以。 – giorgiosironi

5

你可以做丹指出,使用管道或cmd.script狀態。但應該指出的是,您在原始文章中有一些語法問題。每一個新的狀態需要一個name阿根廷,你不能只是把命令冒號後:

mypack: 
    pkg: 
    - installed 
    - pkgs: 
     - mercurial 
     - git 
    cmd.run: 
    - name: 'my first command' 
    cmd.run: 
    - name: 'my second command' 

然而,實際上可能無法爲好,因爲我不認爲你可以把相同狀態的多個在一個單一的ID下面。所以,你可能需要他們打出這樣的:

first: 
    cmd.run: 
    - name: 'my first command' 

second: 
    cmd.run: 
    - name: 'my second command' 
+0

事實上,你是對的:每個YAML解析只有一個命令允許每個YAML解析爲一個字典,因此一個pkg和一個cmd可以共存,但不是兩個cmd。 – Dereckson

8

除了以上(更好)的建議,你可以這樣做:

cmd-test: 
    cmd.run: 
    - names: 
     - mkdir -p /opt/mypack 
     - hg pull -u -R /opt/mypack || hg clone -R /opt https://... 
     - ln -s /opt/mypack/etc/init.d/xxx /etc/init.d/xxx 

至於原因,我不明白,但(我鹽是一個新手),names以相反的順序迭代,所以這些命令向後執行。

+5

我不認爲這是他們倒序,只是在列表中的項目的實際YAML排序是任意的,你永遠不知道它將如何看到他們 –

+0

@ThrillScience這不是YAML(列表保證被命令)但'名字'是特別的。它實際上爲每個指定名稱生成單獨的cmd.run狀態。您可以通過運行'salt-call state.show_sls --out = yaml whatever'來驗證這一點。請參閱https://docs.saltstack.com/en/latest/ref/states/highstate.html#names-declaration顛倒的狀態順序是一個'名稱'的實現錯誤,我相信已經修復。 – notpeter