Saltstack模块file发送中文名称文件问题解决

最近又用到了saltstack,发现过了这么多年,salt的file模块无法发送中文名称文件问题还没有人解决。
蛋蛋的忧伤啊,国内这么流行的东西既然不支持中文。
于是从昨晚一直决战到今天天亮,终于找到了可行性方法。
下面做个笔记,希望能帮到有需要的人。

一、系统环境

系统:CentOS7.2
python版本:2.7.5
salt版本:2015.5.10

二、问题展现

需求:要同步一个文件夹(同步文件或文件夹一样)到minion端,文件夹里包含中文名称的文件
执行过程报错:

[plain] view plain copy
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默认编码:

[plain] view plain copy
>>> 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,内容如下:

[python] view plain copy
# -*- coding: UTF-8 -*-  
import sys   
reload(sys)  
sys.setdefaultencoding('utf-8')  

再次查看python默认编码:

[python] view plain copy
>>> import sys  
>>> sys.getdefaultencoding()  
'utf-8'  
>>>   

重启salt服务(master端执行“systemctl restart salt-master”,minion端执行“systemctl restart -salt-minion”)。
再次执行发送中文名称文件:

[plain] view plain copy
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以上版本解决吧)

标签:SaltStack 发布于:2019-11-02 17:18:57