Подтвердить что ты не робот

Как выполнить несколько команд с помощью Соляного стека?

Я попытался добавить:

 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 script и включить этот bash script, но я искал решение, которое будет работать только с файлом YAML.

4b9b3361

Ответ 1

Вы хотите:

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

Или это, что я бы предпочел, где script загружается от ведущего:

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

Ответ 2

В дополнение к вышеуказанным (лучшим) предложениям вы можете сделать это:

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

По причинам, которые я пока не понимаю (я новичок Salt), names повторяются в обратном порядке, поэтому команды выполняются в обратном направлении.

Ответ 3

Вы можете сделать, как указал Дэн, используя трубку или состояние 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'