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

sor*_*rin 17 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'
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dan*_*ite 50

你要这个:

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
Run Code Online (Sandbox Code Playgroud)

或者这是我希望从主服务器下载脚本的地方:

cmd-test:
  cmd.script:
    - source: salt://foo/bar.sh
    - cwd: /where/to/run
    - user: fred
Run Code Online (Sandbox Code Playgroud)

  • 谢谢SteveBennett.我希望@sorin能够将我的答案标记为解决方案. (2认同)
  • 为什么我在 Salt 的文档中找不到对 `-name: |` 的提及?不是很适合谷歌,好吧。 (2认同)

Ste*_*ett 9

除了上述(更好)的建议,你可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 我不认为它们是相反的顺序,只是列表中项目的实际YAML排序是任意的,你永远不知道如何看到它们 (5认同)
  • @ThrillScience 这不是 YAML(列表保证是有序的),但“名称”很特殊。它实际上为每个指定的名称生成单独的 cmd.run 状态。您可以通过运行“salt-call state.show_sls --out=yamlwhatever”来验证这一点。请参阅https://docs.saltstack.com/en/latest/ref/states/highstate.html#names-declaration 颠倒的状态顺序是一个“名称”实现错误,我相信该错误已得到修复。 (2认同)

小智 5

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

mypack:
  pkg:
    - installed
    - pkgs:
      - mercurial
      - git
  cmd.run:
    - name: 'my first command'
  cmd.run:
    - name: 'my second command'
Run Code Online (Sandbox Code Playgroud)

但是,实际上这也可能会失败,因为我认为你不能在同一个ID下放置多个相同的状态.所以你可能需要将它们拆分成这样:

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

second:
  cmd.run:
    - name: 'my second command'
Run Code Online (Sandbox Code Playgroud)