feature image

2024年9月18日 | ブログ記事

Ansibleは難しくない

はじめに

みなさま、夏休みももう終わりに近づいていますね。楽しめましたでしょうか?世間的な夏休みはもう終わってますし、東工大の夏休みは遅いがちなので他の大学だともうそろそろ授業が始まったりしてるんですかね。ちなみに東工大は10/2まで夏休みです。

閑話休題、はじめましての方ははじめまして、@cp20 です。ちなみにこの記事は夏のブログリレー 2024の31日目の記事です。実は4日目にも投稿しているので良ければそっちも見て行ってください。

Cコンパイラを作ろうとしてみた
はじめに みなさま、夏休みを満喫しておられるでしょうか。はじめましての方ははじめまして、@cp20 です。ちなみにこの記事は夏のブログリレー 2024の4日目の記事です。今年は去年にも増してたくさんのブログが書かれそうで楽しみにしています。 さて、この記事ではCコンパイラを自作した話をしていきます。結局バグが取れずに惜しくも完成 (完成の定義は後述) しなかったのですが、完成の3歩手前ぐらいまでは作れたので、その中で得られた経験などを書き連ねていこうと思います。 重要な追記 (2024/08/23): 実は完成していました (詳しくは後述します) ちなみに成果物は↓のリポジトリから見れますので良かったら覗いてみてください。 GitHub - cp-20/c-compilerContribute to cp-20/c-compiler development by creating an account on GitHub.GitHubcp-20 自作Cコンパイラについて コンパイラとは 世の中にはたくさんのプログラミング言語がありますが、その中でもコンパイル型言語と

Ansibleって何?美味しいの?

この記事を読んでくれている方がどれぐらい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のリポジトリを置いておきます。

GitHub - cp-20/asterion-ansible
Contribute to cp-20/asterion-ansible development by creating an account on GitHub.

おわりに

Ansibleって何も難しくないですよね?皆さんも書きましょう、というか書いてくださいお願いします。SysAd班のインフラを支える人材が足りてません、助けてください。


明日は @comavius@kitsne の記事が出る予定です!お楽しみに!

cp20 icon
この記事を書いた人
cp20

23B / icon: https://twitter.com/sora_douhu

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2024年9月20日
2024年 1-Monthonを開催しました!!
Synori icon Synori
2024年9月17日
1か月でゲームを作った #BlueLINE
Komichi icon Komichi
2024年8月21日
【最新版 / 入門】JUCEを使ってVSTプラグインを作ろう!!!!【WebView UI】
kashiwade icon kashiwade
2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2022年9月26日
競プロしかシラン人間が web アプリ QK Judge を作った話
tqk icon tqk
2022年9月16日
5日でゲームを作った #tararira
Komichi icon Komichi
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記