ギルド開発
ギルド開発
2016.09.09
#2
LIGのインフラ白書

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

ヤスタカ

こんにちは。ヤスタカです。
nojiri_burger

前回の「【Ansible入門】サーバーの構成管理をコード化してみよう」は、Ansibleの基礎編。対象サーバーを登録するinventoryファイルと、inventoryファイルに登録したサーバー群に対して実行する処理を記載した「playbook」というものを作っていきました。

今回はこのモジュールを使って、サーバーにLAMP環境を構築します。その後、roleという概念を使ってタスクを別ファイルに切り出して、再利用しやすいようにしていきたいと思います。

前回までのおさらい

playbookの書き方をおさらいしておくと、

  1. hosts: allなど処理を実行するサーバー群をまず指定する
  2. sudo: yesで管理者権限で実行するよう設定する
  3. その後のtasks:モジュールの指定とモジュールごとのオプションを指定する

以上の手順で、サーバーに処理を実行させることができました。

Apacheのインストール

まずはwebserver群に対して、Apacheをインストールして起動するplaybookを書いてみます。

- hosts: webserver
  sudo: yes
  tasks:
    - name: apacheのインストール
      yum: name=httpd state=latest
    - name: apacheの起動設定
      service: name=httpd state=started enabled=yes

PHPのインストール

続いてphpをインストールしていきましょう。
tasks: の下に新たに追加する記述は以下の通りです。

- name: phpのインストール
      yum: name={{item}} state=latest
      with_items:
        - php 
        - php-devel
        - php-mbstring
        - php-mysql
      notify:
        - restart apache
  handlers: 
    - restart apache
      service: name=httpd state=restarted

with_items: を使うと、{{item}}の中にwith_itemsで指定した項目を次々に代入して処理を繰り返してくれます。
notify: と handlers: この2つのモジュールはnotifyで指定した名前(今回の場合はrestart apache)を変更がある度に実行してくれるようになります。restart apacheの処理内容についてはhandlersで指定します。

MySQLのインストール

続いてMySQLのインストールとDBの作成です。

- name: mysqlのインストール
      yum: name={{item}} state=latest
      with_items:
        - mysql-server
        - MySQL-python
    - name: mysqlの起動設定
      service: name=mysqld state=started enabled=yes
    - name: データベースの作成
      mysql_db: name=mydb state=present
    - name: データベースユーザーの設定
      mysql_user: name=dbuser password=dbpassword priv=mydb.*:ALL state=present

with_items: phpのインストールのときにもでてきましたね。{{item}}の中にwith_itemsで指定したリストを順番に代入して実行してくれます。
mysql_db: このモジュールでデータベースの作成をします。nameオプションでデータベース名を指定します。
mysql_user: データベースのユーザーとパスワードの設定ができます。

includeで他のplaybookを取り込んでみる

タスクをファイルに分割してそれを取り込むことで汎用性を高めることもできます。
例えばphpのインストールの部分を別ファイルにする場合は、install_php.ymlなどの名前でファイルを作り、そこに

- name: phpのインストール
      yum: name={{item}} state=latest
      with_items:
        - php 
        - php-devel
        - php-mbstring
        - php-mysql
      notify:
        - restart apache
  handlers: 
    - restart apache
      service: name=httpd state=restarted

上記部分をmain.ymlから切り取り、install_php.ymlにコピーします。
その後main.ymlの方で

include: tasks/install_php.yml

とtasks: の下の階層で読み込めば、install_php.ymlの内容を実行してくれます。

roleでtasksを分割してみる

roleは一連のtaskを共有する仕組みです。includeと違う点はincludeは必要な部分のみを別ファイルに書き出して共有するという機能に対して、roleはそれ単体で使用することを前提としており、他の人と共有がしやすくなっています。
またroleはansible-galaxyコマンドを使うと、世界中で投稿された他の人が作ったroleを利用することができます。
今回はこのansible-galaxyを使ってroleを利用してみます。

まずはどんなroleがあるのか見てみましょう。

ansible_galaxy
https://galaxy.ansible.com/

このサイトからbrowse rolesをクリックして、検索したいroleの名前を入れます。
今回はApacheの代わりにnginxに変更してみたいので、nginxと入れて検索します。
Download数が多いと安心できそうなので、sortでDownloadを選択してトップに出てきたやつを試してみましょう。
roleを選択すると、roleをインストールするコマンドが表示されるのでそれをコピペして実行しましょう。

$ ansible-galaxy install geerlingguy.nginx

そうすると/etc/ansible/roles/以下にインストールされます。
あとはroleを指定すれば使用できます。

roles: 
    -{role: nginx,
        nginx_http_params: { sendfile: "on",
                             access_log:
                                "var/log/nginx/access.log"},
                            nginx_sites: none }

いかがでしたか?

Ansibleを使えばいつでも同じ状態のサーバーをいくつでも設定することができ、メンテナンスもしやすくなります。導入の敷居も低いので、この機会にぜひAnsibleを利用してみてください。