エンジニアレポート

Ansibleを導入する:前編

2020年03月17日

こんにちは。データスタジアムの菅です。
新型コロナウィルスの影響で、国内のスポーツイベントは軒並み開催を自粛。1日も早くウィルスの脅威が去り、元の日常が帰って来ることを願ってやみません。

さて、気を取り直して、今回は表題にもある通り、Ansibleにチャレンジしてみました。

Ansibleとは?

いわゆる「構成管理ツール」と呼ばれるものの一つで、サーバやネットワーク機器などの構成管理を自動化するためのツールとして、昨今人気沸騰です。

よくあるこんなこと。

例えば、新規開発プロジェクトでLinuxサーバを用意する必要がでてきたとします。
最近なら、AWSでEC2を1台構築するということになるでしょうか。
弊社でもよくあります。

さて、ここでEC2(AmazonLinux2)を1台起動させたとして、直ぐに開発に移れるでしょうか?

(少なくとも)弊社の場合、答えは否。最低以下のような設定が必要になります。

  • OSパッケージのUpdate
  • SSH設定の変更
  • OS設定(時刻、言語等)
  • 必要パッケージ、ミドルウェアインストール

などなど・・・・

プロジェクトが立ち上がる度、開発用サーバを起動する度に、上記の作業を各プロジェクトの担当エンジニアがポチポチ作業している現実があります。(もったいねー。

自動化!自動化!

以前の記事にも書かせて頂きましたが、開発リソース、技術リソースが限られている弊社のような組織では、いかにそういったリソースを効率的に動かすかが問われます。

開発リソースは開発に集中させなければいけません。
ポチポチSSHの設定なんかさせている暇はないのです。

となれば、そういった処理は自動化させるのみです。
というわけで、Ansible事始めとして、SSHの設定変更や、OSの設定変更を実際に試してみました。

構成

今回、準備したのは以下の環境です。

Ansible構成

Ansibleはエージェントレスで動作するので、設定される側には特段必要な設定はありませんが(SSHでアクセスできることくらい?)、設定する方、つまりAnsibleが動作するための環境が必要になります。
今回は以下のスペックで用意してます。

  • Ansibleサーバ & 設定対象サーバ
    • AWS EC2
    • OS: Amazon Linux 2 AMI (HVM), SSD Volume Type
      • ami-0af1df87db7b650f4 (64 ビット x86)
    • Type: t2.micro

導入手順

Ansibleサーバの準備

まずはAnsibleの実行環境を用意します。
いろいろと方法はありますが、pipでインストールするのがお手軽なようです。
上記のAnsibleサーバにSSHでログインし、以下を実行します。

ec2-user $ sudo easy_install pip ec2-user $ sudo pip install ansible ec2-user $ ansible --version
ansible 2.9.6

ansibleのVersion表示を確認できれば、インストールは成功です。

inventoryの準備

次にinventoryのディレクトリとファイルを用意します。
inventory???となるかもしれませんが、気にしなくて大丈夫です。
後ほど解説します。

取り急ぎ、ec2-userのホームディレクトリ配下に以下のようにディレクトリとファイルを作ります。

ec2-user $ mkdir -p inventories/test/ ec2-user $ vi inventories/test/hosts

ファイルの中身を見て、何となくわかると思いますが、[client_node]のtestserverの部分が対象のサーバのIPですね。

[client_node:vars]にSSHログインするためのユーザーと秘密鍵のパスを記載します。
ということで、実際のこの秘密鍵を該当のパスに保存しておきましょう。
秘密鍵のパーミッションは0600に設定しておきます。

ec2-user $ ls -l /home/ec2-user/.ssh/testserver-key.pem -rw------- 1 ec2-user ec2-user 1675 Mar 5 07:25 /home/ec2-user/.ssh/testserver-key.pem
roleの準備

次にroleの準備です。
role???となるかもしれませんが、これも後ほど解説します。

例によって、以下のようにディレクトリとファイルを作っていきます。

ec2-user $ mkdir -p roles/testserver/tasks ec2-user $ vi roles/testserver/tasks/main.yml

上記で準備したのはタスクと呼ばれる、まさにAnsibleに実行させたい命令の肝になるところです。
ここでは、lineinfileという命令を使ってファイル内容の書き換えを行っています。
今回はsshdの設定を変更し、起動ポートを10022に変更しています。

最後のnotifyで上記のファイル書き換えが終わった後に、特定のhandlerと呼ばれる処理(今回はsshdの再起動)を呼び出しています。

次に、その呼び出されるhandlerも用意します。

ec2-user $ mkdir -p roles/testserver/handlers ec2-user $ vi roles/testserver/handlers/main.yml

もう見たまんま、sshdの再起動ですね。

site.ymlの準備

最後にマスターのplaybookとしてsite.ymlをホームディレクトリに用意します。
playbook???となるかも(ry

ec2-user $ vi ~/site.yml
実行!

さて、いよいよ準備完了したので実行です。

ec2-user $ sudo ansible-playbook -i inventories/test/hosts site.yml

コマンドを見ると何となくわかると思いますが、ansible-playbookコマンドで先ほど用意したマスターのplaybook(site.yml)を実行しています。
-iパラメータで、対象のインベントリを指定しています。

結果は・・・

ok=3 ということでエラー無く完了しました。
該当のサーバへのSSHアクセスは、22/tcpから10022/tcpに切り替わっています。

実際にサーバへログインしてsshd_configが書き換わっていることを確認してみます。

tasks/main.ymlの中で

backup: yes

と指定してるため、自動で変更前のbackupファイルを取得しています。
それが

/etc/ssh/sshd_config.4145.2020-03-06@05\:08\:01~

ですね。
綺麗にポートの設定が書き換わっているのが分かります。

これで、今回の導入は完了です。

後編はこちらから

Ansibleを導入する:後編【データスタジアム/エンジニアレポート】

エンジニア募集中

データスタジアムでは一緒に働いていただけるエンジニアを絶賛募集中です!

野球、サッカー、バスケをはじめとして色々なスポーツの仕事があります。

AWSやAzure、動画やAIなど技術的にもチャレンジできる職場です。

テクノロジーの力で、日本のスポーツを一緒に発展させていきましょう!

<募集中のポジション(2020年8月1日現在)>

開発エンジニア(速報サービス)

開発エンジニア(スポーツチーム向けサービス)

インフラエンジニア

最新記事

エンジニアトップ エンジニアインタビュー エンジニアレポート

  • 採用情報
  • おしらせ
  • 掲載事例

ページトップヘ