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

由于我还不明白的原因(我是 Salt 新手),names它们以相反的顺序迭代,因此命令被向后执行。

于 2014-02-11T10:07:34.440 回答
4

您可以按照 Dan 指出的方式使用管道或cmd.script状态进行操作。但应该注意的是,您在原始帖子中存在一些语法问题。每个新状态都需要一个namearg,您不能只将命令放在冒号后面:

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'
于 2013-10-29T17:20:02.133 回答
0

正如上面一位用户指出的那样,这按正确的顺序工作(盐 3000.2)


install_borg:
    cmd.run:
        - names: 
            - cd /tmp
            - wget https://github.com/borgbackup/borg/releases/download/1.1.15/borg-linux64
            - mv borg-linux64 /usr/local/bin/borg
            - chmod u+x /usr/local/bin/borg
            - chown root:root /usr/local/bin/borg
            - ln -s /usr/local/bin/borg /usr/bin/borg
        - unless: test -f /usr/bin/borg
于 2021-01-13T16:40:35.880 回答