今回はインフラ寄りの話。
皆さんはLinux環境の設定と聞いてどんなイメージを持つだろうか。
CD-ROMからOSをインスト―ルして、必要なソフトを順番に導入し、設定ファイルを記述してサービスを起動して。。
なんてことを昔はポチポチと手動でやってたわけだが、何年か前からInfrastructure as Codeという概念が普及してきているので、今回改めてAnsibleというツールを学びなおしている(以前やったことはある)ところである。
要は作業をスクリプト化して自動化しようぜ!ということである。
動機としては、今自宅で動いているRaspberry Piの初期設定に結構苦労した覚えがあり、故障に備えるために全部Excelで設定手順を管理をしているのだが、この手順の高い可読性を保ったまま自動設定にも対応させようという目論見がある。
Ansible (アンシブル)
なんだ、そんなのbashスクリプトでやってたよと思うかもしれないけど、今回私が使ったAnsibleというツールは以下の特徴がある。
1) エージェントレスでリモート設定ができる
これは設定対象のマシンに特別な準備が不要で、SSH接続さえできれば処理できるという意味。
2) 冪等性(べきとうせい)を担保できる
これは同じ処理を1度実行した場合も、2度実行した場合も正しい状態に収束するということ。
たとえば従来だとApacheを2度インストールしようとすると、2度目は既にインストールされているというエラーが出るけど、冪等な処理だとインストールされていない場合にしか処理しないのでエラーにはならない。
これは手順を書くというよりも、どうなって欲しいかあるべき姿を宣言することでそこに収束するという考え。
3) 設定ファイルの可読性が高い
yamlという軽量マークアップ言語を使って記述する。
以下を見ていただいたら分かるが、プログラミング言語というよりただの階層化リストに近いイメージのでかなり人間に優しい。
Vagrant (ヴェイグラント)
Ansibleはターゲットノードと呼ばれる設定対象のマシンを、コントロールノードと呼ばれるマシンから操作するので学習には2台のマシンが必要になる。
コントロールノードは基本的にスクリプトを置いたりするので基本的に1台を使いまわすが、ターゲットノードはいろんなパターンの設定を試したいので、使い捨てで何台か作りたい。
そういうときに、ターゲットノードを作るたびにOSインストールするのは面倒くさくてやってられない。
そこで、VagrantというVirtualBoxを自動操作して仮想マシンを自動作成してくれるツールを使う。
Vagrantは開発環境のセットアップに使われることが多いけど、今回のような学習用途でもうってつけだと思う。
どのくらい楽になるか、以下に比較を書いてみた。
Vagrantが無いとき (Ubuntuの例)
- UbuntuのサイトにブラウザでアクセスしてCD-ROMイメージをダウンロード
- VirtualBoxで仮想マシンのメモリ・ハードディスクを指定して仮想マシンを作る
- イメージをVirtualBoxの仮想ディスクにセット
- VirtualBoxで仮想マシンを起動
- インストールウィザードに従ってパーティション設定
- つづけて各種設定をしながらインストールしていく
- 再起動して完了
Vagrantがあるとき (Ubuntuの例)
以下のコマンドを入れる
vagrant init hashicorp/bionic64 vagrant up vagrant ssh
以上。最低限この3行でもうUbuntuのシェルに入れる。驚異的なスピード。
まぁ開発現場では目的に応じて設定を作りこむらしいけど、それをするのは管理者であって、その設定を利用する人はinitしてupするだけという簡単さ。
今回のようにAnsible用に適当なターゲットマシンが欲しいだけで、Linuxディストリビューションにもこだわりが無いみたいなケースだとマジで上記だけで事足りてしまう。
VagrantとAnsibleの併用イメージ
私の場合、AnsibleのコントロールノードはVirtualBox上にCentOS 9 Streamを手動インストールして、ターゲットノードはVagrantで作成した。
ゲスト同士の通信について
設定ターゲットノードであるゲストUbuntuは前述のコマンドで起動した場合、ローカルホストの2222番ポートがゲストUbuntuの22番(SSH)に転送されているようだ。つまり自分のローカルPC宛てに2222番ポートでSSH接続すればvagrantで起動したUbuntuに繋がる。
無ければVagrantfileという設定ファイルで指定するのだが、「Vagrant SSH ポート転送」等と検索すると適切な記事が見つかるかと思う。
そしてコントロールノードであるゲストCentOSからホストであるローカルPCへの接続は10.0.2.2というIPアドレスでアクセスできる。(ネットワーク設定を特にいじっていない場合NATが指定されているのでこのIP固定でいけるらしい。)
つまり、CentOSから10.0.2.2のポート2222にvagrantユーザーを指定してSSH接続を試みようとすると、ホストのVirtualBoxがこの通信を待ち受けていて、Ubuntuの22番ポートに転送してくれる仕組み。
これによってCentOS上のAnsibleからUbuntuを自動的に設定する準備が整う。
参考書籍
注意) この本はLinuxの基礎知識を前提とするためLinux操作についてはあまり詳細な指示は書かれていない。前提知識が無いと序盤がけっこうキツイと思う。注意) この本は割と記述が古いので早々に行き詰る。公式サイトの英語情報と照らし合わせながらトラブルシュートできないとキツイ。終わりに
Vagrantで作った学習環境で色々と設定方法を覚えたらあとはラズパイ用の設定ファイルを作りこんで検証機に流し、うまくいったらyamlごとGitHubにでもいれておけば、仕様書 兼 スクリプトとしてInfrastructure as Codeの実現完了である。
並行してコンテナ技術であるDockerも学習しているので、そのあたりも機会と根気があればそのうち書いてみたいと思う。
なお、私の場合は技術のキャッチアップも目的に含んでいるので、本当にラズパイの設定ごときでこんな技術が必要かと言われると。。。
「インフラエンジニアへの憧れを多分に含んだロマン案件なので、真に受けないでくれ」というのが回答かな。