Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Ansible を初めて使ってLAMP環境を作成してみる

More than 1 year has passed since last update.

はじめに

Ansibleを使用してLAMP環境を作成していきます。
作成するサーバはユーザ登録がされている状態です。
詳細は、以下の記事に記載しています。
CentOS7 の初期設定をしてみよう

コードだけ見たい方はこちら

環境

CentOS7
ansible 2.4.2.0

Ansibleとは

システム構築、運用を自動化できるツールです。
Ansibleをインストールしているサーバから、SSH接続をして対象サーバを操作します。
何台でも同時に操作することが可能で、全く同じ設定を反映させることができます。

構成

Ansibleは主に次の3つのファイルで構成されています。

inventry

どのサーバを管理するかを設定する

ansible.conf

inventryファイルの場所を設定する

playbook

どのような構成にしたいのかを設定する。構築手順書のようなものです。
このファイルがAnsibleの肝となる部分になります。
(例:httpdをyumでインストールして、起動させる)

ホストサーバー(指示をだすサーバー)の設定

Ansibleのインストール

インストールする前に、epelというリポジトリが必要なため、
合わせてyumでインストールします。

# yum install epel-release.noarch
# yum install ansible
$ ansible --version
ansible 2.4.2.0

鍵認証でログイン設定

鍵を作製して、操作したいサーバに公開鍵を渡し、SSH接続できるようにします。

$ ssh-keygen -t rsa
$ ssh-copy-id -p ポート番号 ユーザ名@IPアドレス
$ ssh -p ポート番号 ユーザ名@IPアドレス

inventryを作成してみよう

ファイル名は何でもよいです。
[]に任意のグループ名を記載することで、操作するサーバをグループ分け出来ます。
$ vim inventory

[lamp]
IPアドレス:ポート番号

lampというグループを作成して、操作するサーバ情報を登録しています。

ansible.confを作成してみよう

作成したinventoryファイルを指定することで実行できますが、
ansible.cfgファイルにinventoryファイルのパスを記載することによって、
ファイルを指定しないで実行できるようになります。
vim ansible.cfg

ansible.cfg
[defaults]
inventory = ./inventory

さっそく実行してみよう!

lampグループに対して、pingコマンドを実行してみます。
(全てのサーバを対象にしたい場合は、「lamp」⇒「all」に変更します)

$ ansible lamp -m ping
IPアドレス | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Playbookを作成してみよう

Apache、MySQL、PHPをインストールする手順をPlaybookに記載していきます。

Apacheをインストールして起動し、自動起動の設定をしよう

yml形式で記載します。

vim playbook.yml

playbook.yml
---
- hosts: lamp
  sudo : yes
  tasks:
    - name: install httpd
      yum: name=httpd state=latest
    - name: apache start / enable
      service: name=httpd state=started enabled=yes

上から順番に説明していきます。
- hostsで操作したいサーバを指定します。今回は「lamp」グループが対象です。
sudoでsudu権限をつけています。
tasksに何をするのかを、記述していきます。
- nameは任意の名前です。何をしているのか、分かりやすい題名にします。
yumのnameでインストールするhttpdを指定し、state=latestで最新版を選択しています。
serviceのnameでhttpdを指定し、state=startedで起動しています。また、enabled=yesで自動起動の設定をしています。

MySQLをインストールして起動し、自動起動の設定をしよう

先ほど作成したファイルに続けて記載していきます。

playbook.yml
    - name: install mysql repository
      yum: name=http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm state=present
    - name: install mysql
      yum: name=mysql-server state=latest
    - name: mysql start / enable
      service: name=mysqld state=started enabled=yes

基本的には、Apacheの時と同じです。
CentOS7はyumのパッケージにmysql-serverがないため、
リポジドリをインストールしてから、mysqlをインストールしています。

state=presentはインストール済みの場合(ここではmysql-serverがある場合)は、何もしません。

PHPのインストールをして、Apacheを再起動させよう

playbook.yml
    - name: install php
      yum: name={{item}} state=latest
      with_items:
        - php
        - php-devel
        - php-mbstring
        - php-mysql
        - php-gd
      notify:
        - httpd restart
  handlers:
    - name: httpd restart
      service: name=httpd state=restarted

{{item}}で変数を設定できます。中身はwith_itemsに記載します。
notifyに任意の名前を付けて、PHPのインストールが完了した後に、一度だけ処理を実行させることができます。
handlersでPHPのインストールが完了した後の処理を記載します。nameには先ほどの任意の名前を対応付けます。
ここでは、PHPがインストールされたら、apacheの再起動をするように設定しています。

Ansibleを実行してみよう!

実行する前に、playbookの文法があっているか確認できます。

ansible-playbook playbook.yml --syntax-check

また、実際に実行したらどういう結果になるかシミュレーションできます。

ansible-playbook playbook.yml --ask-become-pass --check

--ask-become-passは、sudoでパスワードが設定がされている場合に必要です。

問題がなければ以下のコマンドで実行できます。

ansible-playbook playbook.yml --ask-become-pass

まとめ

一度実行して、インストールできているものは、二度目以降は実行されません。
そのため、playbookを書いたらすぐに実行して、どんどん設定を追加していけるので
思っていたよりも、スラスラかけました。

テストサーバの構築時にそのまま実行すれば
同じサーバーが自動でできることになるので、積極的に使っていきたいなと思います!
ファイルのコピーとかもできるので、脆弱性対応時に設定ファイルを変更して、
一斉に対応させることとかできそうですね。

あとは、playbookファイルがそのまま構築手順書のようになり
何をしたか見直せるのが、個人的には感動しました!

ryuji_i3
日々勉強中です。 資格取得とは別に、興味がある技術を積極的に試していきたい!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away