19

追加しようとしました:

 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 スクリプトを作成してこの bash スクリプトを含めることができることはわかっていますが、YAML ファイルのみで機能するソリューションを探していました。

4

4 に答える 4

54

あなたはこれを求めている:

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

または、これは、スクリプトがマスターからダウンロードされる場所です。

cmd-test:
  cmd.script:
    - source: salt://foo/bar.sh
    - cwd: /where/to/run
    - user: fred
于 2013-10-29T15:53:04.460 に答える
14

上記の(より良い)提案に加えて、これを行うことができます:

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

理由はまだわかりませんが (私はソルトの初心者です)、names逆の順序で繰り返されるため、コマンドは逆方向に実行されます。

于 2014-02-11T10:07:34.440 に答える
4

パイプまたは状態を使用して、ダンが指摘したように行うことができますcmd.script。ただし、元の投稿には構文の問題があることに注意してください。新しい状態ごとにname引数が必要です。コロンの後にコマンドを配置することはできません。

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

ただし、1 つの ID の下に複数の同じ状態を配置できるとは思わないため、実際には失敗する可能性もあります。したがって、次のように分割する必要がある場合があります。

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

second:
  cmd.run:
    - name: 'my second command'
于 2013-10-29T17:20:02.133 に答える