インフラ構築DevOpsこんにちはもーすけです。私が趣味で開発しているシステムでは、Ansibleを使って、サーバ構築からアプリケーションのデプロイまで実行できるように管理しています。serverspecを使って、そのサーバに対するインフラテストも行っています。その運用にいくつか課題点がありました。その課題点についてと、課題点へ対策したことについて書きます。デプロイとテストをそれぞれ実行していたAnsibleでのデプロイとserverspecのテストはそれぞれ別のコマンドで実行していました。2つ実行することが面倒であり、面倒であるがゆえにserverspecの実行を怠ったりしていました。これではテストの効果があまり発揮できませんね。このシステムは開発環境はローカルPCのVagrant上に構築しており、手元でのプロビジョニングには、手動でのAnsible実行を必要としている状況でした。sudoパスワードをうまく管理できなかった上のような課題1について、真っ先に以下の様にコマンドを続けることを思いつきました。コマンドを打ったまま「放置」ができませんでした。※もちろん、sudoパスワードを要求しないようにユーザ設定をすればできますが、多くの場合ではセキュリティ上難しかったりすると思います。ssh接続は鍵認証、sudoには必ずパスワードを要求するようにしています。Ansibleもserverspecにもコマンド実行時にsudoパスワードを記述する方法があります。Ansibleでは、ansible.cfgにsudo_passwordを記述、あるいはコマンド実行時に--extra-argsでsudoパスワードを指定できます。serverspecでも環境変数でSUDO_PASSWORDが指定できます。おわかりの通り、コマンドの履歴にもパスワードが残ります。良い方法ではないと思っています。タスクの実行方法がバラバラデプロイはansibleコマンドで実行、テストはrakeで実行、他のタスクはシェルスクリプト。いったように、タスクによって実行方法が異なってしまう状況になっていました。運用的にとても不便でしたので、1つに統一したいと思っていました。アプリケーションの運用に必要なことはRakeタスクで実行する上で述べたような課題点をクリアするように、下記の要件を満たすように工夫をしました。デプロイ、テストが同じ形式で実行できるsudoパスワードをベタ書きすることなく実行できるsudoパスワードの入力を一回だけにする結論は、すべてRakeタスクで実行できるようにしました。タスク一覧を見ると以下の様な感じになりました。(※実行結果は例であり実際の内容とは少し異なる。sudoパスワードははじめに1回だけ聞くようにします。デプロイとテストを同時に実行します。endendまとめタスクによってその実行方法が異なることは運用上とても不便です。慣れている言語でタスクが整理されていることによって以下のような恩恵を受けれるようになります。テストの実行し忘れがなくなるドキュメントも残しやすくなる慣れている言語で整理されることによりメンテしやすくなる。チームメンバーへの運用方法の伝授も楽になる保守性を考えて、慣れている言語やアプリケーションのスタックに合わせてタスクを統一することを選択肢の一つに入れるといいかもしれません。関連する記事はこちらAnsible、実行速度高速化の実験。Shopを使ったマイクロサービス体験のハンズオン「捉」2019年振り返り「LeanとDevOpsの科学」を読んで。