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.
Ansible ではじめる 
サーバ作業の自動化 
2014/10/11 shin1x1 
PHPカンファレンス2014
Agenda 
• Ansible とは 
• Ansible 基礎 
• PHPプロジェクトでの導入事例 
(c) 2014 Masashi Shinbara @shin1x1
Ansibleとは
Ansible 
• Python製の自動化ツール 
• SSHで接続して、タスクを実行 
• エージェントが不要 
• 習得が容易で、適用範囲が広い 
(c) 2014 Masashi Shinbara @shin1x1
動作イメージ 
操作マシン対象サーバ 
(c) 2014 Masashi Shinbara @shin1x1
動作イメージ 
$ ansible all -i hosts! 
-m shell -a “date” 
操作マシン対象サーバ 
(c) 2014 Masashi Shinbara @shin1x1
動作イメージ 
対象サーバ 
1. SSHで接続 
(c) 2014 Masashi Shinbara @shin1x1 
操作マシン
動作イメージ 
対象サーバ 
2. SFTPでコマンド送信 
(c) 2014 Masashi Shinbara @shin1x1 
操作マシン
動作イメージ 
3. コマンド実行 
対象サーバ 
(c) 2014 Masashi Shinbara @shin1x1 
操作マシン
動作イメージ 
対象サーバ 
(c) 2014 Masashi Shinbara @shin1x1 
操作マシン 
4. 結果表示
動作イメージ 
複数台へ実行 
(c) 2014 Masashi Shinbara @shin1x1 
操作マシン
インストール要件 
対象サーバ 
Python 2.6以降 
OSX, Linux, BSDs 
(c) 2014 Masashi Shinbara @shin1x1 
操作マシン
インストール要件 
対象サーバ 
OpenSSH 
Python 2.4以降 
(python-simplejson) 
(c) 2014 Masashi Shinbara @shin1x1 
操作マシンWindowsも可
Ansible 基礎
インベントリファイル 
• 対象ホストのリスト 
• インベントリファイルにあるホストが実行対象 
• 変数値の指定、グループ化が可能 
(c) 2014 Masashi Shinbara @shin1x1
インベントリファイル 
www.example.com! 
192.168.33.100 foo=bar! 
! 
[web]! 
web1.example.com! 
web2.example.com!
対象ホスト 
インベントリファイル 
www.example.com! 
192.168.33.100 foo=bar! 
! 
[web]! 
変数値 
web1.example.com! 
web2.example.com! webグループ
モジュール 
• 対象ホスト上で実行するタスク 
• yum, apt, file, copy, composer 等々 
• 244個のモジュール(2014.09.29現在) 
• 冪等性が考慮されている 
(shell, command以外...
ansible コマンド 
• インベントリファイルのホストに対して、 
一つのモジュール実行 
• 複数台に同じ操作を実行できる 
• アドホックなコマンド実行に利用 
(c) 2014 Masashi Shinbara @shin1x1
$ ansible all -i hosts -m shell -a “date”! 
!
インベントリファイル 
$ ansible all -i hosts -m shell -a “date”! 
! 
モジュール 
shell モジュール 
-a が引数(実行コマンド)
bash パッケージのバージョン確認 
$ ansible all -i hosts! 
-m shell -a “rpm -qv bash”! 
192.168.33.101 | success | rc=0 >>! 
bash-4.1.2-...
bash パッケージの更新 
$ ansible all -i hosts -s! 
-m yum -a "name=bash state=latest"! 
192.168.33.102 | success >>! 
(snip)! 
! 
...
Playbooks 
• 複数の実行タスクを順に記述していく 
• YAML で手順書を書くイメージ 
• 先頭から順に実行される 
• 読みやすく、書きやすい 
(c) 2014 Masashi Shinbara @shin1x1
---! 
- hosts: all! 
sudo: yes! 
tasks:! 
- name: httpdをインストール! 
yum: name=httpd state=latest! 
! 
- name: httpdを起動! 
serv...
対象ホスト 
---! 
- hosts: all! 
sudo: yes! 
tasks:! 
- name: httpdをインストール! 
タスク名 
yum: name=httpd state=latest! 
! 
- name: ht...
$ ansible-playbook -i hosts base.yml! 
! 
PLAY [all] ********************************************************! 
! 
GATHERI...
特殊な記法 
• 変数値の展開 
• 変数値による条件判定 
• リストによるループ 
• 別の playbook を読み込む 
(c) 2014 Masashi Shinbara @shin1x1
---! 
- hosts: all! 
sudo: yes! 
vars:! 
php56 が 
展開される 
php=php56 を 
セット 
php: php56! 
tasks:! 
- name: PHP をインストール! 
yum...
tasks:! 
- name: PHP5.6インストール! 
yum: pkg={{ php }} state=present! 
when: php == “php56”! 
! 
- name: PHP5.3インストール! 
yum: p...
tasks:! 
- name: パッケージインストール! 
yum: pkg={{ item }} state=present! 
with_items:! 
- php56! 
- php56-common! 
- php56-mbstri...
- include: php.yml! 
- include: postgresql.yml! 
外部 YAML ファイルを 
読み込む
PHPプロジェクトでの 
導入例
PHPプロジェクト 
(c) 2014 Masashi Shinbara @shin1x1 
開発環境 
CI環境 
検証環境 
本番環境
PHPプロジェクト 
(c) 2014 Masashi Shinbara @shin1x1 
開発環境 
CI環境 
検証環境 
本番環境
PHPプロジェクト 
• ミドルウェアインストール 
• ミドルウェア設定 
• データベースセットアップ 
• composer install 
•アプリケーションデプロイ 
• アプリケーションセットアップ 
• EC2 インスタンス生成...
Vagrant(開発環境) 
• Ansible は、シェルプロビジョンで VM に入れる 
(ホストには Ansible を要求しない) 
• local connection で playbook を実行 
(c) 2014 Masashi...
Docker(CIサーバ) 
• Dockerfile で、Ansible インストールして、 
local connection で ansible-playbook 実行 
• 自動テスト(phpunit) は、このコンテナ内で実行 
(c...
AWS(検証環境) 
• EC2 インストール生成、プロビジョン、デプロイを 
Ansible で一気に行う 
• Route 53 に Public DNS を登録 
(ex. dev.example.com の CNAME に割当) 
(c...
デプロイ(本番環境) 
• syncronise モジュールでコード設置 
• Capistrano スタイルのディレクトリ構成(自作) 
• データベースマイグレーション 
• キャッシュクリア 
(c) 2014 Masashi Shinb...
デプロイ(本番環境) 
!"" current -> releases/symlink to release_version! 
!"" releases! 
# # release_version1! 
# $"" release_versi...
まとめ
まとめ 
• Ansible は自動化ツール 
• 仕組みが単純、習得も楽 
• 適用範囲が広い 
• マルチスタックな PHPer におすすめ 
(c) 2014 Masashi Shinbara @shin1x1
@shin1x1 
http://joind.in/talk/view/12035 
(c) 2014 Masashi Shinbara @shin1x1
Appendix
入門Ansible 
http://www.amazon.co.jp/dp/B00MALTGDY 
(c) 2014 Masashi Shinbara @shin1x1
ansible-examples 
https://github.com/ansible/ansible-examples 
(c) 2014 Masashi Shinbara @shin1x1
Phansible 
http://phansible.com/ 
(c) 2014 Masashi Shinbara @shin1x1
Ansible Galaxy 
https://galaxy.ansible.com/ 
(c) 2014 Masashi Shinbara @shin1x1
shin1x1.laravel 
https://galaxy.ansible.com/list#/roles/1800 
(c) 2014 Masashi Shinbara @shin1x1
Upcoming SlideShare
Loading in …5
×

Ansible ではじめるサーバ作業の自動化

30,724 views

Published on

2014/10/11 PHPカンファレンス2014

Published in: Technology
  • Be the first to comment

Ansible ではじめるサーバ作業の自動化

  1. 1. Ansible ではじめる サーバ作業の自動化 2014/10/11 shin1x1 PHPカンファレンス2014
  2. 2. Agenda • Ansible とは • Ansible 基礎 • PHPプロジェクトでの導入事例 (c) 2014 Masashi Shinbara @shin1x1
  3. 3. Ansibleとは
  4. 4. Ansible • Python製の自動化ツール • SSHで接続して、タスクを実行 • エージェントが不要 • 習得が容易で、適用範囲が広い (c) 2014 Masashi Shinbara @shin1x1
  5. 5. 動作イメージ 操作マシン対象サーバ (c) 2014 Masashi Shinbara @shin1x1
  6. 6. 動作イメージ $ ansible all -i hosts! -m shell -a “date” 操作マシン対象サーバ (c) 2014 Masashi Shinbara @shin1x1
  7. 7. 動作イメージ 対象サーバ 1. SSHで接続 (c) 2014 Masashi Shinbara @shin1x1 操作マシン
  8. 8. 動作イメージ 対象サーバ 2. SFTPでコマンド送信 (c) 2014 Masashi Shinbara @shin1x1 操作マシン
  9. 9. 動作イメージ 3. コマンド実行 対象サーバ (c) 2014 Masashi Shinbara @shin1x1 操作マシン
  10. 10. 動作イメージ 対象サーバ (c) 2014 Masashi Shinbara @shin1x1 操作マシン 4. 結果表示
  11. 11. 動作イメージ 複数台へ実行 (c) 2014 Masashi Shinbara @shin1x1 操作マシン
  12. 12. インストール要件 対象サーバ Python 2.6以降 OSX, Linux, BSDs (c) 2014 Masashi Shinbara @shin1x1 操作マシン
  13. 13. インストール要件 対象サーバ OpenSSH Python 2.4以降 (python-simplejson) (c) 2014 Masashi Shinbara @shin1x1 操作マシンWindowsも可
  14. 14. Ansible 基礎
  15. 15. インベントリファイル • 対象ホストのリスト • インベントリファイルにあるホストが実行対象 • 変数値の指定、グループ化が可能 (c) 2014 Masashi Shinbara @shin1x1
  16. 16. インベントリファイル www.example.com! 192.168.33.100 foo=bar! ! [web]! web1.example.com! web2.example.com!
  17. 17. 対象ホスト インベントリファイル www.example.com! 192.168.33.100 foo=bar! ! [web]! 変数値 web1.example.com! web2.example.com! webグループ
  18. 18. モジュール • 対象ホスト上で実行するタスク • yum, apt, file, copy, composer 等々 • 244個のモジュール(2014.09.29現在) • 冪等性が考慮されている (shell, command以外) (c) 2014 Masashi Shinbara @shin1x1
  19. 19. ansible コマンド • インベントリファイルのホストに対して、 一つのモジュール実行 • 複数台に同じ操作を実行できる • アドホックなコマンド実行に利用 (c) 2014 Masashi Shinbara @shin1x1
  20. 20. $ ansible all -i hosts -m shell -a “date”! !
  21. 21. インベントリファイル $ ansible all -i hosts -m shell -a “date”! ! モジュール shell モジュール -a が引数(実行コマンド)
  22. 22. bash パッケージのバージョン確認 $ ansible all -i hosts! -m shell -a “rpm -qv bash”! 192.168.33.101 | success | rc=0 >>! bash-4.1.2-15.el6_4.x86_64! ! 192.168.33.102 | success | rc=0 >>! bash-4.1.2-15.el6_4.x86_64
  23. 23. bash パッケージの更新 $ ansible all -i hosts -s! -m yum -a "name=bash state=latest"! 192.168.33.102 | success >>! (snip)! ! 192.168.33.101 | success >>! (snip)
  24. 24. Playbooks • 複数の実行タスクを順に記述していく • YAML で手順書を書くイメージ • 先頭から順に実行される • 読みやすく、書きやすい (c) 2014 Masashi Shinbara @shin1x1
  25. 25. ---! - hosts: all! sudo: yes! tasks:! - name: httpdをインストール! yum: name=httpd state=latest! ! - name: httpdを起動! service: name=httpd state=started!
  26. 26. 対象ホスト ---! - hosts: all! sudo: yes! tasks:! - name: httpdをインストール! タスク名 yum: name=httpd state=latest! ! - name: httpdを起動! 実行モジュール service: name=httpd state=started!
  27. 27. $ ansible-playbook -i hosts base.yml! ! PLAY [all] ********************************************************! ! GATHERING FACTS ***************************************************************! ok: [192.168.33.101]! ok: [192.168.33.102]! ! TASK: [httpdをインストール] nameの値を表示 **********************************************************! ok: [192.168.33.101]! ok: [192.168.33.102]! ! TASK: [httpdを起動] **************************************************************! ok: [192.168.33.102]! ok: [192.168.33.101]! ! PLAY RECAP ********************************************************************! 192.168.33.101 : ok=3 changed=0 unreachable=0 failed=0! 192.168.33.102 : ok=3 changed=0 unreachable=0 failed=0
  28. 28. 特殊な記法 • 変数値の展開 • 変数値による条件判定 • リストによるループ • 別の playbook を読み込む (c) 2014 Masashi Shinbara @shin1x1
  29. 29. ---! - hosts: all! sudo: yes! vars:! php56 が 展開される php=php56 を セット php: php56! tasks:! - name: PHP をインストール! yum: pkg={{ php }} state=latest!
  30. 30. tasks:! - name: PHP5.6インストール! yum: pkg={{ php }} state=present! when: php == “php56”! ! - name: PHP5.3インストール! yum: pkg=php state=present! when: php != “php56”! ! php == “php56” なら実行 php != “php56” なら実行
  31. 31. tasks:! - name: パッケージインストール! yum: pkg={{ item }} state=present! with_items:! - php56! - php56-common! - php56-mbstring! - php56-mcrypt! ! 各パッケージを インストール
  32. 32. - include: php.yml! - include: postgresql.yml! 外部 YAML ファイルを 読み込む
  33. 33. PHPプロジェクトでの 導入例
  34. 34. PHPプロジェクト (c) 2014 Masashi Shinbara @shin1x1 開発環境 CI環境 検証環境 本番環境
  35. 35. PHPプロジェクト (c) 2014 Masashi Shinbara @shin1x1 開発環境 CI環境 検証環境 本番環境
  36. 36. PHPプロジェクト • ミドルウェアインストール • ミドルウェア設定 • データベースセットアップ • composer install •アプリケーションデプロイ • アプリケーションセットアップ • EC2 インスタンス生成 etc… (c) 2014 Masashi Shinbara @shin1x1 開発環境 CI環境 検証環境 本番環境
  37. 37. Vagrant(開発環境) • Ansible は、シェルプロビジョンで VM に入れる (ホストには Ansible を要求しない) • local connection で playbook を実行 (c) 2014 Masashi Shinbara @shin1x1
  38. 38. Docker(CIサーバ) • Dockerfile で、Ansible インストールして、 local connection で ansible-playbook 実行 • 自動テスト(phpunit) は、このコンテナ内で実行 (c) 2014 Masashi Shinbara @shin1x1
  39. 39. AWS(検証環境) • EC2 インストール生成、プロビジョン、デプロイを Ansible で一気に行う • Route 53 に Public DNS を登録 (ex. dev.example.com の CNAME に割当) (c) 2014 Masashi Shinbara @shin1x1
  40. 40. デプロイ(本番環境) • syncronise モジュールでコード設置 • Capistrano スタイルのディレクトリ構成(自作) • データベースマイグレーション • キャッシュクリア (c) 2014 Masashi Shinbara @shin1x1
  41. 41. デプロイ(本番環境) !"" current -> releases/symlink to release_version! !"" releases! # # release_version1! # $"" release_version2! $"" shared! • syncronise モジュールでコード設置 • Capistrano スタイルのディレクトリ構成 • シンボリックリンクによるバージョン変更 • アプリケーションセットアップ (c) 2014 Masashi Shinbara @shin1x1 $"" storage! !"" cache! !"" logs! !"" meta! !"" sessions! $"" views
  42. 42. まとめ
  43. 43. まとめ • Ansible は自動化ツール • 仕組みが単純、習得も楽 • 適用範囲が広い • マルチスタックな PHPer におすすめ (c) 2014 Masashi Shinbara @shin1x1
  44. 44. @shin1x1 http://joind.in/talk/view/12035 (c) 2014 Masashi Shinbara @shin1x1
  45. 45. Appendix
  46. 46. 入門Ansible http://www.amazon.co.jp/dp/B00MALTGDY (c) 2014 Masashi Shinbara @shin1x1
  47. 47. ansible-examples https://github.com/ansible/ansible-examples (c) 2014 Masashi Shinbara @shin1x1
  48. 48. Phansible http://phansible.com/ (c) 2014 Masashi Shinbara @shin1x1
  49. 49. Ansible Galaxy https://galaxy.ansible.com/ (c) 2014 Masashi Shinbara @shin1x1
  50. 50. shin1x1.laravel https://galaxy.ansible.com/list#/roles/1800 (c) 2014 Masashi Shinbara @shin1x1

×