2013-10-28 18 views
13

Ho provato ad aggiungere:Come posso eseguire più comandi usando 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' 

Ma per qualche ragione questo stato sembra per eseguire/installare, ma i comandi non vengono eseguiti, o almeno non tutti.

Ho bisogno di una soluzione per eseguire più comandi e fallire la distribuzione se uno di questi fallisce.

So che potrei scrivere uno script bash e includere questo script bash, ma stavo cercando una soluzione che avrebbe funzionato solo con il file YAML.

+0

EDIT: Nevermind, a quanto pare non posso pubblicare blocchi di codice nei commenti. Immagino che lascerò una risposta vera. – basepi

+1

Ehi sorin, questa domanda ha una risposta? –

+1

Un altro anno, un altro prod a sorin per accettare una risposta. –

risposta

43

Si desidera che questo:

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 

O questo, che io preferirei, in cui lo script viene scaricato dal master:

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

Uno dei motivi per cui la seconda versione è migliore è che i registri finiscono per essere più puliti, altrimenti l'intero testo dello script incorporato appare (incastrato su una riga) più volte nel registro di output. –

+1

Grazie SteveBennett. Spero che @sorin segni la mia risposta come soluzione. –

+0

Perché non riesco a trovare una menzione di '-name: |' nella documentazione di Salt? Non molto googleable, ok. – giorgiosironi

5

Si può fare come Dan ha sottolineato, utilizzando il tubo o uno stato cmd.script. Ma va notato che hai alcuni problemi di sintassi nel tuo post originale. Ogni nuovo stato ha bisogno di un arg name, non si può semplicemente mettere il comando dopo i due punti:

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

tuttavia, che in realtà potrebbe non riuscire pure, perché non credo che si può mettere più di uno stesso Stato sotto un singolo ID. Così potrebbe essere necessario dividerli come questo:

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

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

Infatti, hai ragione: c'è un solo comando per ID per YAML che analizza come dizionario, quindi un pkg e un cmd possono coesistere, ma non due cmd. – Dereckson

8

Oltre alle (migliore) suggerimenti di cui sopra, si può fare questo:

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 

Per ragioni che ancora non capisco (I Sono un novizio salato), il names viene iterato in ordine inverso, quindi i comandi vengono eseguiti all'indietro.

+5

Non penso che siano in ordine inverso, solo che l'effettivo ordinamento YAML degli elementi in una lista è arbitrario e non si sa mai come li vedrà –

+0

@ThrillScience Non è YAML (le liste sono garantite per essere ordinato) ma "nomi" è speciale. In realtà genera singoli stati cmd.run per ciascuno dei nomi specificati. Puoi verificarlo eseguendo 'salt-call state.show_sls --out = yaml qualunque'. Vedi https://docs.saltstack.com/en/latest/ref/states/highstate.html#names-declaration L'ordine di stato invertito era un bug di implementazione di "nomi" che credo sia stato corretto. – notpeter

Problemi correlati