SALT.STATES.CMD
可执行任意命令
示例:
1 # Store the current date in a file 2 date > /tmp/salt-run: #将state ID作为默认的name参数 3 cmd.run
示例1:
1 > /var/log/messages: 2 cmd.run: 3 - unless: echo 'foo' > /tmp/.test && rm -f /tmp/.test
#当unless定义的条件执行失败的时候执行这条命令,可用于磁盘空间不足时清理日志腾出空间
示例2:
1 touch /tmp/foo: 2 cmd.run: 3 - creates: /tmp/foo
#如果creates指定的文件不存在的时候执行
示例3:
1 echo 'foo' | tee /tmp/bar > /tmp/baz: 2 cmd.run: 3 - creates: 4 - /tmp/bar 5 - /tmp/baz
#creates支持列表参数
cmd state执行的成功与否取决于命令执行后的返回状态码,同样的脚本执行的状态是有退出码决定的,如果你希望无论如何脚本都被视为执行成功可以定义一个退出状态码为0
cmd state总是被视为产生改变(changed)的动作,因为cmd动作是无法进行预测的,如果在cmd被关联到watched函数,那么将总会被执行
USING THE "STATEFUL" ARGUMENT
目前有许多state函数接受stateful参数,如果stateful指定为真,那么执行的命令和脚本将自己决定返回的状态和相关信息,并遵从一下的协议:
1、如果命令的标准输出为空就表示该命令执行的状态是on changes,如果有,那么返回内容必须是json格式的数据或以等号形式的键值对。
2、如果是一个json的话必须是一个json对象,如果是key=value形式,可以中间包含空格,可使用Python的shlex模块进行解析。
示例:
1 changed: bool (i.e., 'yes', 'no', 'true', 'false', case-insensitive) 2 comment: str (i.e., any string)
如果changes设置为True,那么其他的键值信息将视为changes信息的一部分
3、如果有注释,那么它将会作为state的注释使用
以下是编写有状态的shell脚本(脚本处于minion端),示例:
1 #!/bin/bash 2 # 3 echo "Working hard..." 4 5 # writing the state line 6 echo # an empty line here so the next line will be the last. 7 echo "changed=yes comment='something has changed' whatever=123"
state模块示例:
1 Run myscript: 2 cmd.run: 3 - name: /path/to/myscript 4 - cwd: / 5 - stateful: True 6 7 Run only if myscript changed something: 8 cmd.run: 9 - name: echo hello 10 - cwd: / 11 - onchanges: 12 - cmd: Run myscript
运行结果如下:
1 ---------- 2 ID: Run myscript 3 Function: cmd.run 4 Name: /tmp/ceshi.sh 5 Result: True 6 Comment: something has changed 7 Started: 17:15:41.233557 8 Duration: 7.009 ms 9 Changes: 10 ---------- 11 changed: 12 yes 13 pid: 14 4081 15 retcode: 16 0 17 stderr: 18 stdout: 19 Working hard... 20 whatever: 21 123 22 ---------- 23 ID: Run only if myscript changed something 24 Function: cmd.run 25 Name: echo hello 26 Result: True 27 Comment: Command "echo hello" run 28 Started: 17:15:41.258921 29 Duration: 4.515 ms 30 Changes: 31 ---------- 32 pid: 33 4084 34 retcode: 35 0 36 stderr: 37 stdout: 38 hello 39 40 Summary for XX.XX.XX.XX 41 ------------ 42 Succeeded: 2 (changed=2) 43 Failed: 0 44 ------------ 45 Total states run: 2 46 Total run time: 11.524 ms
该script定义了changed返回值,和相关的comment提示值。
4、在stateful里面包含test_name参数
1 Run myscript: 2 cmd.run: 3 - name: /path/to/myscript 4 - cwd: / 5 - stateful: 6 - test_name: /path/to/myscript test 7 8 Run masterscript: 9 cmd.script: 10 - name: masterscript 11 - source: salt://path/to/masterscript 12 - cwd: / 13 - stateful: 14 - test_name: masterscript test
如何使用CMD.RUN OR CMD.WAIT
这两个states经常会搞混。重点是记住:mod:cmd.run <salt.states.cmd.run> states 在包含它的SLS文件中每次都执行。如果更合理的需求是只是在一些其他state改变的时候才运行,那么 cmd.wait 其他states,并且当监控的state改变时才执行。范例:
示例:
1 /usr/local/bin/postinstall.sh: 2 cmd.wait: 3 - watch: 4 - pkg: mycustompkg 5 file.managed: 6 - source: salt://utils/scripts/postinstall.sh 7 8 mycustompkg: 9 pkg.installed: 10 - require: 11 - file: /usr/local/bin/postinstall.sh
cmd.wait本身不做任何事情,这是通过观察变化来调用的。为了在未来不引起混乱的用法,建议使用onchanges和requires,放在cmd.run模块里面使用
示例:
1 /usr/local/bin/postinstall.sh: 2 cmd.run: 3 - onchanges: 4 - pkg: mycustompkg 5 file.managed: 6 - source: salt://utils/scripts/postinstall.sh 7 8 mycustompkg: 9 pkg.installed: 10 - require: 11 - file: /usr/local/bin/postinstall.sh
执行逻辑是,当执行cmd.run时检查onchanges依赖,执行installed state,又找到依赖file.managed,当执行完file之后再执行mycustompkg,最后根据mycustompkg的执行状态来决定cmd.run的执行。
HOW DO I CREATE AN ENVIRONMENT FROM A PILLAR MAP?
使用示例:
1 printenv: 2 cmd.run: 3 - env: {{ salt['pillar.get']('example:key', {}) }}
salt.states.cmd.run(name, onlyif=None, unless=None, creates=None, cwd=None, user=None, group=None, shell=None, env=None, stateful=False, umask=None, output_loglevel='debug', quiet=False, timeout=None, ignore_timeout=False, use_vt=False, **kwargs)
name: 要执行的命令,记住该命令将会在salt-minion的路径和权限下执行。
onlyif:一个用于检查的命令,仅当``onlyif``选项指向的命令返回true时才执行name定义的命令
unless:用于检查的命令,仅当``unless``选项指向的命令返回false时才执行name指向的命令
cwd: 执行命令时的当前工作目录,默认是/root
user: 以指定用户身份运行命令
group: 以指定用户组身份运行命令
shell: 用于执行命令的shell,默认shell grain
env: 设置执行命令的环境变量,示例
1 script-bar: 2 cmd.run: 3 - env: "PATH=/some/path:$PATH"
stateful:定制执行结果返回状态和信息
umask:当命令运行时使用的umask(八进制数)。
output_loglevel:定义输出的日志级别
quiet:output_loglevel: quiet
timeout:如果命令在超时秒数到达时还未终止,发送子进程信号sigterm,并且如果sigterm被忽略,就接着发送sigkill
ignore_timeout:忽略命令的超时时间,可使用nohup运行过程。
creates:测试指定文件是否存在,不存在就执行
use_vt:实验性的一个命令
注解:
cmd.run支持reload_modules函数,这个函数允许你reload所有模块,当你的状态执行依赖一个真正安装的软件包的时候有可能会失败。
示例:
1 getpip: 2 cmd.run: 3 - name: /usr/bin/python /usr/local/sbin/get-pip.py 4 - unless: which pip 5 - require: 6 - pkg: python 7 - file: /usr/local/sbin/get-pip.py 8 - reload_modules: True #在安装python和同步pip文件之后再执行name命令