[ansible]ansible执行结果中文乱码

问题

当前使用ansible管理的服务器,执行系统命令,执行脚本程序或程序输出,或使用sqlplus执行sql语句,部分服务器会出现乱码。

结论

经过排查发现,将ansible所在系统为UTF-8编码,且远程主机显示在标准输出的中文信息也是UTF-8编码,可以避免乱码。但当前我这边服务器,数据库,应用程序全都基于GBK编码,不可修改。思考后,采用以下方法解决问题。

解决方案

执行系统命令乱码

对于需要显示中文的命令,直接在要执行的命令中增加字符集设置。

ansible -m  shell -a 'export LC_ALL=zh_CN.UTF-8;date'  server

执行sql脚本出现乱码

在sqlplus中设置oracle字符集。以下是我编写一个playbook,将sql文件传到远程服务器上,获取对应服务数据库配置,执行sql文件。

---
- name: exec sql file on retmote system servers
  hosts: "{{ servers }}"
  tasks:
  - name: create tmp dir
    file: path=${HOME}/tmp/sql/ state=directory

  - name: copy sql file to remote server
    copy: src={{ sql_file }} dest=${HOME}/tmp/{{ sql_file }} backup=yes

  - name: get db user info from  envinfo and exec sql file
    shell: |
       source ${HOME}/.profile > /dev/null
       export NLS_LANG=AMERICAN_AMERICA.UTF8
       echo exit | ${ORACLE_HOME}/bin/sqlplus -s ${DB_USER}/${DB_PASSWD}@${DB_SERVNAME}  @${HOME}/tmp/{{ sql_file }} "set feedback off "
    register: sqloutput

  - name: display details of sql output
    debug: msg="{{ sqloutput.stdout_lines }}"
...

执行程序或脚本回显信息乱码

使用iconv命令将显示信息由gbk修改为utf-8。

ansible -m shell -a 'cat $HOME/tmp/coresys.log | iconv -f GBK -t UTF-8' server

你可能感兴趣的:([ansible]ansible执行结果中文乱码)