Ansibleを現役エンジニアが使用してみた感想(Dockerとの使い分けも解説!)

どうもこんにちはkoheiです。
昨日は東京で雪が降ったみたいですね。寒すぎて籠もってたので気づきませんでした(笑)
それでは本題、先日下記のツイートをしました。
構成管理ツールansibleってよく使われてるのかな?本屋で割といいとこに置置かれてた。
— こうへい@フリーランスエンジニア (@kohei72901660) October 23, 2019
構成管理ツールansibleってよく使われてるのかな?
本屋で割といいとこに置かれてた。
2年前ぐらいにdockerはじめて扱った時と比べると書籍が豊富になってることに気づいた。最近新しいプロジェクトに入ったけど、当たり前のように使われてる。技術進歩はとても早いなと実感。最近Ansibleをよく聞くから、dockerで最低限の環境構築して、Ansibleでソフトウェアの構成管理していく感じかな
— こうへい@フリーランスエンジニア (@kohei72901660) October 23, 2019
2年前ぐらいにdockerはじめて扱った時と比べると書籍が豊富になってることに気づいた。最近新しいプロジェクトに入ったけど、当たり前のように使われてる。技術進歩はとても早いなと実感。最近Ansibleをよく聞くから、dockerで最低限の環境構築して、Ansibleでソフトウェアの構成管理していく感じかな
最近仕事でAnsibleを使いました。
この時に初めてAnsibleについて知りましたが、上記のツイートのように、本屋の一番いいところ(面)に置いてあったので、
よく使われている、もしくはこれからよく使われるツールだと思います。
実際に私自身も使ってみて感じたことはAnsibleいいなと思いました。
なので、今回はAnsibleの概要と実際にプロジェクトで使ってみた感想について解説したいと思います。
Ansibleを使うことになったきっかけ
新規プロジェクトに参加した時にAnsibleを使ってインフラ構築をする機会がありました。
私はこの時初めてAnsibleについて知りました。
実際に使えるなと思ったので、これから解説したいと思います。
Ansibleってどんなもの?
エージェントレスの構成管理ツールです。
SSHで各サーバにアクセスして、設定した通りにサーバの構築が可能です。
よって、SSHでアクセス可能な環境でしたらAnsibleでインフラ構築が可能になります。
例えば、
・特定のディレクトリにファイルを置く
・必要なRPMパッケージをインストール
・自作のアプリをインストール
・RESTAPIを実行できる。
・etc.
のように、やれることは無限大です。※もちろんAnsible実行サーバでも色々設定できます。
Ansible自体や標準モジュールはPythonで書かれていて、多くのモジュールが存在するのでインフラ構築でやるべきことは大抵できるかと思います。
そして、下記で説明するAnsible実行に必要な設定ファイルはyml形式のファイルになります。
よって、読みやすいですし、書きやすいです。
Inventoryとは
「ホストファイル」とも呼ばれ、インフラ構築するノード(サーバ)の情報(IPアドレス等)を記述します。
また、管理対象ノードを整理し、グループを作成およびネストして、スケーリングを容易にすることもできる。
Playbookとは
タスク(※1)の順序付きリスト。記述した順序でタスクが実行されます。
また、Playbookには、タスクだけでなく変数も含めることができます。
(※1):タスクとはAnsibleのアクションの単位。
Roleとは
Playbookですべてのタスクについて書くことは可能ですが、ソースコードが肥大化してしまいます。
これを防ぐために、Roleは適度に分割するための機能になります。 (playbookは複数のRoleを読み込むことができる)
各Roleには、tasks, defaults, vars, files, templates, mata, handlersと言ったディレクトリを作成して、Roleの定義を記述します。
※必須ディレクトリはtasks
※tasks/main.yml が基本定義
Ansibleのなにがいいのか
Ansibleはまさに最近流行りのDevOpsで使われる技術だとおもいます。
つまり、
infrastructure as code
そう、インフラのコード化です。
インフラのコード化とは、プログラムのように全てコードとして記述して、デプロイすることでインフラを構築することです。
お気づきかと思いますが、まさにAnsibleはインフラを構築するツールなのです。
それのなにがいいかというと、
・インフラ構築の自動化
・インフラ構成の一元管理
が可能になることが最大のメリットになります。
インフラの自動化
同じインフラ環境を何個も作らなければ行けない場合、インフラ環境の構築には手動でしたらそれなりの時間がかかります。
また、個人の技術力によっても差が生じてしまいます。(人が作業するのでミスが生じます。)
一方、インフラの自動化が可能になることで、個人の技術力の差は関係なくなり、環境構築の時間に他の作業が可能になります。
工数の削減に繋がります。
インフラ構成の一元管理
手動構築の場合、インストールするパッケージのバージョンが変更になった場合などの管理が非常に難しいです。(手順変更、設計書変更等)
必ず、オペレーションのミスが生じます。
一方、インフラ構成の一元管理が可能になることで、バージョン管理はAnsibleのコードのみになるので管理が容易になります。
インフラ構築者はAnsibleを実行するのみになるので、作業内容に変更がでません。
Ansibleを実行する方法
以下のコマンドが用意されています。
ansible-playbook -i <inventoryファイルのパス> <playbookのパス>
オプション一覧
以下、オプション一覧になります。
root@:/# ansible-playbook -h usage: ansible-playbook [-h] [--version] [-v] [-k] [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT] [--ssh-common-args SSH_COMMON_ARGS] [--sftp-extra-args SFTP_EXTRA_ARGS] [--scp-extra-args SCP_EXTRA_ARGS] [--ssh-extra-args SSH_EXTRA_ARGS] [--force-handlers] [--flush-cache] [-b] [--become-method BECOME_METHOD] [--become-user BECOME_USER] [-K] [-t TAGS] [--skip-tags SKIP_TAGS] [-C] [--syntax-check] [-D] [-i INVENTORY] [--list-hosts] [-l SUBSET] [-e EXTRA_VARS] [--vault-id VAULT_IDS] [--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES] [-f FORKS] [-M MODULE_PATH] [--list-tasks] [--list-tags] [--step] [--start-at-task START_AT_TASK] playbook [playbook ...] (以下、長いので割愛)
dockerとなにが違うのか?
Ansibleを初めて知った時に、
「Dokerに似てるもの?」
と思いました。
私は3年ほど前からDockerに触れてます。
dockerについての記事!
【Docker】Dockerを使うことになった経緯
ということで、
実際にDockerも「インフラのコード化」するものになります。
では、何が違うのかと言うと
・Dockerはアプリケーションをデプロイするもの
・Ansibleは構成管理をするもの
だと私は思います。
なので、DockerとAnsibleを上手く組み合わせて使うことをおすすめします。
つまり、
・DockerでできることはDockerでやる
・Docker外の設定はAnsibleでやる
のがいいかと思います。
サーバ間のやり取りの設定だったり、OSの設定はAnsible、サーバ内のアプリケーションのデプロイはDocker
といった感じだと思います。
余談
本記事を書いてて思いましたが、私自身もDevOpsエンジニアといえるようになったのかなと思いました。
まだまだ、端くれですが(笑)
2,3年前まではただのJava専門の人だったのに、最近は色々やってて楽しいです。
人気記事①:Docker学習におすすめの本5選【初心者向け入門書~実践向けまで】
人気記事②:【最新】Ansible学習でおすすめの入門書3選
