(追記)軽率に gcc のバージョン上げたら Ansible が全く動かなくなって泣きそうになった話


初めにまとめ(TL;DR)

特に長くはないです

  • 必要が生じたのでサーバ側の gcc バージョンを上げた
  • 新しいバージョンの gcc で make したいソフトウェアがあったが、Ansible 経由でうまく動いてくれなかった
  • 雑に「常に新しいバージョン使う」よう設定したところ、Ansible の命令を一切受け付けなくなった
  • 古いほうに戻したら Ansible 動いたので、対策検討中
  • 結局 scl が sudo を妨害するバグだった

追記

devtoolset-9 であれば発生しない問題でした。

やったこと

とあるソフトウェアを make install したかったのだが、gcc バージョンが古いと駄目だったので gcc バージョンを上げた。
参考:https://thr3a.hatenablog.com/entry/20180308/1520506543

scl enable devtoolset-7 bash して、新しいほうの gcc バージョンを使えば make できることは検証用のサーバで手動実施したのでわかっていた。
手作業の 99.99% は悪なので、Ansible タスク化しようと、以下のようなタスクを書いた。

shell: 'scl enable devtoolset-7 bash; ./install

が、これを実行しても、一向に何も帰ってこない。
-vvv してみてもコマンドが実行された気配すら無く、無理矢理 /proc/[pid]/fd/ 配下を cat してみても何も出力されてない。

原因がよくわからないので、上記参考サイトにあるように、以下の profile を配置した。

$ cat /etc/profile.d/enabledevtoolset-7.sh
#!/bin/bash
source scl_source enable devtoolset-7

起こったこと

急に ansible が動かなくなった。

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
fatal: [devstorm-app]: FAILED! => {"ansible_facts": {}, "changed": false, "failed_modules": {"setup": {"failed": true, "module_stderr": "Shared connection to hoge.example.com closed.\r\n", "module_stdout": "/var/tmp/sclJc174F: line 8: -H: コマンドが見つかりません\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 127}}, "msg": "The following modules failed to execute: setup\n"}

上記は何度か見かけており、Python バージョンの違いによって発生することは知っていたが、Python バージョンなんか変えてないし、当然 interpriter を指定しても動くようにはならない。
そして、ググっても Python バージョンのことしか出てこない。
加えて厄介だったのが、このとき「もう gcc バージョン指定の shell はいらないから」とタスクも書き換えており、それが原因なのかと思いこんでタスクを戻したり色々試行錯誤してしまって原因特定に時間がかかってしまった。
さらに面倒なことにしてしまったのが、ちょうど業務も終了時間だったため「今日のところはシャットダウンして、明日起動したらワンチャン直ってるだろ」と楽観視して帰ってしまったことである。
なんでも再起動で直る思想はよくない。

原因特定に至った背景

いくらググっても Python バージョンの話しか出てこないので、ローカルとサーバの Python バージョン合わせるかーとか思ってバージョンを出したところ

$ python
Python 3.6.7 (default, Nov 16 2018, 12:28:24)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.10.44.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

・・・おや? GCC 4.2.1 とな?
そういえば gcc っていじったよな・・・と思い、上記の profile を削除したところ、無事 Ansible タスクが実行された。
やはり、何か起こった際には冷静に一つずつ状態をロールバックさせなければならないし、そのためにもロールバック可能な作業手順というのが必要。

今後必要なこと

とはいえ、gcc バージョン上げないと必要なソフトウェアがインストールできないので gcc バージョン上げて Ansible 動かせるようにする必要がある。
ローカルもサーバも gcc 上げた Python でやってみたら動きそうな気がするけど、そうすると今度は他のサーバで動かなくなりそうだから色々調べつつやってみる必要がある。
解決したら編集・追記します。