LIGデザイナー採用
LIGデザイナー採用
2016.07.05
#1
LIGのインフラ白書

【Ansible入門】サーバーの構成管理をコード化してみよう

ヤスタカ

こんにちは。長野オフィスのバックエンドエンジニア、ヤスタカです。
最近長野での休日の過ごし方がわからなくなってきています。この時期ってなにしたら楽しいの? 山登り?

さて、みなさんはサーバーの環境構築をどのように行っていますか?

手順書を作って、ひとつひとつコマンドを間違えないようにコピペして実行……そんなやり方をしていませんか? それでも起きてしまうのが作業ミス。。

最近では「Infrastructure as a Code」なんて言葉もよく会話にのぼるようになってきました。

Infrastructure as a Codeとは
従来の手順書を元に手動で構築してきたサーバーの環境をコード化すること。これによりサーバー構築の自動化と管理が容易になる。

今回はAnsibleを使って、サーバーの構成管理をコード化してみたいと思います。

Ansibleで何ができるの?

ansiblehttps://www.ansible.com/

「Ansible」は、ChefやPuppetなどと並んで比較される構成管理ツールのひとつ。Infrastructure as a Codeを実践するための各種機能を提供してくれます。いわゆるConfigurationツールで、ミドルウェアレベルの設定をコード化できます。

他の構成管理ツールと比較したAnsibleの特徴

  • 特別なソフトのインストールが必要なく、エージェントレスで使える
  • 設定ファイルをYAML形式でシンプルに記述できる
  • インストールが容易でシンプルな構成のサーバー群を管理するのに向いている

Ansibleをサーバーへインストールする

それではAnsibleの使い方について見ていきましょう。

前提として、ホストサーバー×1台とwebサーバー×2台の3台構成とします。
ホストサーバー側にはAnsibleをインストールし、ホストサーバー側からwebサーバーを操作して自動で環境構築するようなイメージです。

サーバーイメージ図

ホストサーバー・webサーバーともに今回はLinuxを前提とします。
またホストサーバーからwebサーバーにはそれぞれsshでリモートログインできるよう、事前の設定が必要です。

まずはホスト側のサーバーにAnsibleをインストールします。

$ sudo -y yum install epel-release

epelをインストールして、Ansibleがインストールできるようにします。

sudo -y yum install ansible

そしてAnsibleのインストール。これだけでインストールが完了です。簡単でしょ?

sshログインの設定

sshでログインするには、sshの秘密鍵と公開鍵ファイルの作成などが必要です。
今回は新規に鍵を作成する方法を記載しておきます。

まず、ホストサーバーのhomeフォルダ直下に.sshというフォルダがあるので、そこにconfigというファイルを作ります。
そこにwebサーバーとなるサーバー2台のIPアドレスを記載します。このIPアドレスは環境に応じて異なるなるので、それぞれのサーバーのIPアドレスを確認して適宜設定してください。
今回は「Host webserver1 HostName 192.168.100.2」 「Host webserver2 HostName 192.168.100.3」と記載して保存します。
最後にconfigファイルのパーミッションを変更します。

$ chmod 600 .ssh/config

次に鍵認証を設定します。
鍵認証をするため、ホストサーバーで秘密鍵と公開鍵を作成し、公開鍵をwebサーバー側にコピーします。

$ ssh-keygen -t rsa

として、パスフレーズは何も入力せずにリターンを押します。

次に公開鍵をwebサーバー2台にコピーします。

$ ssh-copy-id webserver1
$ ssh-copy-id webserver2

コピーができたら、

$ ssh webserver1

でログインできれば設定完了です。

Inventoryファイルの作成

Ansibleのインストールが完了したら、次にinvetoryファイルを記述します。
Ansibleの設定ファイル群は、デフォルトで/etc/ansible以下に格納されています。その中にhostsというファイルがあると思うので、こちらを編集していきましょう。

このファイルをじーっと眺めているとなんとなく書き方がわかってくると思います。
下の例ではホストサーバーは「192.168.100.1」になります。

▼/etc/ansible/hosts

192.168.100.1

[webservers]
192.168.100.2
192.168.100.3

その後に[webservers]というグループに所属しているサーバーとして、「192.168.100.2」と「192.168.100.3」という2つのサーバーがあるという構成です。

こうやってグループを作っておくと、そのグループに所属しているサーバーに対して同一の設定をまとめて記述できるという利点があります。

Ansibleコマンドを使ってみる

それではここでAnsibleコマンドを使ってみましょう。
正しく通信できているか、pingというコマンドを全サーバーに対して実行してみたいと思います。

▼playbook.yml

$ ansible all -m ping
192.168.100.1 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.100.2 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.100.3 | success >> {
    "changed": false, 
    "ping": "pong"
}

上のようなレスポンスが返ってくればOKです。

$ ansible all -m ping

というコマンドは、「Ansibleという記述でAnsibleコマンドを使うよ」とまず宣言をして、その後のallは「全サーバーに対して、この後の命令を実行するよ」という意味です。
先ほどのInventoryファイルがここで役立ち、allのところをwebserversとすれば、Inventoryファイルでwebserversグループに設定したサーバーに対してのみ命令が実行されます。

最後の-m pingというコマンドは「Ansibleのpingモジュールを使って命令を実行する」という意味。
Ansibleは全てのコマンドをモジュールという形で実行します。Ansibleを操作する上ではこのモジュールを組み合わせて処理を書いていきます。

playbookの作成

先ほどは各サーバーに対して直接コマンドを打って処理を実行しましたが、それではInfrastructure as a Codeとは言えません。
このコマンドを「playbook」というYAML形式のファイルにまとめて、コード化していきましょう。そう、このplaybookこそAnsibleの肝とも言える重要なファイルなのです。

ではplaybookの記述方法について見ていきましょう。

- hosts: all
  sudo: yes
  tasks:
    - name: add user
      user: name=lig state=present

hosts:allとすることで全サーバーに対してその下に記述したタスクが実行されます。今回はuserモジュールを使って、サーバーに新たなユーザーを追加するタスクを記述しています。

sudo:yesというのは、「サーバーにログイン後に管理者権限で実行する」という意味です。

その下のtasks:という部分に、実際に実行するモジュール処理を記述します。
tasksの下の-nameでは、タスクの名前を決めます。必須ではないですが、付けておくと「なんの処理をするためのタスクなのか」がひと目でわかります。

使用するモジュールはuserで、userモジュールのオプションとしてnameとstateを指定しています。nameで指定するのは追加するユーザー名です。stateはユーザーを追加するか削除するかの選択です。
state=presentとすればユーザーの追加、state=absentとすればユーザーの削除ができます。ちなみにstateはデフォルトでpresentとなっているため、ユーザーを追加する場合は指定は不要です。

こうやってモジュールごとにオプションをしていき、処理を記述することでサーバーに対しての変更を加えていきます。

各モジュールのオプションして方法などは公式ドキュメントがあるので、そちらを確認するとよいでしょう。
Ansible モジュール一覧

まとめ

今回はplaybookの書き方の触りまでを解説しました。
次回はplaybookを使ってwebサーバーに対して、PHP・Apache・MySQLのインストールなどを行っていきたいと思います。

僕自身chefやpappetなどの構成管理ツールは今まで使ったことはないのですが、Ansibleの簡単・シンプルな構成によって特につまづくことなく導入できました。
これを機に、手順書を捨て、Ansibleに乗り換えてみてはいかがでしょうか?