7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-30

#はじめに
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ファイルがそのまま構築手順書のようになり
何をしたか見直せるのが、個人的には感動しました!

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?