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“


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com