遇到的问题主要集中在两点:
1,直接cmd.run的时候发现不能执行
2.脚本有中文写入日志的时候有时候会发现乱码。
解决的过程。
起初很疑惑,用了一种调试的方法,写了一个这样的sls文件
echo PATH=$PATH; echo USER=$USER ; echo HOME=$HOME; echo SHELL=$SHELL; locale:
cmd.run
同步之后发现了这样:
----------
State: - cmd
Name: echo PATH=$PATH; echo USER=$USER ; echo HOME=$HOME; echo SHELL=$SHELL; locale
Function: run
Result: True
Comment: Command "echo PATH=$PATH; echo USER=$USER ; echo HOME=$HOME; echo SHELL=$SHELL; locale" run
Changes: pid: 23978
retcode: 0
stderr:
stdout: PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
USER=
HOME=
SHELL=
LANG=
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C
发现问题!如果直接cmd.run的话,仅仅是这么几个PATH而已,如果命令不在这些PATH,那么的确是无法执行,和cron不执行的原因是一样的。
遂作以下修改:
echo PATH=$PATH; echo USER=$USER ; echo HOME=$HOME; echo SHELL=$SHELL; locale:
cmd.run:
- user: root
- shell: /bin/bash
再次同步:
----------
State: - cmd
Name: echo PATH=$PATH; echo USER=$USER ; echo HOME=$HOME; echo SHELL=$SHELL; locale
Function: run
Result: True
Comment: Command "echo PATH=$PATH; echo USER=$USER ; echo HOME=$HOME; echo SHELL=$SHELL; locale" run
Changes: pid: 24217
retcode: 0
stderr:
stdout: PATH=/root/.gvm/vertx/current/bin:/root/.gvm/springboot/current/bin:/root/.gvm/lazybones/current/bin:/root/.gvm/groovyserv/current/bin:/root/.gvm/groovy/current/bin:/root/.gvm/griffon/current/bin:/root/.gvm/grails/current/bin:/root/.gvm/gradle/current/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
USER=root
HOME=/root
SHELL=/bin/bash
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN.UTF-8
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C
很好,成功的解决了环境变量的问题,拿到了minion的bash下的环境变量,这次shell脚本正常执行了。
但是发现日志中的中文依旧乱码。在minion执行locale命令:
~# locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY=zh_CN.UTF-8
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
LC_TELEPHONE=zh_CN.UTF-8
LC_MEASUREMENT=zh_CN.UTF-8
LC_IDENTIFICATION=zh_CN.UTF-8
LC_ALL=
发现一切ok,执行脚本也不会乱码,我的/etc/default/locale文件配置:
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN.UTF-8"
仔细对比了一下,发现了原来是salt将$LANG和$LC_*变量中没有赋值的全部置为C,要注意C并不是UTF-8,LC_ALL这个变量的优先级是最高的,也就是这个变量一旦有值,将会直接覆盖LC_*变量和LANG变量,这样中文支持就会出现问题,那么问题找到了,解决起来就简单了。
解决方案:
给LC_ALL赋值,在/etc/default/locale加上LC_ALL=zh_CN.UTF-8
或者在脚本中开头写上export LC_ALL=zh_CN.UTF-8即可。
也许salt官方当时并没有考虑到多语言的问题