我试图添加:
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文件的解决方案。
答案 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