プロビジョニング入門
AWSとAnsibleによるLAMP環境構築
By Yasushi Odashima
2016年11月4日(金)
■スライドシェアURL
http://www.slideshare.net/ssuser24564a/awsansiblelamplaravel-68179035
1.登場人物
2.作業範囲
3.環境構成
4. AWS インスタンス
5. Ansible 重要用語
6.ベストプラティクス構造
7.プレイブック連携
8.プロビジョニング Section 1
9.プロビジョニング Section 2
10.まとめ
目次
1.登場人物
• AmazonWebService
• Amazonのクラウドサービス。今回ではAnsibleサーバとAPPサーバとして使用す
る。OSはLinux6を基本としたAmazonLinuxを採用。
• Ansible
• 構成管理ツール。インフラ作業をコード化することでプロビジョニング作業を自動化
する。今回はAPPサーバに対してOSインストール以降のすべての作業をプロビジョ
ニングする。
2.作業範囲
目的 :
自宅や物理サーバが用意できない環境でのLAMP構築とAPPインストールのプロ
ビジョニング実践
Apache Install & Edit
PHP Install & Edit
Mysql Install & Edit
App Install
Database Edit
OS Install & Edit AWS
Code
※プロビジョニング:サーバに対してミドルウェアのインストールや設定等の環境構築を行うこと
3.環境構成図
AnsibleServer
----------------------------
EC2 : Amazon Linux
APPServer
----------------------------
EC2 : Amazon Linux
Server構築、設定 http://<PublicIP>
APPServer構築における工程をコード化しプロ
ビジョニングを行う
4.AWS インスタンス
構成内容 構成値 内容
1 アカウント作成 hogehoge 特になし
2 AMI選択 Amazon Linux 無料枠内でできるシンプルな構成を選択。
3 インスタンスタイプ t2maicro サーバのスペックを決定する
4 ネットワーク 172/31/0.0/16 デフォルトをそのまま使用
5 サブネット subnet-9024c3e7 データセンターの拠点を選択する。
6 自動割り当てパブリックIP 有効化 インターネットからアクセス可能にする。
7 ストレージ 8GB 無料枠内では30GBまで設定可能
8 タグ APPServer インスタンスの名称
9 セキュリティグループ HTTP,HTTPS,ICMP デフォルトではSSHのみしか許可していない
10 Key Hogehoge.pem インスタンスログイン時に使用する秘密鍵
EC2(AmazonLinux)を構築するまでの内容。基本無料枠を使用する。
5.Ansible重要用語
用語 内容
1 インベントリファイル 実行するモジュールや処理内容、使用する変数の値等を記載するYaml形式のファイ
ル
2 プレイブック Ansibleで実行するプログラムを総称。Ansibleの持つプログラムを記載し処理の内容
を記載するインベントリファイル
3 ロール 複数のモジュールを組み合わせの処理を行うインベントリファイル。
4 モジュール プレイブックより呼び出されるPythonファイル。Pythonファイルを自作しモジュールとし
て実行可能。
5 ベストプラクティス Ansibleで推奨されているディレクトリ構造。自作モジュールやロールを呼び出す上で
の理想的な構造。
構成管理Ansibleにおける重要用語。以降のスライドにて詳細を記載。
6.ベストプラティクス構造
/playbook
/roles
/group_vars
/lamp.yml
/hosts
/lamp.yml
/1_Apache
/2_php
/3_mysqlroles配下を読み込む(Site.yml)
プレイブックで使用する変数を記載
それぞれの処理を記載する
/library
自作モジュールの格納(未使用)
プレイブックは保存、管理を行うことで「hosts」に
記載されたマシンすべてに同様の処理を行う。
7.プレイブック連携
ベストプラティクス構造で作成することで ---
- name: apache Install Apache
yum: name=httpd
- name: apache Make PHP Dir
file: path=/var/www/html state=directory
- name: apache PHP File Transfer
copy: src=/playbook/roles/file/dest=/var/www/html
- name: apache restart
service: name=httpd state=restarted
---
- name: Playbook LAMP
become: yes
hosts: [lamp]
roles: - 1_apache
- 2_php
- 3_mysql
---
- name: php install repo
yum: name={{ phpdlpath }}
---
- name: mysql install repo
yum: name="{{ sqlrepo }}"
■/playbook/roles/1_apache/tasks/main.yml
■/playbook/roles/2_php/tasks/main.yml
■/playbook/roles/3_mysql/tasks/main.yml
■/playbook/lamp.yml
①
②
③
「Lamp.yml」からの呼び出しが可能になる
8.プロビジョニング Section 1
Ansibleサーバより実行されたプレイブック(Lamp.yml)がAPPサーバに対して
APPServerAnsibleServer
Playbook(lamp.yml)実行
-----------------------------
・Apache,PHP,Mysql Install
・HTMLCode Move
・Setting
Port:22
実行コマンド
ansible-playbook –i /playbook/hosts /playbook/lamp.yml
プロビジョニングを行い、ApacheInstallから始まる作業を自動化する
8.プロビジョニング Section 1 結果
http://<AWS Publicip>/makehtml2/0_main.html
DocumentRoot : /var/www/html
http://<AWS Publicip>/counter.php
プロビジョニング実行後、APPサーバにはLAMPの環境が構築されており、サーバログイン
なしでWEBアクセスが可能になる
9.プロビジョニング Section2 実践
Section1にて構築した環境をもとにさらにフレームワークを導入し、LAMP+Laravelの環境に変更。
同時にAPPのインストールも行う
APPServerAnsibleServer
Playbook実行
-----------------------------
・Laravel Install
・PHPCode Move
・Setting
Port:22
実行コマンド
ansible-playbook –i /playbook/hosts /playbook/lamp.yml
9.プロビジョニング Section2 結果
http://<AWS Publicip>/makehtml2/0_main.html
DocumentRoot切り替えにより
表示も切り替える
DocumentRoot : /var/www/html
http://<AWS Publicip>/counter.php
DocumentRoot : /laraishi/public
http://<AWS Publicip>/attendances
10.まとめ
Apache Install & Edit
PHP Install & Edit
Mysql Install & Edit
App Install
Database Edit
OS Install & Edit AWS
Code(Section1)
Laravel Install & Edit
Laravel App Install
Code(Section2)
Section1と2の作業を手作業で行うと環境+8個のタスクが発生するがAWSとAnsibleを使用する
ことで3つのタスクに減らし、物理環境の準備も必要ない
Lamp.ymlの編集でSection1と2を
一つにまとめることも可能。
10.まとめ
■AWSを使えば自宅でも外でも簡単に検証環境が作れます!
物理環境で必要だったマシンの確保、OSのセットアップ等の作業から解放
され、コスト的にも時間的にもより効率的な環境が作成できます。
ネット環境があれば取り合えず何とかなります。
■Ansibleを使えば面倒なインフラ作業から解放されます!
プレイブックを保存しておくことで、破損したときの復旧も簡単です。
またコード化して一斉に展開することで一度に大量のサーバに対してもオペミス
もなく効率的に結果を出すことができます。
---
- name: Playbook LAMP
become: yes hosts: [lamp]
roles:
#step 1 apache+php
- 1_apache
- 2_php
- 3_mysql
#step 2 laravel
- 4_laravel
- 5_app
補足:プレイブック内容
/playbook/lamp.yml
[lamp]
ip-XXX-XX-XX-XXX
補足:プレイブック内容
/playbook/hosts
---
ansible_ssh_user: ec2-user
ansible_ssh_private_key_file: /home/ec2-
user/.ssh/hogehoge_1005.pem
ansible_ssh_port: 22
ansible_connection: ssh
### Apache ###
httpdgroup: www
httpdir: /var/www
filesrc: /playbook/roles/1_apache/file/
filedest: /var/www/html
補足:プレイブック内容
/playbook/group_vars/
lamp.yml(1)
(1)~(4)まで結合して一つの
ファイルとして作成する
### PHP ###
phpapp: counter.dat
phpcode: "{{ filedest }}/{{ phpapp }}"
libpkg:
- 'libmcrypt'
- 'libtool-ltdl'
- 'libtidy'
- 'libXpm'
- 'libtiff'
- 'gd-last'
- 'autoconf'
- 'automake'
pkglist:
- 'php'
- 'php-opcache'
- 'php-mbstring'
- 'php-mcrypt'
- 'php-pecl-apc'
- 'php-gd'
- 'php-mysqlnd'
- 'php-xml'
補足:プレイブック内容
/playbook/group_vars/
lamp.yml(2)
(1)~(4)まで結合して一つの
ファイルとして作成する
repfile: /etc/php.ini
defstr: "^;date.timezone ="
replacestr: "date.timezone = Asia/Tokyo"
### mysql ###
sqlrepo : http://dev.mysql.com/get/mysql-community-
release-el6-5.noarch.rpm
apkg:
- 'mysql'
- 'mysql-devel'
- 'mysql-server'
- 'mysql-utilities'
svc: mysqld
svcstate: started
svcauto: yes
root_db_password: root
dbtemp: /playbook/roles/3_mysql/template/
dbdir: /dbbackup
dbsrc: /playbook/roles/3_mysql/file/
dbbk: hogehoge.sql
dbname: hogehogeDB
補足:プレイブック内容
/playbook/group_vars/
lamp.yml(3)
(1)~(4)まで結合して一つの
ファイルとして作成する
### laravel ###
dl: https://getcomposer.org/installer
composer: /usr/bin/composer
pjdir: /laravel
httpdfile: /etc/httpd/conf/httpd.conf
httpcode:
- { regexp: 'DocumentRoot "/var/www/html"' ,replace:
'DocumentRoot "{{ pjdir }}/public"' }
- { regexp: '<Directory "/var/www/html">' ,replace:
'<Directory "{{ pjdir }}/public">' }
補足:プレイブック内容
/playbook/group_vars/
lamp.yml(4)
(1)~(4)まで結合して一つの
ファイルとして作成する
---
- name: apache Update Repo
yum: name=* state=latest
- name: apache Install DeveloperTool
yum: name="@Development tools"
- name: apache Install VIM
yum: name=vim
- name: apache Install Apache
yum: name=httpd
- name: apmache Make {{ httpdgroup }} Group
group: name={{ httpdgroup }}
- name: apache {{ ansible_ssh_user }} www appeded
shell: usermod -a -G {{ httpdgroup }} {{ ansible_ssh_user }}
- name: apache www Permission
file: path={{ httpdir }} group={{ httpdgroup }} mode=2775 state=directory
- name: apache /www Subdirectory Permission
shell: find /var/www -type d -exec sudo chmod 2775 {} ;
- name: apache /www Subdirectory Permission
shell: find /var/www -type f -exec sudo chmod 0664 {} ;
- name: apache Make PHP Dir
file: path={{ filedest }} state=directory
- name: apache PHP File Transfer
copy: src={{ filesrc }} dest={{ filedest }}
- name: apache PHP File ACL Change
file: path={{ phpcode }} mode=606
- name: apmache Enable htaccess
replace:
dest=/etc/httpd/conf/httpd.conf
regexp='AllowOverride None'
replace='AllowOverride All'
補足:プレイブック内容
/playbook/roles/1_apache/
tasks/main.yml
---
- name: php install repo
yum: name=http://rpms.famillecollet.com/enterprise/remi-release-
6.rpm
- name: php install phprepo
yum: name={{ item }} disablerepo=amzn-main enablerepo=epel
with_items:
- 'libwebp'
- name: php install phplib
yum: name={{ item }}
with_items:
- "{{ libpkg }}"
- name: php install php
yum: name={{item}} disablerepo=amzn-main enablerepo=remi-
php70
with_items:
- "{{ pkglist }}"
- name: php setting timezone
replace: >
dest="{{ repfile }}"
regexp="^;date.timezone ="
replace="date.timezone = Asia/Tokyo"
補足:プレイブック内容
/playbook/roles/2_php/
tasks/main.yml
---
- name: mysql install repo
yum: name="{{ sqlrepo }}"
- name: mysql install repo mysql
yum: name="{{ item }}" state=present
with_items:
- "{{ apkg }}"
- name: install mysql python module (from source)
when: ansible_distribution == 'Amazon' # Amazon Linux AMI
command: 'bash -lc "{{ item }}"'
with_items:
- 'cd /usr/tmp && wget http://download.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.3.tar.gz'
- 'cd /usr/tmp && tar xvzf /usr/tmp/MySQL-python-1.2.3.tar.gz'
- 'cd /usr/tmp/MySQL-python-1.2.3 && python setup.py build'
- 'cd /usr/tmp/MySQL-python-1.2.3 && python setup.py install'
- 'rm -rf /usr/tmp/MySQL-python*'
- name: apache restart
service: name=httpd state=restarted
- name: mysql start mysql
service: name="{{ svc }}" state="{{ svcstate }}" enabled="{{ svcauto }}"
#- name: mysql user setting
# command: mysqladmin -u root password {{ root_db_password }}
# mysql_user: name=root host={{ inventory_hostname }} password={{ root_db_password }} priv=*.*:All,GRANT
- name: rootパスワード設定
mysql_user: name=root password={{ root_db_password }} login_user=root
login_password={{ root_db_password }} check_implicit_admin=yes
- template: src={{ dbtemp }}.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
- name: WorkingDir make
file: path={{ dbdir }} state=directory
- name: Move DBBackup
copy: src={{ dbsrc }} dest={{ dbdir }}
- name: DB Create
mysql_db: name={{ dbname }} state=present
- name: DB Import
mysql_db: name={{ dbname }} state=import target={{ dbdir }}/{{ dbbk}}
補足:プレイブック内容
/playbook/roles/3_mysql/
tasks/main.yml
補足:プレイブック内容
/playbook/roles/
4_lalavel/tasks/main.yml
---
- name: laravel composer Install
shell: curl -sS "{{ dl }}" | php
- name: mv composer.phar /usr/bin/composer
shell: mv composer.phar "{{ composer }}“
- name: Project Make
shell: composer create-project laravel/laravel {{ pjdir }} --prefer-dist
- name: laravel httpd_conf
replace: dest="{{ httpdfile }}" regexp="{{ item.regexp }}"
replace="{{ item.replace }}" backup=yes
with_items:
- "{{ httpcode }}“
-name: hogehoge
shell: chmod -R 777 {{ pjdir }}
- name: apache restart
service: name=httpd state=restarted
補足:プレイブック内容
/playbook/roles/
5_app/tasks/main.yml
---
- name: App Install
file: path=/laravel state=absent
- name: App Install
unarchive: src=/playbook/roles/5_app/file/laravel.tar.gz dest=/
- name: App Install
command: chmod -R 777 /laravel

AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-