web-dev-qa-db-fra.com

Comment puis-je exécuter plusieurs commandes à l'aide de Salt Stack?

J'ai essayé d'ajouter:

 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'

Mais pour une raison quelconque, l'état semble exécuter/installer mais les commandes ne sont pas exécutées, ou du moins pas toutes.

J'ai besoin d'une solution pour exécuter plusieurs commandes et échouer le déploiement si l'une d'elles échoue.

Je sais que je pourrais écrire un script bash et inclure ce script bash, mais je cherchais une solution qui ne fonctionnerait qu'avec le fichier YAML.

17
sorin

Tu veux ça:

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

Ou ceci, que je préférerais, où le script est téléchargé depuis le maître:

cmd-test:
  cmd.script:
    - source: salt://foo/bar.sh
    - cwd: /where/to/run
    - user: fred
50
Dan Garthwaite

En plus des (meilleures) suggestions ci-dessus, vous pouvez faire ceci:

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

Pour des raisons que je ne comprends pas encore (je suis un novice de Salt), les names sont itérés dans l'ordre inverse, donc les commandes sont exécutées à l'envers.

10
Steve Bennett

Vous pouvez faire comme Dan l'a souligné, en utilisant le tuyau ou un cmd.script Etat. Mais il convient de noter que vous avez des problèmes de syntaxe dans votre message d'origine. Chaque nouvel état a besoin d'un argument name, vous ne pouvez pas simplement mettre la commande après les deux points:

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

Cependant, cela peut également échouer, car je ne pense pas que vous puissiez mettre plusieurs du même état sous un seul ID. Vous devrez donc peut-être les répartir comme suit:

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

second:
  cmd.run:
    - name: 'my second command'
5
Colton Myers