服務配置文件gb2312編碼,使用SaltStack管理報錯

    Salt發佈2014.7.0後,及時進行了更新,測試下來,在上一版本正常運行的操作,這一版本卻出現報錯。公司的好多服務由於歷史原因,配置文件延續下來,使用的是gb2312編碼,其中還有中文註釋。在使用salt進行管理的時候,在Master端會報UnicodeDecodeError錯誤。

    執行配置文件更新,並重啓服務操作:

salt 'zhaogb-202' state.sls update_conf.manager

    manager.sls是更新Manager服務配置文件的模板:

ma_watch: 
  service: 
    - name: ManagerServerd
    - running
    - reload: True
    - watch:
      - file: /home/ManagerServer/config.xml
/home/ManagerServer/config.xml:
  file.managed:
    - source: salt://dzh_store/conf_file/ManagerServer/config.xml
    - user: root
    - group: root
    - mode: 644
    - backup: minion

執行該更新操作後,會報如下錯誤:

[ERROR   ] An un-handled exception was caught by salt's global exception handler:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xca in position 18: invalid continuation byte
Traceback (most recent call last):
  File "/usr/bin/salt", line 10, in <module>
    salt_main()
  File "/usr/lib/python2.6/site-packages/salt/scripts.py", line 240, in salt_main
    client.run()
  File "/usr/lib/python2.6/site-packages/salt/cli/__init__.py", line 189, in run
    self._output_ret(ret_, out)
  File "/usr/lib/python2.6/site-packages/salt/cli/__init__.py", line 243, in _output_ret
    salt.output.display_output(ret, out, self.config)
  File "/usr/lib/python2.6/site-packages/salt/output/__init__.py", line 44, in display_output
    display_data = get_printout(out, opts)(data).rstrip()
  File "/usr/lib/python2.6/site-packages/salt/output/highstate.py", line 74, in output
    return _format_host(host, hostdata)[0]
  File "/usr/lib/python2.6/site-packages/salt/output/highstate.py", line 118, in _format_host
    schanged, ctext = _format_changes(ret['changes'])
  File "/usr/lib/python2.6/site-packages/salt/output/highstate.py", line 340, in _format_changes
    __opts__)
  File "/usr/lib/python2.6/site-packages/salt/output/__init__.py", line 121, in out_format
    return get_printout(out, opts)(data).rstrip()
  File "/usr/lib/python2.6/site-packages/salt/output/nested.py", line 124, in output
    return nest.display(ret, __opts__.get('nested_indent', 0), '', '')
  File "/usr/lib/python2.6/site-packages/salt/output/nested.py", line 115, in display
    out = self.display(val, indent + 4, '', out)
  File "/usr/lib/python2.6/site-packages/salt/output/nested.py", line 90, in display
    prefix=prefix)
  File "/usr/lib/python2.6/site-packages/salt/output/nested.py", line 59, in ustring
    indent, color, prefix, msg.decode(encoding), endc, suffix)
  File "/usr/lib64/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xca in position 18: invalid continuation byte
Traceback (most recent call last):
  File "/usr/bin/salt", line 10, in <module>
    salt_main()
  File "/usr/lib/python2.6/site-packages/salt/scripts.py", line 240, in salt_main
    client.run()
  File "/usr/lib/python2.6/site-packages/salt/cli/__init__.py", line 189, in run
    self._output_ret(ret_, out)
  File "/usr/lib/python2.6/site-packages/salt/cli/__init__.py", line 243, in _output_ret
    salt.output.display_output(ret, out, self.config)
  File "/usr/lib/python2.6/site-packages/salt/output/__init__.py", line 44, in display_output
    display_data = get_printout(out, opts)(data).rstrip()
  File "/usr/lib/python2.6/site-packages/salt/output/highstate.py", line 74, in output
    return _format_host(host, hostdata)[0]
  File "/usr/lib/python2.6/site-packages/salt/output/highstate.py", line 118, in _format_host
    schanged, ctext = _format_changes(ret['changes'])
  File "/usr/lib/python2.6/site-packages/salt/output/highstate.py", line 340, in _format_changes
    __opts__)
  File "/usr/lib/python2.6/site-packages/salt/output/__init__.py", line 121, in out_format
    return get_printout(out, opts)(data).rstrip()
  File "/usr/lib/python2.6/site-packages/salt/output/nested.py", line 124, in output
    return nest.display(ret, __opts__.get('nested_indent', 0), '', '')
  File "/usr/lib/python2.6/site-packages/salt/output/nested.py", line 115, in display
    out = self.display(val, indent + 4, '', out)
  File "/usr/lib/python2.6/site-packages/salt/output/nested.py", line 90, in display
    prefix=prefix)
  File "/usr/lib/python2.6/site-packages/salt/output/nested.py", line 59, in ustring
    indent, color, prefix, msg.decode(encoding), endc, suffix)
  File "/usr/lib64/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xca in position 18: invalid continuation byte

    執行返回報錯,但是Minion端配置文件已經更新,並且服務重啓載入新的配置文件。也就是說,這個報錯產生在Master端,對Minion沒有影響。所有操作都在上一個版本(2014.1.0)驗證過,沒有任何問題。排查下來,找到

/usr/lib/python2.6/site-packages/salt/output/nested.py

這個文件,與上一個版本相比,增加了一個ustring方法,其中定義了一個帶默認值encoding='utf-8'參數,問題就出現在這裏。

2014.7.0 nested.py

wKioL1SdJwLQjhcFAAIa31scCRk348.jpg

由於我的配置文件採用gb2312編碼,所以在對msg進行decode操作時使用utf-8會報錯,再增加一個try,except調試來解決這個問題,修改後的代碼如下:

wKiom1SdKOGCM4KcAAKiDo4CeQQ397.jpg

也就是修改了except,再做一次判斷。

至此,這個問題暫時解決了,無論是utf-8配置文件,還是gb2312配置文件,都通過,不確定是否會影響Salt本身的功能。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章