2013-10-28 16 views
13

Próbowałem dodać:Jak mogę wykonać wiele poleceń za pomocą 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' 

Ale z jakiegoś powodu ten stan wydaje się uruchomić/zainstalować ale polecenia nie są wykonywane, albo przynajmniej nie wszyscy.

Potrzebuję rozwiązania do uruchamiania wielu poleceń i do niepowodzenia wdrożenia, jeśli którykolwiek z nich nie powiedzie się.

Wiem, że mógłbym napisać skrypt basha i dołączyć ten skrypt Bash, ale szukałem rozwiązania, które działałoby tylko z plikiem YAML.

+0

EDYCJA: Nieważne, najwyraźniej nie mogę umieszczać bloków kodu w komentarzach. Chyba zostawię prawdziwą odpowiedź. – basepi

+1

Hej, sorin, czy to pytanie zostało odebrane? –

+1

Kolejny rok, kolejny prod do sorin, aby zaakceptować odpowiedź. –

Odpowiedz

43

Chcesz to:

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 

albo to, co wolałbym, gdzie skrypt jest pobierany z Master:

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

Jednym z powodów, dla których druga wersja jest lepsza, jest to, że logi kończą się czystsze - w przeciwnym razie cały tekst osadzonego skryptu pojawia się (zakleszczony na jednej linii) kilka razy w logu wyjściowym. –

+1

Dzięki SteveBennett. Mam nadzieję, że @sorin oznaczyłby moją odpowiedź jako rozwiązanie. –

+0

Dlaczego nie mogę znaleźć wzmianki o "-name: |" w dokumentacji Salt? Niezbyt grzeczny, ok. – giorgiosironi

5

Można zrobić jak Dan zauważył, stosując rurę lub stan cmd.script. Należy jednak zauważyć, że w oryginalnym poście występują pewne problemy z składnią. Każde nowe państwo potrzebuje name Arg, nie można po prostu umieścić komendę po dwukropku:

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

jednak, że w rzeczywistości może zawieść, jak również, ponieważ nie sądzę, można umieścić wielokrotność tego samego stanu pod jednym identyfikatorem. Więc może trzeba podzielić je tak:

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

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

Rzeczywiście masz rację: jest tylko jedno polecenie dozwolone dla każdego id na parsowanie YAML jako słownik, więc jeden pkg i jeden cmd mogą współistnieć, ale nie dwa cmd. – Dereckson

8

Oprócz powyższych sugestii (lepszy), można to zrobić:

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 

Ze względów Jeszcze nie rozumieją (I jest nowicjuszem Salt), names są iterowane w odwrotnej kolejności, więc polecenia są wykonywane wstecz.

+5

Nie sądzę, że są one w odwrotnej kolejności, tylko że faktyczne porządkowanie YAML pozycji na liście jest arbitralne i nigdy nie wiesz, jak to się stanie. –

+0

@ThrillScience To nie jest YAML (listy gwarantowane być zamówione), ale "nazwy" są szczególne. W rzeczywistości generuje pojedyncze stany cmd.run dla każdej z podanych nazw. Możesz to sprawdzić, uruchamiając 'salt-call state.show_sls --out = yaml cokolwiek'. Zobacz https://docs.saltstack.com/en/latest/ref/states/highstate.html#names-declaration Odwrócona kolejność stanów była błędem implementacji "nazw", który, jak sądzę, został naprawiony. – notpeter

Powiązane problemy