はじめに
みなさま、夏休みももう終わりに近づいていますね。楽しめましたでしょうか?世間的な夏休みはもう終わってますし、東工大の夏休みは遅いがちなので他の大学だともうそろそろ授業が始まったりしてるんですかね。ちなみに東工大は10/2まで夏休みです。
閑話休題、はじめましての方ははじめまして、@cp20 です。ちなみにこの記事は夏のブログリレー 2024の31日目の記事です。実は4日目にも投稿しているので良ければそっちも見て行ってください。
Ansibleって何?美味しいの?
この記事を読んでくれている方がどれぐらいAnsibleに詳しいか分からないんですが、とりあえず↓ぐらいの感覚の人を想定読者として書いていきます。
- CLIは触ったことがある (謎の黒い画面)
- プログラミングをしたことはある
- Ansibleという単語を聞いたことすらない
- 「(プログラミング文脈における) インフラってよくわかんないけど難しそう」と思っている
Ansibleが何かについて話す前にインフラの話をちょっとしようと思います。大きい会社ならインフラエンジニアというのは必ずと言っていいほど居ると思いますが、その人たちは普段何をしているのでしょうか。アプリ開発エンジニアの目的はアプリを開発することです、そのままですね。ではインフラエンジニアの目的は何でしょうか?答えはアプリを動かせるような環境 (インフラ) を整えて、かつそれが不具合なく動作するようにすることです。そのために様々な道具を駆使して頑張っています。
Ansibleはインフラエンジニアが使う道具の1つです。Ansibleは「サーバー構成管理ツール」と説明されることが多い気がしますが、サーバー構成管理とはなんぞや?となると思うので、もっと詳しく説明していきます。
Ansibleは自動化ツール
仮にあなたがインフラエンジニアだとします。データベース (データベースが何か分からなくてもOKです) をサーバー100台にインストールする作業を任された状況を考えてみてください。サーバーというのはざっくり言えばお手元のPCだと思ってください。1つひとつ手作業でインストールすることももちろんできますが、対象は100台です。100回も同じ作業をやりたいでしょうか?やりたくないですね。なのでこれを自動化しましょうという話になります。楽をするために努力するのがハッカーなのです。
例えばデータベースをインストールするためには次のコマンドを実行すれば良いとします。
sudo apt install postgresql
これをAnsible風に表現するとこんな感じになります。
- name: Install PostgreSQL
apt:
name: postgresql
state: present
name
のところは分かりやすさのために書いてるだけなので、本質部分は少ないです。
実際はデータベースの設定もする必要があるでしょう。設定ファイル /etc/postgresql/16/main/postgresql.conf
に適当な設定を書く必要があるとします。手作業では毎回コピペして反映させる必要があるかもしれませんが、Ansible風に書けば次のようになります。
- name: Setup the config
copy:
src: postgresql.conf
dest: /etc/postgresql/16/main/postgresql.conf
さらにセキュリティの観点からデータベースのrootユーザー (何でもできる最強のユーザー) のパスワードを設定する必要もあると思います。これはデータベースのコマンドを実行する必要があるので、次のようなコマンドを実行すれば良いでしょう。
sudo -u postgres psql -c "ALTER USER postgres with encrypted password 'ここにパスワードを入れる';"
Ansible風にすればこんな感じです。
- name: Set root password
shell: sudo -u postgres psql -c "ALTER USER postgres with encrypted password '$password';"
environment:
password: 'ここにパスワードを入れる'
もうほぼそのままですね。ここまでのAnsibleの動作を合わせることで、データベースをインストールするという一連の作業を記述することができました。これらをまとめてロール (role) と呼びます。ロールにはここまで書いてきた内容だけでなく、例えばデータベースの設定ファイルなども含みます。
あとはどのサーバーに対して何のロールを実行するかを書けば、無事Ansibleの構成が記述できました!🎉🎉 これであなたもAnsibleマスター!
でもそれってシェルスクリプトでいいじゃん
と思いましたか?勘のいいガキは...というのは冗談で、ちゃんとシェルスクリプトより優れたポイントがあります。ちなみにシェルスクリプトが何か分からない人は、複数のコマンドを1度に実行できるようにしたツールだと思っておくと良いでしょう。(若干の嘘説明)
最初にAnsibleは構成管理ツールであるという説明をしました。ここで言う構成とは、サーバーがどういう状態であるか、もっと具体的に言えばデータベースがインストールしてあって、この設定で、バージョンはいくつで、、、みたいな状態のことです。しかしAnsibleは「こうあるべき」という状態を記述するのではなく、「こういう動作をしてください」という理想状態への道筋を記述していきます。なのでシェルスクリプトに似ているんですね。
しかしAnsibleで重要になってくる概念は冪等性 (idempotency) です。ちょっといかつい単語ですが、性質自体は非常に簡単です。1回やっても100回やっても何回やっても結果が変わらない性質、のことです。プログラミングの関数で考えてみましょう。JavaScriptの例で考えますが、別にプログラム自体は重要ではないので分からない人は雰囲気で読んでください。
もっとも簡単な関数は (x) => x
のようなただ引数を返すだけの関数ですね。当たり前ですがこれは10回やっても100回やっても値は変わりません。
もう少し進んだ例を見てみましょう。次のような関数を考えてみます。
let x = 0;
const x10 = () => x = 10;
これは x
に10を代入するだけの関数です。0回と1回では値が違うかもしれませんが、1回やっても何回やっても x
は10のまま変わらないので冪等であると言えます。
Ansibleに話を戻して冪等性について考えていきます。例えばデータベースをインストールするという動作は冪等ですね。データベースは何回インストールしても同じなので。Ansibleは冪等な操作を積み重ねていくことで最終的な理想状態を記述します。
ちょっとわかりづらいと思うので図にして考えてみましょう。
箱が積み重ねられていますが、それぞれが操作に対応していて、かつ全ての操作は冪等であるとします。最初左のような状態だとして、新しく「他の設定1」を加えた右のような状態に移行したいとします。この際も最初から操作をやり直せばいいだけです。なぜなら全ての操作は冪等なので。
じゃあ全ての操作を冪等にしたシェルスクリプトを書けばいいじゃんとお思いの方、正解です。じゃあAnsibleは何が嬉しいの?と言われたら、冪等な操作が簡単に書けるようになっているところと、ロール単位で分離されているので書きやすいことですかね。
and more...
ここではふわっとした概要の説明だけをしたんですが、もっと実践的な内容は本なりブログなりを読んでみるか、あるいは実際の例を見てみると良いと思います。あんまりキレイではないですが、ボクの自宅サーバーを構成管理しているAnsibleのリポジトリを置いておきます。
おわりに
Ansibleって何も難しくないですよね?皆さんも書きましょう、というか書いてくださいお願いします。SysAd班のインフラを支える人材が足りてません、助けてください。