仕事で、急にアンシブルを扱うことになった!
アンシブルって何?
え、何から始めれば良い??
初心者なのに、お客さんや上司の指定で、Ansible(アンシブル)を使ってサーバーに必要ソフトをインストールすることになった、ということですね?笑
プログラミングの世界で最も重要視されるのは、やはり公式ドキュメントですが、いきなり見てもわけわからないと思いますので、この順序で理解していけば、とりあえず土俵に乗れるよ!というやり方を解説します。
個々の解説はちょくちょく外部リンクに頼っていますが、とりあえずこの記事に沿ってStep1〜Step4を進めていただければ、「全くの初心者から、Ansibleで目的のソフトをインストールするまで」いけるように書きました。おそらく、自力で辿るならこのルートが最短だと思います。
Step1.Ansible(アンシブル)についてざっと調べる
まずは「Ansible とは」とかでインターネット検索し、「そもそもAnsibleとは何か?」を押さえましょう。
例えば!
そもそもAnsibleとはオープンソースの構成管理ツールである。
だとか。
そもそも構成管理ツールとはソフトウェアや設定ファイルなどの構成を自動的に管理してくれるもの
だとか。
構成管理ツールとして他に有名どころとしては、
- Chef
- Puppet
があって、
- Vagrant(VirtualBoxなどの仮想化ソフトと一緒に用いる仮想環境構築ツール)
- Terraform(インフラ自動構築ツール)
- AWS CloudFormation(インフラ自動構築ツール)
といった、こういうサーバーごと構築してくれるものとは違うのかあ
だとか。
Ansibleの特徴(じゃあ他の構成管理ツールと何が違うの?)は
- エージェントレス。PythonとSSH接続さえ可能であれば、ターゲットノード(=対象端末)での作業は不要。
- 冪等性が保証されやすい。
- 設定ファイルがYAMLで使いやすい。
だとか。
Ansibleの構成要素として、
- インベントリファイル(=hostsファイル)
- playbook
- 各taskに記載するモジュール
を押さえればいいのか〜
だとか。
そんなあたりをざっと確認しておけば十分でしょう。
例えば、私はこのあたりを読みました。
ただし、超天才や既に他の構成管理ツールに対する造詣が深い方を除いて、Ansibleは「ググるだけで全貌がわかる」ようなものではありません。
したがって、このフェーズにそんなに時間をかけなくて良いでしょう。人にもよるかと思いますが30〜1時間くらいで3〜5記事読めば十分かと。(逆にそれ以上読んでも理解が深まらないのでコスパが悪い)
「ああ、こんな感じね」という「わかってきたぞ」感を得るためには、やはりハンズオンが有効でしょう。
ハンズオンって何?という方はこちらの記事の「ハンズオン」の項目を読んでみてください。
Step2.ハンズオン(環境構築〜roleの使い方まで)
ハンズオンをするのに良い記事を発見しました。
このQiitaの記事「Ansibleをはじめる人に。」に沿ってやるだけで、だいぶ雰囲気掴めましたよ。さっさとこれに取り組めば良かったと思います。
<オススメのハンズオン>
Ansibleをはじめる人に。
これで環境構築からroleの使い方まで基本をつかむことができます。
もっとお金と時間に余裕のある人、あるいはAnsibleについて聞けるような人が身近にいない方は、Udemyなど活用しても良いと思います。
Step3.予め検討すべき「考え方のポイント」
ハンズオンが終わったら、目の前に課題があるわけですから、もう目的のplaybookの作成に取り組んでよいでしょう。ただし、playbookを作成する前に、検討すべきことがあります。それを考えておかないとplaybookを作成できません。そんな「考え方のポイント」を紹介しておきたいと思います。これらの視点があれば、その後はググれば出てきます。
1.ディレクトリ構成(ベストプラクティス)
ハンズオンをやった方なら、「ansible-playbookコマンドをたたくことで、カレントディレクトリ内のファイル群を対象にAnsibleが実行される」ことはわかるかと思います。
したがって、カレントディレクトリ内のディレクトリ構成は非常に重要です。
「重要と言われても、どういった構成にすれば良いのか、ゼロから考えないといけないの?」
そんなわけありません。安心してください。ディレクトリ構成にもベストプラクティスがあります。
ただ、当然ですが、適用するサーバー数、使い分ける環境の数、プロジェクト数などによって複雑さが変わります。1つのサーバーに適用するだけなのに、複数プロジェクトを想定したベストプラクティスに倣ってディレクトリ構成を作ってしまうと、無駄なファイルやディレクトリがたくさん用意されてしまいます。「いつか使うかも、は使わない」原則にしたがい、最初は最小限のシンプルな構成で作成し、必要に応じて拡張していくのが良いでしょう。(追加するのは気持ち楽ですが、削除するのって勇気がいるので。うっかり重要なファイルが奥底に眠っているディレクトリを消してしまうリスクと戦わないといけません。)
上記ハンズオンの構成がかなりシンプルですが、その次はこのあたりですかね。
Ansibleのベストプラクティスなディレクトリ構成の雛形を一撃で作りたい
さらに複雑なものもありました。
Ansible ( 俺の中で ) 最強の Best Practices
私は今回ここまでは使いませんでした。
2.ホストをどこで指定するか?
inventory/hosts ファイル内で指定するのが通常です。変数も指定できます。
ただ、add_hostsやin group_namesを使用して、tasksの中で指定する方法もあります。
Ansible: 次playの接続先や接続方法を動的に設定するにはadd_hostモジュールが使用可能
AWSのサーバー情報を読み込んで、動的にhostsを取得したい場合などに便利です。
3.playbookには基本roleのみ
playbookに全ての処理を記述することも可能です。
しかし、通常はそうしません。具体的な処理はroleの中に書いていって、playbookにはrole名を指定するのが普通です。
Ansible Roles の使い方(Playbookの分割と再利用)
どんなroleを作成するか、検討しましょう。だいたいは、インストールしたいソフトウェア毎にroleを作成するケースが多いようです。
4.冪等性(べきとうせい)を確保する
冪等性を初めて聞いた方は、下記記事を参考にしてください。
要すると、冪等性とは現状がどうであれ「その状態になる」ことが保証されていることです。「Ansibleを実行してAをBに変更する」のではなく、「現状がAだろうがBだろうがCだろうがAnsibleを実行するとBになる」ことが保証されていることです。例えば、あるファイルをコピーするAnsibleがあったとして、それを実行する度にそのファイルがコピーされ、同じファイルがいくつも保存されてしまうようでは冪等性がありません。
そして、冪等性は、無条件で保証されるわけではありません。
Ansibleは冪等性を保証しやすい、というだけなので、モジュールの使い方によっては、冪等性が保証されない場合もあります。
例えば、shellモジュールは冪等性確保が困難なので、最後の手段と考える方が良いです。templateやblockinfilesが使えるようなら、そちらが使えないか検討しましょう。
モジュールの種類は、他にもたくさんあります。
ただ、モジュールを一通り網羅してからplaybookを作り始めるよりは、わからないのが出てきたら都度調べて行くほうが良いでしょう。
Step4.知識の補強&トライ&エラー
ここまで来たら、あとは随時調べて知識を補強しながら、トライ&エラーを重ねていけば良いでしょう。その中で、おそらく通ることになるであろう項目のみ紹介しておきます。
5.handlerを使おう
handlerは便利です。notifyとセットで使います。少なくとも、Apacheなどの「設定を変更したら再起動が必要」系のパッケージをインストールするなら必ず使うことになりますので、一度勉強しておきましょう。
はじめてのAnsible #3 notifyとhandler編
handlerだけ別roleにすることもできます。
6.templateを使おう
templateも便利です。Jinja2ファイルに記述することで、設定ファイルを動的に作成することができます。
7.DRYなコードにしよう
Ansibleでも、変数を定義できます。DRYなコードにするには必須ですよね。
他にも、
- set_facts
- vars
などを使えば変数を設定できます。
また、下記のようにトランザクションを設定することもできます。
トランザクションって何?という方はこちらもチェック
まとめ
上記には、当然解説されるような分岐(when)や繰り返し(loopやwith_itemsとitemなど)は解説していませんが、「おそらく出来る」とわかるであろうことは検索すれば出てくるので省略しました。
個別の知識について詳細知りたい方は、別途ググってみてください。ググるための核となるきっかけがあれば、あとは自学可能です。そのきっかけさえないと、立ち往生してしまいますからね・・・
ググり方については、下記記事を参照してみてください。
この記事で紹介した「核」が、初めてAnsibleを触る人の役に立てば嬉しいです!
最後まで読んでくださってありがとうございました。
コメント