最近又用到了saltstack,发现过了这么多年,salt的file模块无法发送中文名称文件问题还没有人解决,蛋蛋的忧伤。
于是从昨晚一直决战到今天天亮,终于找到了可行性方法。
下面做个笔记,希望能帮到有需要的人。
一、系统环境
系统:CentOS7.2
python版本:2.7.5
salt版本:2015.5.10
二、问题展现
需求:要同步一个文件夹(同步文件或文件夹一样)到minion端,文件夹里包含中文名称的文件
执行过程报错:
192.168.1.127:
----------
ID: dir_send
Function: file.recurse
Name: /tmp/ylhb
Result: False
Comment: An exception occurred in this state: Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/salt/state.py", line 1564, in call
**cdata['kwargs'])
File "/usr/lib/python2.7/site-packages/salt/states/file.py", line 2401, in recurse
) for (k, v) in six.iteritems(ret['comment'])).strip()
File "/usr/lib/python2.7/site-packages/salt/states/file.py", line 2401, in <genexpr>
) for (k, v) in six.iteritems(ret['comment'])).strip()
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 10: ordinal not in range(128)
Started: 16:16:17.297668
Duration: 23.924 ms
Changes:
Summary
------------
Succeeded: 0
Failed: 1
------------
Total states run: 1
ERROR: Minions returned with non-zero exit code
查看python默认编码:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>>
可知默认的编码是ascii。
由于python默认编码为ascii,当程序中出现非ascii编码时,python的处理常常会报“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 10: ordinal not in range(128)”这样的错(python3不会有这样的问题)。
三、解决方法:
只需修改python默认编码为“utf-8”即可(master端和minion端都要修改),修改方式如下:
新增文件/usr/lib/python2.7/site-packages/sitecustomize.py,内容如下:
# -*- coding: UTF-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
再次查看python默认编码:
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>
重启salt服务(master端执行“systemctl restart salt-master”,minion端执行“systemctl restart -salt-minion”)。
再次执行发送中文名称文件:
192.168.1.127:
----------
ID: dir_send
Function: file.recurse
Name: /tmp/ylhb
Result: True
Comment: Recursively updated /tmp/ylhb
Started: 17:06:40.381259
Duration: 71.074 ms
Changes:
----------
/tmp/ylhb/雨落寒冰:
----------
diff:
New file
mode:
0644
Summary
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
以上发送中文名称文件成功。
注:以上仅适用于Linux系列系统,暂不支持Windows(闭源太麻烦了,已经很多年没用了,试着把python升级到3以上版本解决吧)