Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

AWSとANSIBLEを使用してのLAMP+Laravelのアプリ表示までの実践資料

  • Login to see the comments

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

  1. 1. プロビジョニング入門 AWSとAnsibleによるLAMP環境構築 By Yasushi Odashima 2016年11月4日(金) ■スライドシェアURL http://www.slideshare.net/ssuser24564a/awsansiblelamplaravel-68179035
  2. 2. 1.登場人物 2.作業範囲 3.環境構成 4. AWS インスタンス 5. Ansible 重要用語 6.ベストプラティクス構造 7.プレイブック連携 8.プロビジョニング Section 1 9.プロビジョニング Section 2 10.まとめ 目次
  3. 3. 1.登場人物 • AmazonWebService • Amazonのクラウドサービス。今回ではAnsibleサーバとAPPサーバとして使用す る。OSはLinux6を基本としたAmazonLinuxを採用。 • Ansible • 構成管理ツール。インフラ作業をコード化することでプロビジョニング作業を自動化 する。今回はAPPサーバに対してOSインストール以降のすべての作業をプロビジョ ニングする。
  4. 4. 2.作業範囲 目的 : 自宅や物理サーバが用意できない環境でのLAMP構築とAPPインストールのプロ ビジョニング実践 Apache Install & Edit PHP Install & Edit Mysql Install & Edit App Install Database Edit OS Install & Edit AWS Code ※プロビジョニング:サーバに対してミドルウェアのインストールや設定等の環境構築を行うこと
  5. 5. 3.環境構成図 AnsibleServer ---------------------------- EC2 : Amazon Linux APPServer ---------------------------- EC2 : Amazon Linux Server構築、設定 http://<PublicIP> APPServer構築における工程をコード化しプロ ビジョニングを行う
  6. 6. 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)を構築するまでの内容。基本無料枠を使用する。
  7. 7. 5.Ansible重要用語 用語 内容 1 インベントリファイル 実行するモジュールや処理内容、使用する変数の値等を記載するYaml形式のファイ ル 2 プレイブック Ansibleで実行するプログラムを総称。Ansibleの持つプログラムを記載し処理の内容 を記載するインベントリファイル 3 ロール 複数のモジュールを組み合わせの処理を行うインベントリファイル。 4 モジュール プレイブックより呼び出されるPythonファイル。Pythonファイルを自作しモジュールとし て実行可能。 5 ベストプラクティス Ansibleで推奨されているディレクトリ構造。自作モジュールやロールを呼び出す上で の理想的な構造。 構成管理Ansibleにおける重要用語。以降のスライドにて詳細を記載。
  8. 8. 6.ベストプラティクス構造 /playbook /roles /group_vars /lamp.yml /hosts /lamp.yml /1_Apache /2_php /3_mysqlroles配下を読み込む(Site.yml) プレイブックで使用する変数を記載 それぞれの処理を記載する /library 自作モジュールの格納(未使用) プレイブックは保存、管理を行うことで「hosts」に 記載されたマシンすべてに同様の処理を行う。
  9. 9. 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」からの呼び出しが可能になる
  10. 10. 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から始まる作業を自動化する
  11. 11. 8.プロビジョニング Section 1 結果 http://<AWS Publicip>/makehtml2/0_main.html DocumentRoot : /var/www/html http://<AWS Publicip>/counter.php プロビジョニング実行後、APPサーバにはLAMPの環境が構築されており、サーバログイン なしでWEBアクセスが可能になる
  12. 12. 9.プロビジョニング Section2 実践 Section1にて構築した環境をもとにさらにフレームワークを導入し、LAMP+Laravelの環境に変更。 同時にAPPのインストールも行う APPServerAnsibleServer Playbook実行 ----------------------------- ・Laravel Install ・PHPCode Move ・Setting Port:22 実行コマンド ansible-playbook –i /playbook/hosts /playbook/lamp.yml
  13. 13. 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
  14. 14. 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を 一つにまとめることも可能。
  15. 15. 10.まとめ ■AWSを使えば自宅でも外でも簡単に検証環境が作れます! 物理環境で必要だったマシンの確保、OSのセットアップ等の作業から解放 され、コスト的にも時間的にもより効率的な環境が作成できます。 ネット環境があれば取り合えず何とかなります。 ■Ansibleを使えば面倒なインフラ作業から解放されます! プレイブックを保存しておくことで、破損したときの復旧も簡単です。 またコード化して一斉に展開することで一度に大量のサーバに対してもオペミス もなく効率的に結果を出すことができます。
  16. 16. --- - 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
  17. 17. [lamp] ip-XXX-XX-XX-XXX 補足:プレイブック内容 /playbook/hosts
  18. 18. --- 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)まで結合して一つの ファイルとして作成する
  19. 19. ### 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)まで結合して一つの ファイルとして作成する
  20. 20. 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)まで結合して一つの ファイルとして作成する
  21. 21. ### 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)まで結合して一つの ファイルとして作成する
  22. 22. --- - 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
  23. 23. --- - 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
  24. 24. --- - 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
  25. 25. 補足:プレイブック内容 /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
  26. 26. 補足:プレイブック内容 /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

×