如何使用Salt Stack执行多个命令?

时间:2013-10-28 17:04:14

标签: 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'

但由于某种原因,状态似乎执行/安装,但命令没有执行,或者至少不是全部执行。

我需要一个运行多个命令的解决方案,如果其中任何一个失败,则需要部署失败。

我知道我可以写一个bash脚本并包含这个bash脚本,但我一直在寻找一个只能用于YAML文件的解决方案。

4 个答案:

答案 0 :(得分:49)

你想要这个:

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

答案 1 :(得分:8)

除上述(更好)建议外,您还可以这样做:

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以相反的顺序迭代,因此命令会向后执行。

答案 2 :(得分:5)

你可以像Dan指出的那样,使用管道或cmd.script状态。但应该注意的是,您的原始帖子中存在一些语法问题。每个新状态都需要一个name arg,你不能只是把命令放在冒号之后:

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'

答案 3 :(得分: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
相关问题