OCIでAnsible mountがエラーになるケース
直近、OCI(Oracle Cloud Infrastructure)を利用することがあり、その中でAnsibleのmountタスクがエラーになるケースがあったので紹介します。といっても仕事の中でのことだったのと、あれこれ細かな課題対応が続発するなかでのこと。エラー発生時のキャプチャや具体的なエラーメッセージの内容を示せません。
発生条件 ※1
- OCIのDB System(VM/BM)やComputeを利用している。
- mountモジュールで state=mounted を指定してマウントを行おうとしている。※2
※1 他にも条件があるはずです。Googleで検索をしても類似事象を見つけられなかたことからそう推測しています。ひとまず分かったのはここまでです。
※2 mountモジュールに state=mounted を指定していますので、モジュールは指定されたデバイスが指定されたマウントポイントにマウントされていることを確認し、されていなければマウントし、加えて /etc/fstab ファイルにそのマウントの定義情報を書き込んで再起動後もマウントが約束されるようにします。
発生事象
mountモジュールの処理がエラーとなりPlaybookの実行が中断されます。
エラーメッセージとしては /etc/fstab のパースに失敗した云々の内容が出力されます。
fatal: [(hostname)]: FALED! => {"changed": false, "msg": "Error mounting (mount point): mount: /etc/fstab: parse error: ignore entry at line (line number). \nmount: can't find (mount point) in /etc/fstab\n"}
/etc/fstab の内容を確認すると、本来「既存エントリーの次の行に、つまり改行を挟んで、新規エントリーを追加」しなくてはならないところが「既存エントリーの末尾にそのまま、つまり改行なしに、新規エントリーを追加」してしまっている状態。
なるほどこれではパースに失敗するだろうな、仮にこの状態で /etc/fstab に基づきマウントが実行されたら既存エントリーで定義されたマウントも一蓮托生でエラーになるだろうな、という状態です。
ちなみにこの不正な「新規エントリー」部分をvi等で削除したり、「既存エントリー」と「新規エントリー」の間に改行を挿入してやったりしてからPlaybookを再実行すると今度は正常に処理ができます。後者の改行挿入はともかく前者の「一旦消せば次は成功」という動作はちょっと不可思議です。
回避策
mountモジュールのまえにlineinfileモジュールで「先頭に改行文字を持つfstabエントリーを挿入」してしまいました。とても雑な対応ですがこれで後続のmountモジュールは動作するようになりました。
原因
不明。
なんとなくの推測としてはAnsibleのmountモジュールは /etc/fstab ファイルの末尾、既存の最後のエントリーの行末に、改行文字がもともと入っていることを前提にしているのではないか、ところが私が作業していた環境では(何らかの理由で)そうなっておらず、「既存エントリーの直後に、改行なしに、新規エントリーを挿入」ということになったのではないか、──と想像しています。
『Kotlinイン・アクション』を読んでKotlinへの興味が尽きた
- 作者:Dmitry Jemerov,Svetlana Isakova
- 出版社/メーカー: マイナビ出版
- 発売日: 2017/10/31
- メディア: 単行本(ソフトカバー)
最初に言っておきますが、『Kotlinイン・アクション』はいい本です。プログラミング言語Kotlinについて丁寧に紹介しており、言語仕様はもちろんJavaとの統合についてしっかりと説明をしてくれています。さらにこの言語が提供する機能が従来のJavaによる開発であれば苦痛であったことの多くを解消してくれるのも事実です。おまけにベンダーの方針などを念頭に置くならば、Androidアプリ開発でこの言語を選択するのは妥当なものでしょう。この点異論はありません。
ただ本書を読んでいくとKotlinという言語を学ぶモチベーションが萎えていきます。この本を読み進めることで、Kotlinの構文の中にはJavaよりも却ってコード量が増えるものがあったり、同じキーワードを使っていながら機能的に異なっており明らかに他の妥当なキーワードがあると思われるものがあったりと、せっかく新言語として構想されたのに設計が甘いと感じられるところが節々登場します。Kotlinにおけるthisの記載について、Javaと異なる構文を採用していながらJavaと同じかそれ以上に特殊で一貫性を欠いた面倒な構文になっていることに、大変残念な気持ちになりました。Kotlinにおけるキーワードinterfaceが実際の機能に即してみるなら本当はtraitであるべきという点にもがっかりさせられました。Javaにおけるinterfaceはその歴史的な変遷や言語拡張についてのポリシーのために「実際はtrait」になってしまったわけで、過去に準拠する/束縛される言語としての選択ですから、これはもう仕方ない。しかし言語的に新規に構想されたKotlinがこれと同じことをしていることには納得が行きません。
そしてKotlinの構文が「Javaに似ている」とは言っても大小の違いはおびただしくあり、それらの学習コストは消して少なくありません。Kotlinで書かれたコードとJavaで書かれたコードがお互いにアクセスするとき注意しなくてはならないことも多々あるはずです。だからといって「このままJavaでいこう」などと言うつもりもなく、ただ学習コストの発生を前提にしてより生産的なコーディングを目指すならKotlinを学ぶよりはScalaなどを学ぶほうが得るところは大きそう、ということです。
『テルアビブ・オン・ファイア』は面白い
パレスチナの人気テレビドラマ『テルアビブ・オン・ファイア』の脚本制作に関わることになった青年が主人公の映画。主人公やその周囲の人びと、検問所で関わり合いになるイスラエル軍人も含め、登場人物のそれぞれがそれぞれの仕方で、半世紀も続く終わりなき対立にうんざりし諦めを感じている。そうした中で劇中の人間模様と劇中劇の人間模様がオーバーラップしながら進行する。ドラマのクライマックスと現実世界を生きる自分たちの未来はどうあってほしいのか。生か死かの闘争も非現実的なロマンスも、どちらにしろ自分たちが望むものではない。次々現れる障碍を乗り越えながら最終的に主人公はどのような「脚本」を書くのか──という感じのお話。分断された私たちの生活世界を再統合し、対等な関係を気づくにはどうしたらよいのだろう。困難ではあってもそれを考えていこうじゃないか。そういうメッセージを強く感じた。