Saltstack运行cmd.run重新启动tomcat后出现日志乱码(15)
Saltstack使用的cmd.run调用的是核心模块cmdmod.py,以下我们来看一下cmdmod.py模块的源代码:
cat /usr/lib/python2.6/site-packages/salt/modules/cmdmod.py
......
    if reset_system_locale is True:
        if not salt.utils.is_windows():
            # Default to C!
            # Salt only knows how to parse English words
            # Don't override if the user has passed LC_ALL
            env.setdefault('LC_ALL', 'C')      #默认设置为“C”
        else:
            # On Windows set the codepage to US English.
            if python_shell:
                cmd = 'chcp 437 > nul & ' + cmd
.....
#run函数
def run(cmd,
        cwd=None,
        stdin=None,
        runas=None,
        shell=DEFAULT_SHELL,
        python_shell=None,
        env=None,
        clean_env=False,
        template=None,
        rstrip=True,
        umask=None,
        output_loglevel='debug',
        timeout=None,
        reset_system_locale=True,
        ignore_retcode=False,
        saltenv='base',
        use_vt=False,
        **kwargs):
......
从上可知,Salt在运行cmd.run前会将minion端的字符集默认设置为“C”,而眼下大部分tomcat应用使用的是UTF-8字符集,所以Salt运行cmd.run重新启动tomcat后会出现日志乱码。
其实。从早期的Salt版本号。以及截至到眼下最新的Salt的RPM版本号2015.5.5,在运行cmd.run前都会将minion端的字符集默认设置为“C”,依照我们的思想,这是一个BUG。
解决的方法:
1.改动源代码
cat /usr/lib/python2.6/site-packages/salt/modules/cmdmod.py
......
    if reset_system_locale is True:
        if not salt.utils.is_windows():
            # Default to C!
            # Salt only knows how to parse English words
            # Don't override if the user has passed LC_ALL
            pass
        else:
            # On Windows set the codepage to US English.
            if python_shell:
                cmd = 'chcp 437 > nul & ' + cmd
......或
cat /usr/lib/python2.6/site-packages/salt/modules/cmdmod.py
......
#run函数
def run(cmd,
        cwd=None,
        stdin=None,
        runas=None,
        shell=DEFAULT_SHELL,
        python_shell=None,
        env=None,
        clean_env=False,
        template=None,
        rstrip=True,
        umask=None,
        output_loglevel='debug',
        timeout=None,
        reset_system_locale=False,
        ignore_retcode=False,
        saltenv='base',
        use_vt=False,
        **kwargs):
......
改动源代码必须保证master端和minion端都被改动。后期新增minion端还要改动,十分麻烦。
如此能够考虑以下这样的方法:
2.运行cmd.run前设定LC_ALL为空
命令行运行:
如:
salt '10.0.10.100' cmd.run  'locale' env='{"LC_ALL": ""}'    #添加參数env='{"LC_ALL": ""}'编写state.sls:
locale:
  cmd.run:
    - name: locale
    - env:
      - LC_ALL: ""
以上就可以解决运行cmdmod.py改动字符集的问题。
值得庆幸的是。https://github.com/saltstack/salt上眼下最新版的salt 2015.8.3已经将这个问题攻克了,新的cmdmod.py源代码改动例如以下:
......
    if reset_system_locale is True:
        if not salt.utils.is_windows():
            # Default to C!
            # Salt only knows how to parse English words
            # Don't override if the user has passed LC_ALL
            env.setdefault('LC_CTYPE', 'C')
            env.setdefault('LC_NUMERIC', 'C')
            env.setdefault('LC_TIME', 'C')
            env.setdefault('LC_COLLATE', 'C')
            env.setdefault('LC_MONETARY', 'C')
            env.setdefault('LC_MESSAGES', 'C')
            env.setdefault('LC_PAPER', 'C')
            env.setdefault('LC_NAME', 'C')
            env.setdefault('LC_ADDRESS', 'C')
            env.setdefault('LC_TELEPHONE', 'C')
            env.setdefault('LC_MEASUREMENT', 'C')
            env.setdefault('LC_IDENTIFICATION', 'C')
        else:
            # On Windows set the codepage to US English.
            if python_shell:
                cmd = 'chcp 437 > nul & ' + cmd
......仍是默认设置字符集为“C”,可是不再是”LC_ALL“为”C“ 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号