salt在执行cmd.run的二三事

995 views
Skip to first unread message

蓝风

unread,
Sep 12, 2013, 2:42:11 AM9/12/13
to saltstack...@googlegroups.com
遇到的问题主要集中在两点:
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官方当时并没有考虑到多语言的问题

蓝风

unread,
Sep 12, 2013, 2:52:27 AM9/12/13
to saltstack...@googlegroups.com
说了这么多废话,其实总结起来就一句,salt执行的时候没必要去change用户的locale,因为locale默认就是C,即时用户没有设置,那么也不会出现无法支持英文的情况。
minion端装好服务器之后,往往LC_ALL这个变量是空值,但是salt也把LC_ALL=C了,这样就直接覆盖了所有的locale,所以出了BUG。
不过这只是一个小BUG,在用户这段可以手工做小处理。

蓝风

unread,
Sep 13, 2013, 9:29:03 AM9/13/13
to saltstack...@googlegroups.com
已经提交了issue,而且官方将这个打上了BUG的标记

最后,官方解决了这个BUG,粗略code review了一下,发现在原本直接set_env LC_ALL C的地方,加上了判定。
这样应该就不会强制将LC_ALL改为C导致中文乱码了。
可以在下个版本测试一下这个问题是否修复了。

lkx

unread,
Apr 20, 2017, 1:47:33 AM4/20/17
to 中国SaltStack用户组
windows minion上机器编码GB2312,执行结果乱码怎么办的?

在 2013年9月13日星期五 UTC+8下午9:29:03,蓝风写道:
Reply all
Reply to author
Forward
0 new messages