【Ansible】win_shellモジュールで実行したコマンドの文字化けを修正する

この記事は、「Red Hat Advent Calendar 2023」20日目の記事です。

Windowsの文字化け問題

AnsibleでWindowsノードを管理していると、特にwin_shellモジュールでコマンドを実行した際などの実行結果が時折文字化けしてしまうケースがあります。こうなってしまうと、実行結果が正しく読み取れず、Windows自動化の障壁となってしまいます。

なぜ文字化けが発生するのか

Ansibleでは、WinRM経由でWindowsに接続しますが、その際の新規セッションに対してはUTF-8を利用するよう指定して接続します。これは、通常のWindowsモジュールの実行であれば問題は発生しません。

https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/connection/winrm.py#L474-L477

                # open the shell from connect so we know we're able to talk to the server
                if not self.shell_id:
                    self.shell_id = protocol.open_shell(codepage=65001)  # UTF-8
                    display.vvvvv('WINRM OPEN SHELL: %s' % self.shell_id, host=self._winrm_host)

しかし、Shift_JISのような別の文字エンコーディングをデフォルトで利用しており、win_shellやwin_commandのようなPowerShell上でコマンドを実行するモジュールを利用する場合、実行されるコマンドはデフォルトの文字エンコーディングを利用するため、実行結果はShift_JISで返却されます。そのため、Ansibleに渡される実行結果はUTF-8でなくなり、文字化けが発生します。

対処方法

上記のような想定していない文字化けに対処するため、win_shellモジュールなどでは「output_encoding_override」オプションが利用できます。

ansible.windows.win_shell module – Execute shell commands on target hosts — Ansible Documentation

このオプションでは、返却された実行結果を指定した文字エンコーディングで上書きして解釈します。基本的に、Windows上で [System.Text.Encoding]::GetEncodings() を実行した際に返却される「Name」の文字エンコーディング(Shift_JISであればshift_jis)を指定できます。

PS C:\Users\hiyoko> [System.Text.Encoding]::GetEncodings()

CodePage Name                    DisplayName
-------- ----                    -----------
      37 IBM037                  IBM EBCDIC (US - カナダ)
     437 IBM437                  OEM アメリカ合衆国
     500 IBM500                  IBM EBCDIC (インターナショナル)
     708 ASMO-708                アラビア語 (ASMO 708)
     720 DOS-720                 アラビア語 (DOS)
     737 ibm737                  ギリシャ語 (DOS)
     775 ibm775                  バルト言語 (DOS)
     850 ibm850                  西ヨーロッパ言語 (DOS)
     852 ibm852                  中央ヨーロッパ言語 (DOS)
     855 IBM855                  OEM キリル
     857 ibm857                  トルコ語 (DOS)
     858 IBM00858                OEM マルチリンガル ラテン I
     860 IBM860                  ポルトガル語  (DOS)
     861 ibm861                  アイスランド語 (DOS)
     862 DOS-862                 ヘブライ語 (DOS)
     863 IBM863                  フランス語 (カナダ) (DOS)
     864 IBM864                  アラビア語 (864)
     865 IBM865                  北欧 (DOS)
     866 cp866                   キリル言語 (DOS)
     869 ibm869                  ギリシャ語, Modern (DOS)
     870 IBM870                  IBM EBCDIC (多国語ラテン 2)
     874 windows-874             タイ語 (Windows)
     875 cp875                   IBM EBCDIC (ギリシャ語 Modern)
     932 shift_jis               日本語 (シフト JIS)
     936 gb2312                  簡体字中国語 (GB2312)
     949 ks_c_5601-1987          韓国語
     950 big5                    繁体字中国語 (Big5)
    1026 IBM1026                 IBM EBCDIC (トルコ語ラテン 5)
    1047 IBM01047                IBM ラテン-1
    1140 IBM01140                IBM EBCDIC (US - カナダ - ヨーロッパ)
    1141 IBM01141                IBM EBCDIC (ドイツ - ヨーロッパ)
    1142 IBM01142                IBM EBCDIC (デンマーク - ノルウェー - ヨーロッパ)
    1143 IBM01143                IBM EBCDIC (フィンランド - スウェーデン - ヨーロッパ)
    1144 IBM01144                IBM EBCDIC (イタリア - ヨーロッパ)
    1145 IBM01145                IBM EBCDIC (スペイン - ヨーロッパ)
    1146 IBM01146                IBM EBCDIC (UK - ヨーロッパ)
    1147 IBM01147                IBM EBCDIC (フランス - ヨーロッパ)
    1148 IBM01148                IBM EBCDIC (インターナショナル - ヨーロッパ)
    1149 IBM01149                IBM EBCDIC (アイスランド語 - ヨーロッパ)
    1200 utf-16                  Unicode
    1201 utf-16BE                Unicode (Big-Endian)
    1250 windows-1250            中央ヨーロッパ言語 (Windows)
    1251 windows-1251            キリル言語 (Windows)
    1252 Windows-1252            西ヨーロッパ言語 (Windows)
    1253 windows-1253            ギリシャ語 (Windows)
    1254 windows-1254            トルコ語 (Windows)
    1255 windows-1255            ヘブライ語 (Windows)
    1256 windows-1256            アラビア語 (Windows)
    1257 windows-1257            バルト言語 (Windows)
    1258 windows-1258            ベトナム語 (Windows)
    1361 Johab                   韓国語 (Johab)
   10000 macintosh               西ヨーロッパ言語 (Mac)
   10001 x-mac-japanese          日本語 (Mac)
   10002 x-mac-chinesetrad       繁体字中国語 (Mac)
   10003 x-mac-korean            韓国語 (Mac)
   10004 x-mac-arabic            アラビア語 (Mac)
   10005 x-mac-hebrew            ヘブライ語 (Mac)
   10006 x-mac-greek             ギリシャ語 (Mac)
   10007 x-mac-cyrillic          キリル言語 (Mac)
   10008 x-mac-chinesesimp       簡体字中国語 (Mac)
   10010 x-mac-romanian          ルーマニア語 (Mac)
   10017 x-mac-ukrainian         ウクライナ語 (Mac)
   10021 x-mac-thai              タイ語 (Mac)
   10029 x-mac-ce                中央ヨーロッパ言語 (Mac)
   10079 x-mac-icelandic         アイスランド語 (Mac)
   10081 x-mac-turkish           トルコ語 (Mac)
   10082 x-mac-croatian          クロアチア語 (Mac)
   12000 utf-32                  Unicode (UTF-32)
   12001 utf-32BE                Unicode (UTF-32 ビッグ エンディアン)
   20000 x-Chinese-CNS           繁体字中国語 (CNS)
   20001 x-cp20001               TCA 台湾
   20002 x-Chinese-Eten          繁体字中国語 (Eten)
   20003 x-cp20003               IBM5550 台湾
   20004 x-cp20004               TeleText 台湾
   20005 x-cp20005               Wang 台湾
   20105 x-IA5                   西ヨーロッパ言語 (IA5)
   20106 x-IA5-German            ドイツ語 (IA5)
   20107 x-IA5-Swedish           スウェーデン語 (IA5)
   20108 x-IA5-Norwegian         ノルウェー語 (IA5)
   20127 us-ascii                US-ASCII
   20261 x-cp20261               T.61
   20269 x-cp20269               ISO-6937
   20273 IBM273                  IBM EBCDIC (ドイツ)
   20277 IBM277                  IBM EBCDIC (デンマーク - ノルウェー)
   20278 IBM278                  IBM EBCDIC (フィンランド - スウェーデン)
   20280 IBM280                  IBM EBCDIC (イタリア)
   20284 IBM284                  IBM EBCDIC (スペイン)
   20285 IBM285                  IBM EBCDIC (UK)
   20290 IBM290                  IBM EBCDIC (日本語カタカナ)
   20297 IBM297                  IBM EBCDIC (フランス)
   20420 IBM420                  IBM EBCDIC (アラビア語)
   20423 IBM423                  IBM EBCDIC (ギリシャ語)
   20424 IBM424                  IBM EBCDIC (ヘブライ語)
   20833 x-EBCDIC-KoreanExtended IBM EBCDIC (韓国語 Extended)
   20838 IBM-Thai                IBM EBCDIC (タイ語)
   20866 koi8-r                  キリル言語 (KOI8-R)
   20871 IBM871                  IBM EBCDIC (アイスランド語)
   20880 IBM880                  IBM EBCDIC (キリル言語 - ロシア語)
   20905 IBM905                  IBM EBCDIC (トルコ語)
   20924 IBM00924                IBM ラテン-1
   20932 EUC-JP                  日本語 (JIS 0208-1990 および 0212-1990)
   20936 x-cp20936               簡体字中国語 (GB2312-80)
   20949 x-cp20949               韓国語 Wansung
   21025 cp1025                  IBM EBCDIC (キリル言語 セルビア - ブルガリア)
   21866 koi8-u                  キリル言語 (KOI8-U)
   28591 iso-8859-1              西ヨーロッパ言語 (ISO)
   28592 iso-8859-2              中央ヨーロッパ言語 (ISO)
   28593 iso-8859-3              ラテン 3 (ISO)
   28594 iso-8859-4              バルト言語 (ISO)
   28595 iso-8859-5              キリル言語 (ISO)
   28596 iso-8859-6              アラビア語 (ISO)
   28597 iso-8859-7              ギリシャ語 (ISO)
   28598 iso-8859-8              ヘブライ語 (ISO-Visual)
   28599 iso-8859-9              トルコ語 (ISO)
   28603 iso-8859-13             エストニア語 (ISO)
   28605 iso-8859-15             ラテン 9 (ISO)
   29001 x-Europa                ヨーロッパ
   38598 iso-8859-8-i            ヘブライ語 (ISO-Logical)
   50220 iso-2022-jp             日本語 (JIS)
   50221 csISO2022JP             日本語 (JIS 1 バイト カタカナ可)
   50222 iso-2022-jp             日本語 (JIS 1 バイト カタカナ可 - SO/SI)
   50225 iso-2022-kr             韓国語 (ISO)
   50227 x-cp50227               簡体字中国語 (ISO-2022)
   51932 euc-jp                  日本語 (EUC)
   51936 EUC-CN                  簡体字中国語 (EUC)
   51949 euc-kr                  韓国語 (EUC)
   52936 hz-gb-2312              簡体字中国語 (HZ)
   54936 GB18030                 簡体字中国語 (GB18030)
   57002 x-iscii-de              ISCII デバナガリ文字
   57003 x-iscii-be              ISCII ベンガル語
   57004 x-iscii-ta              ISCII タミール語
   57005 x-iscii-te              ISCII テルグ語
   57006 x-iscii-as              ISCII アッサム語
   57007 x-iscii-or              ISCII オリヤー語
   57008 x-iscii-ka              ISCII カナラ語
   57009 x-iscii-ma              ISCII マラヤラム語
   57010 x-iscii-gu              ISCII グジャラート語
   57011 x-iscii-pa              ISCII パンジャブ語
   65000 utf-7                   Unicode (UTF-7)
   65001 utf-8                   Unicode (UTF-8)

もし実行結果が文字化けしてしまって困っている時には、上記オプションを試してみてください。

Happy Automation!

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。