2013-10-28 8 views
13

Ich habe versucht, hinzuzufügen:Wie kann ich mehrere Befehle mit Salt Stack ausführen?

diese
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' 

Aber aus irgendeinem Grund scheint der Staat ausführen/installieren, aber die Befehle nicht ausgeführt werden, oder zumindest nicht alle von ihnen.

Ich brauche eine Lösung, um mehrere Befehle auszuführen und die Bereitstellung fehlzuschlagen, wenn einer dieser Fehler auftritt.

Ich weiß, dass ich ein Bash-Skript schreiben und dieses Bash-Skript einschließen konnte, aber ich suchte nach einer Lösung, die nur mit der YAML-Datei funktionieren würde.

+0

EDIT: Nevermind, anscheinend kann ich keine Code-Blöcke in Kommentaren buchen. Ich denke, ich werde eine echte Antwort hinterlassen. – basepi

+1

Hey Sorin, ist diese Frage beantwortet? –

+1

Ein weiteres Jahr, ein weiterer Prod zu Sorin, um eine Antwort zu akzeptieren. –

Antwort

43

Sie wollen dies:

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 

Oder diese, die ich bevorzugen würde, wo das Skript vom Master heruntergeladen:

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

Ein Grund, warum die zweite Version besser ist, besteht darin, dass die Protokolle sauberer werden - ansonsten erscheint der gesamte Text des eingebetteten Skripts mehrmals (gestaut in einer Zeile) im Ausgabeprotokoll. –

+1

Danke SteveBennett. Ich hoffe @sorin würde meine Antwort als Lösung markieren. –

+0

Warum kann ich in Salt's Dokumentation keine Erwähnung von '-name: |' finden? Nicht sehr googlefähig, ok. – giorgiosironi

5

Sie tun können, als Dan darauf hingewiesen, mit dem Rohr oder ein cmd.script Zustand. Aber es sollte beachtet werden, dass Sie einige Syntaxprobleme in Ihrem ursprünglichen Post haben. Jeder neue Staat braucht eine name arg, können Sie nicht nur den Befehl setzen nach dem Doppelpunkt:

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

jedoch, dass möglicherweise auch tatsächlich scheitern, weil ich nicht glaube, Sie mehrere von den gleichen Zustand setzen kann unter einer einzigen ID. So können Sie sie wie folgt aufzuschlüsseln:

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

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

In der Tat, Sie haben Recht: Es gibt nur einen Befehl pro ID pro YAML-Parsing als Wörterbuch erlaubt, so dass ein Pkg und ein Cmd koexistieren können, aber nicht zwei Cmd. – Dereckson

8

Zusätzlich zu den oben (besser) Vorschläge, können Sie dies tun:

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 

Aus Gründen verstehe ich noch nicht (I bin ein Salz-Novize), die names werden in umgekehrter Reihenfolge durchlaufen, so dass die Befehle rückwärts ausgeführt werden.

+5

Ich glaube nicht, dass sie in umgekehrter Reihenfolge sind, nur dass die tatsächliche YAML-Reihenfolge der Elemente in einer Liste willkürlich ist, und man nie weiß, wie sie sie sehen wird –

+0

@ThrillScience Es ist nicht YAML (Listen sind garantiert bestellt werden) aber "Namen" ist etwas Besonderes. Es generiert tatsächlich einzelne cmd.run-Status für jeden der angegebenen Namen. Sie können dies überprüfen, indem Sie 'salt-call state.show_sls -out = yaml whatever' ausführen. Siehe https://docs.saltstack.com/en/latest/ref/states/highstate.html#names-declaration Die Reihenfolge der umgekehrten Zustände war ein 'Name'-Implementierungsfehler, der meiner Meinung nach behoben wurde. – notpeter

Verwandte Themen