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.
ChefからAnsibleへ引っ越したい
人のためのAnsible入門
July Tech Festa 2015/7/26
@iwashi86 / Yoshimasa Iwase
1
https://www.flickr.com/photos/...
2
Yoshimasa Iwase
@iwashi86
NTTコミュニケーションズ
技術開発部 (R&D部門)
Web/インフラ エンジニア
WebRTC
3
ブラウザだけで
P2Pで音声映像通信する技術
4
http://is.gd/html5jt#1111
遊んでみる!
5
SkyWay = CPaaS
(Communication Paas)
6
2014年前半の裏側
https://www.flickr.com/photos/torkildr/3462607995/in/photolist-6gYLHR-4H1hyC-2Wrvx-65cUp7-5RvGZs-6NAXg-n6mHgT...
7
ある理由で移行
https://www.flickr.com/photos/torkildr/3462607995/in/photolist-6gYLHR-4H1hyC-2Wrvx-65cUp7-5RvGZs-6NAXg-n6mHgT-6i...
8
自身の例で、振り返ってみてください
前提
VM上のインフラ・ミドル構築をする
これまで構成管理ツールの利用経験無し
9
発見 導入 運用
新技術を導入時の工程
10
Chef凄い
らしいぞ!
発見 導入 運用
11
発見 導入 運用
(1冊程度勉強して)
導入もOK!
12
半年後
13
ん?
発見 導入 運用
14
https://www.flickr.com/photos/ro_buk/4207903199/in/photolist-7pQB2a-7oP9vq-8xbiHx-7Ajmwj-8zemoB-7ehuXP-94aHzE-93jvSN-5g...
15
おまけに・・・
16
https://www.flickr.com/photos/ro_buk/4207903199/in/photolist-7pQB2a-7oP9vq-8xbiHx-7Ajmwj-8zemoB-7ehuXP-94aHzE-93jvSN-5g...
17
https://www.flickr.com/photos/ro_buk/4207903199/in/photolist-7pQB2a-7oP9vq-8xbiHx-7Ajmwj-8zemoB-7ehuXP-94aHzE-93jvSN-5g...
18
そんなとき
19
ansibleというのが流行ってるらしい
補足:当時はItamaeに気づいてませんでした
20
これならチームでメンテできそう!
まず使ってみよう!(そのまま導入)
21
本題
22
本日のゴール
(主にChef利用経験のあるご自身が)
ChefからAnsibleへ移行する
第一歩を踏み出せる気分になること
https://www.flickr.com/photos/opopododo/2571337302/in/ph...
23
本日の流れ
• Ansibleとは(概要)
• Ansibleの基本的な使い方
• Ansibleの応用的な使い方
https://www.flickr.com/photos/gsfc/13902795556/in/photolist-n...
24
本日の流れ
• Ansibleとは(概要)
• Ansibleの基本的な使い方
• Ansibleの応用的な使い方
https://www.flickr.com/photos/gsfc/13902795556/in/photolist-n...
25
一言で
26
サーバ構築を
自動化するシンプルな
構成管理ツール(+α)
27
Provisioning
Toolchain
28
Application Service Orchestration
(デプロイ・ノード間連携など)
System Configuration
(OSやミドルの構成管理など)
Bootstrapping
(OSの初期インストールなど)
Pr...
29
Application Service Orchestration
(デプロイ・ノード間連携など)
System Configuration
(OSやミドルの構成管理など)
Bootstrapping
(OSの初期インストールなど)
Pr...
30
Application Service Orchestration
(デプロイ・ノード間連携など)
System Configuration
(OSやミドルの構成管理など)
Bootstrapping
(OSの初期インストールなど)
Pr...
31
Application Service Orchestration
(デプロイ・ノード間連携など)
System Configuration
(OSやミドルの構成管理など)
Bootstrapping
(OSの初期インストールなど)
Pr...
32
Application Service Orchestration
(デプロイ・ノード間連携など)
System Configuration
(OSやミドルの構成管理など)
Bootstrapping
(OSの初期インストールなど)
Pr...
33
特徴
34
引用 http://www.ansible.com/home
35
引用 http://www.ansible.com/home
数時間で使える
人間(非rubyプログラマ)
も読みやすい
36
引用 http://www.ansible.com/home
エージェント不要
SSH等があればOK
数時間で使える
人間(非rubyプログラマ)
も読みやすい
37
引用 http://www.ansible.com/home
エージェント不要
SSH等があればOK
構成管理のみならず
デプロイ・オーケストレーション
そして冪等性も対応
数時間で使える
人間(非rubyプログラマ)
も読みやすい
38
比べてみる
39
Ansible Chef
エージェント エージェントレス エージェントとサーバ
接続プロトコル SSHなど SSHなど
記述方法 YAML Ruby
柔軟さ △ ○
シンプルさ ○ △
テンプレート形式 Jinja2 erb
共用 Ans...
40
本日の流れ
• Ansibleとは(概要)
• Ansibleの基本的な使い方
• Ansibleの応用的な使い方
https://www.flickr.com/photos/gsfc/13902795556/in/photolist-n...
41
• インストール
• 使ってみる
• 実行対象ホストを決める
• 対象ホストで任意の処理を実施
Ansibleの基本的な使い方
42
インストール
// RedHat系 (EPEL導入後)
$ sudo yum install ansible
// Ubuntu等
$ sudo apt-get install software-properties-common
$ s...
43
設定ファイル
inventory 実行対象を設定するファイル
ini形式で記述
44
設定ファイル
inventory
playbook
実行対象を設定するファイル
ini形式で記述
task(実施する処理)を
まとめて記述したファイル
45
設定ファイル
inventory
playbook
ansible.cfg
実行対象を設定するファイル
ini形式で記述
task(実施する処理)を
まとめて記述したファイル
Ansible自体の設定ファイル
// 今回は省略
46
設定ファイル
inventory
playbook
ansible.cfg
実行対象を設定するファイル
ini形式で記述
task(実施する処理)を
まとめて記述したファイル
Ansible自体の設定ファイル
// 今回は省略
47
inventoryファイル
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
db[01:05].example.com
48
inventoryファイル
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
db[01:05].example.com
シングルのホスト
...
49
inventoryファイル
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
db[01:05].example.com
シングルのホスト
...
50
inventoryファイル
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
db[01:05].example.com
シングルのホスト
...
51
続:inventoryファイル
example.com ansible_ssh_port=5555
// その他の設定
ansible_ssh_host=192.168.1.50
ansible_ssh_user=hoge
ansible...
52
続:inventoryファイル
example.com ansible_ssh_port=5555
// その他の設定
ansible_ssh_host=192.168.1.50
ansible_ssh_user=hoge
ansible...
53
続:inventoryファイル
example.com ansible_ssh_port=5555
// その他の設定
ansible_ssh_host=192.168.1.50
ansible_ssh_user=hoge
ansible...
54
続:inventoryファイル
example.com ansible_ssh_port=5555
// その他の設定
ansible_ssh_host=192.168.1.50
ansible_ssh_user=hoge
ansible...
55
ホスト名: jtf
(VitualBox上のVM)
ローカル
Macbook
使ってみる
56
ホスト名: jtf
(VitualBox上のVM)
ローカル
Macbook
使ってみる
ansible jtf -i host.ini -m ping
-i インベントリファイルホストを指定 モジュール
(ホスト上で
実行される)
$ ...
57
ansible jtf -i host.ini -a ‘uname -a’
ホスト名: jtf
(VitualBox上のVM)
ローカル
Macbook
続:使ってみる
ansible jtf -i host.ini –m setup
c...
58
設定ファイル
inventory
playbook
ansible.cfg
実行対象を設定するファイル
ini形式で記述
task(実施する処理)を
まとめて記述したファイル
Ansible自体の設定ファイル
// 今回は省略
59
Playbook
---
- hosts: jtf
sudo: yes
tasks:
- apt: name=sl
update_cache=yes
対象ホスト
sudoで
以下のタスク群を実行
「誰に対して、どういう条件で、何を実行」を...
60
Playbook
---
- hosts: jtf
sudo: yes
tasks:
- apt: name=sl
update_cache=yes
chefでいうResources
AnsibleではModuleと呼ぶ
重要なので、後に...
61
Playbook - vars
---
- hosts: jtf
vars:
username: jtf_user
tasks:
- user: name={{ username }}
変数を渡したいとき
62
Playbook - vars
---
- hosts: jtf
vars:
username: jtf_user
tasks:
- user: name={{ username }}
変数を渡したいとき
taskで使う変数を組みこむ
63
Playbook - handler
tasks:
- apt: name=nginx
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx s...
64
Playbook - handler
tasks:
- apt: name=nginx
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx s...
65
Playbook - handler
tasks:
- apt: name=nginx
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx s...
66
Playbook - handler
tasks:
- apt: name=nginx
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx s...
67
Playbook - loop
tasks:
- apt: name={{ item }}
with_items:
- gcc
- make
- git
chefだとruby構文で頑張っていたところ
68
Playbook - loop
tasks:
- apt: name={{ item }}
with_items:
- gcc
- make
- git
chefだとruby構文で頑張っていたところ
#Chefだとこんな感じ
%w{gcc...
69
Playbook - when
tasks:
- apt: name=apache2 state=latest
when: ansible_os_family == “Debian”
- apt: name=httpd state=lat...
70
Playbook - when
tasks:
- apt: name=apache2 state=latest
when: ansible_os_family == “Debian”
- apt: name=httpd state=lat...
71
よく使うモジュール
72
file
ファイル・ディレクトリの作成や変更
(Chefでいう file + directory + link)
- file: path=/etc/foo.conf owner=foo
group=foo mode=0644
- fil...
73
copy
ansibleを実行するホストから
対象のホストにファイルをコピーする
Chefでいうcookbook_file
- copy: src=/srv/myfiles/foo.conf
dest=/etc/foo.conf owne...
74
template
Chefのテンプレートと同様
変数を埋め込めるfileモジュール
テンプレー卜はerbではなくjinja2
- template: src=/mytemplates/foo.j2
dest=/etc/file.conf ...
75
script
対象ホストでスクリプトを実行する
createsはchefのcreatesと一緒。
tasks:
# 冪等性無し
- script: my_command.sh
# 冪等性有り
- script: my_command.sh...
76
get_url
URLからファイルをダウンロードする
既にファイルが存在していた場合は
ダウンロードをスキップできる
(Chefでいうremote_file)
tasks:
- name: download foo.conf
get_ur...
77
その他は本家ドキュメントを参照
78
本日の流れ
• Ansibleとは(概要)
• Ansibleの基本的な使い方
• Ansibleの応用的な使い方
79
ディレクトリ構成 Best Practice
・ Chefにはenvironmentがあるが、Ansibleにはない
・対応としては、ディレクトリ構成のベストプラクティスが
公開されているのでそれで吸収可能
production # in...
80
続:ディレクトリ構成 Best Practice
・ role単位で構築していくのが基本
・以下の例は nginx の例
roles/
nginx/ # ロールごとに作成(Chefでいうクックブック単位)
tasks/ # 実行したい処理...
81
ChefでいうCommunity Cookbookに近い
roleごとに必要なものをDL可
82
Dynamic Inventry
・ 管理ホストが多くなると、Inventry管理が大変
・特にクラウド上のホストは生成・破棄の繰り返し
・ Inventryには静的ファイルの他、スクリプト指定可能
// AWSを利用するためのキー情報
...
83
Dynamic Inventry
・ 管理ホストが多くなると、Inventry管理が大変
・特にクラウド上のホストは生成・破棄の繰り返し
・ Inventryには静的ファイルの他、スクリプト指定可能
// AWSを利用するためのキー情報
...
84
Ansibleでデプロイまでやってみる
HTTP Request HTTP Request
85
Ansibleでデプロイまでやってみる
仕込み
・ nginxからRailsアプリの指定はシンボリックリンク
例: /usr/local/app
・本当のアプリは、タイムスタンプ名のディレクトリへ
例: /usr/local/201507...
86
Ansibleでデプロイまでやってみる
旧
新
条件:
・Nginxをリバースプロキシとして利用
・Nginxの背後にはRailsアプリ
・旧/新の切り替えをなるべくBlue Greenに行いたい
87
- name: デプロイ先のディレクトリをtimestampとするために、timestampを得る
command: date '+%Y%m%d-%H%I%S'
register: date_output
- name: timestam...
88
インフラTDDしたい!
・ホワイトボックスアプローチ
⇒
・ブラックボックスアプローチ
⇒ Infratester等
1. Ansible
2. Serverspec / Infratester
89
インフラTDDしたい!
・ホワイトボックスアプローチ
⇒
・ブラックボックスアプローチ
⇒ Infratester等
describe package(‘httpd’)
it { should be_installed }
end
des...
90
インフラTDDしたい!
・ホワイトボックスアプローチ
⇒
・ブラックボックスアプローチ
⇒ Infratester等
describe server(:app) do
describe http('http://app') do
It "...
91
まとめ
• Ansibleとは(概要)
• Ansibleの基本的な使い方
• Ansibleの応用的な使い方
92
本日のゴール
(主にChef利用経験のあるご自身が)
ChefからAnsibleへ移行する
第一歩を踏み出せる気分になること
https://www.flickr.com/photos/opopododo/2571337302/in/ph...
Upcoming SlideShare
Loading in …5
×

ChefからAnsibleへ引っ越したい 人のためのAnsible入門

7,932 views

Published on

JulyTechFesta 2015での講演資料です。
http://2015.techfesta.jp/p/program.html#ansible_for_chef_users

主に以下3点について解説しています。
1. Ansibleとは(概要)
2. Ansibleの基本的な使い方
3. Ansibleの応用的な使い方

Published in: Technology
  • Be the first to comment

ChefからAnsibleへ引っ越したい 人のためのAnsible入門

  1. 1. ChefからAnsibleへ引っ越したい 人のためのAnsible入門 July Tech Festa 2015/7/26 @iwashi86 / Yoshimasa Iwase 1 https://www.flickr.com/photos/gsfc/13902795556/in/photolist-nbxsKE-barXrZ-azd68k-bxoSSp-egb7rB-mhaDLa-bRYwBH-8NGh4Z-4d2XZ-dkiRVQ-36ELQM-ftbvxr-8LeQta-6cfCfe-9iWrrE-dZUfSq-neTxeK-ntL9MW-gzYp8-efDEVP-5j2f4x-bdd9ea-kJrs1Z-dz6k4z-oWv5Tp-tvQXW7-nuM4RK-66Khgv-8CPZUQ-MRo3L-khBpLd-pugD9j-pjjMoj-7DQWhU- 5kMcmT-priEv3-ticgYH-9jt6GK-d2McUy-aXHTdn-nRaCfF-hsuYJX-naQgip-edLBtV-edScNj-edSefj-aaEDDi-9Kzoa-c5gQRN-dyhNrD
  2. 2. 2 Yoshimasa Iwase @iwashi86 NTTコミュニケーションズ 技術開発部 (R&D部門) Web/インフラ エンジニア
  3. 3. WebRTC 3 ブラウザだけで P2Pで音声映像通信する技術
  4. 4. 4 http://is.gd/html5jt#1111 遊んでみる!
  5. 5. 5 SkyWay = CPaaS (Communication Paas)
  6. 6. 6 2014年前半の裏側 https://www.flickr.com/photos/torkildr/3462607995/in/photolist-6gYLHR-4H1hyC-2Wrvx-65cUp7-5RvGZs-6NAXg-n6mHgT-6iUZPe-Je5v9-9v7Kgx-5fipyz-iygJ-cKbUb-ac3oaX-NhE1s-bjtT-2XQgfL-JebAB-82PXBP-6gYLjx-2kAaZ-cfXKY1-mZJBc2-8XH6Na-4YVJXw-7YNxq-bf2wtK-exjsm-cEeN1- 6h3W3W-4PGC7o-3M87z-5nSsLu-cqqwcb-8NwzC-eWnwZ-akqkB-8cd3Np-icgBtX-tCk6d-2JXe1q-dX67NU-7MriLM-a6kpxQ-mMwb-5fnQef-DqpnY-8b8puq-9cggqL-YD7Db
  7. 7. 7 ある理由で移行 https://www.flickr.com/photos/torkildr/3462607995/in/photolist-6gYLHR-4H1hyC-2Wrvx-65cUp7-5RvGZs-6NAXg-n6mHgT-6iUZPe-Je5v9-9v7Kgx-5fipyz-iygJ-cKbUb-ac3oaX-NhE1s-bjtT-2XQgfL-JebAB-82PXBP-6gYLjx-2kAaZ-cfXKY1-mZJBc2-8XH6Na-4YVJXw-7YNxq-bf2wtK-exjsm-cEeN1- 6h3W3W-4PGC7o-3M87z-5nSsLu-cqqwcb-8NwzC-eWnwZ-akqkB-8cd3Np-icgBtX-tCk6d-2JXe1q-dX67NU-7MriLM-a6kpxQ-mMwb-5fnQef-DqpnY-8b8puq-9cggqL-YD7Db
  8. 8. 8 自身の例で、振り返ってみてください 前提 VM上のインフラ・ミドル構築をする これまで構成管理ツールの利用経験無し
  9. 9. 9 発見 導入 運用 新技術を導入時の工程
  10. 10. 10 Chef凄い らしいぞ! 発見 導入 運用
  11. 11. 11 発見 導入 運用 (1冊程度勉強して) 導入もOK!
  12. 12. 12 半年後
  13. 13. 13 ん? 発見 導入 運用
  14. 14. 14 https://www.flickr.com/photos/ro_buk/4207903199/in/photolist-7pQB2a-7oP9vq-8xbiHx-7Ajmwj-8zemoB-7ehuXP-94aHzE-93jvSN-5gCQp-nRdqb-7ESvZP-5eMSN-4izRk-gdCx68-7H5QhG-hm25eq-gdCArW-gdCvG6-99Q3YA-gdD9sZ-4iA9c-8uzbUL-7hWskX-24apZ- 6JCtXT-765WDT-7cpma4-765UzM-8wAnxv-8xtXNE-23HQ3r-79kxLp-9uu261-6JgUhP-62GZde-6HTovP-7xJsr-tXPfoF-6JkZB3-3aWJ47-6JkZtY-5fFxrT-5fKTRL-bzSKLU-RTQ8y-hGmu1-5fKTgm-5fFvFn-3D3gk9-769MNG 完全に忘れた・・・ メンテ辛い・・・
  15. 15. 15 おまけに・・・
  16. 16. 16 https://www.flickr.com/photos/ro_buk/4207903199/in/photolist-7pQB2a-7oP9vq-8xbiHx-7Ajmwj-8zemoB-7ehuXP-94aHzE-93jvSN-5gCQp-nRdqb-7ESvZP-5eMSN-4izRk-gdCx68-7H5QhG-hm25eq-gdCArW-gdCvG6-99Q3YA-gdD9sZ-4iA9c-8uzbUL-7hWskX-24apZ- 6JCtXT-765WDT-7cpma4-765UzM-8wAnxv-8xtXNE-23HQ3r-79kxLp-9uu261-6JgUhP-62GZde-6HTovP-7xJsr-tXPfoF-6JkZB3-3aWJ47-6JkZtY-5fFxrT-5fKTRL-bzSKLU-RTQ8y-hGmu1-5fKTgm-5fFvFn-3D3gk9-769MNG rubyで書けるからと言って recipeを調子に乗って 自由に書きすぎた…
  17. 17. 17 https://www.flickr.com/photos/ro_buk/4207903199/in/photolist-7pQB2a-7oP9vq-8xbiHx-7Ajmwj-8zemoB-7ehuXP-94aHzE-93jvSN-5gCQp-nRdqb-7ESvZP-5eMSN-4izRk-gdCx68-7H5QhG-hm25eq-gdCArW-gdCvG6-99Q3YA-gdD9sZ-4iA9c-8uzbUL-7hWskX-24apZ- 6JCtXT-765WDT-7cpma4-765UzM-8wAnxv-8xtXNE-23HQ3r-79kxLp-9uu261-6JgUhP-62GZde-6HTovP-7xJsr-tXPfoF-6JkZB3-3aWJ47-6JkZtY-5fFxrT-5fKTRL-bzSKLU-RTQ8y-hGmu1-5fKTgm-5fFvFn-3D3gk9-769MNG rubyで書けるからと言って recipeを調子に乗って 自由に書きすぎた… チーム全体の学習コスト高い…
  18. 18. 18 そんなとき
  19. 19. 19 ansibleというのが流行ってるらしい 補足:当時はItamaeに気づいてませんでした
  20. 20. 20 これならチームでメンテできそう! まず使ってみよう!(そのまま導入)
  21. 21. 21 本題
  22. 22. 22 本日のゴール (主にChef利用経験のあるご自身が) ChefからAnsibleへ移行する 第一歩を踏み出せる気分になること https://www.flickr.com/photos/opopododo/2571337302/in/photolist-4VdLZL-7b3bhQ-e9gbB-rCxB4-74Qv6t-7qFu1J-djqaWe-7qFjRU-9qhzWG-4zQ58L-7TjN4c-xvKpv-8a6rY5-5Zgg2m-foXf8P-52o5Gc-7qgahb-46ZCmT-7z9gq6-29XcLr-gok6wW-d47M9o-7g3JQC-eWLKj-7FigNd-7GjPxg- 8KmWjQ-mFWxJV-9vvqNJ-5NpC4G-7reTfX-dkwWyU-iRpzkL-7fdVJk-dND4jW-exLA6M-fS1km-bdD5hM-qrK89n-7dCcE4-pVyBQ7-drMZqC-4y7cC7-pcvQqb-rEN56p-4WdiMB-pLTQeU-pLWNDL-7uPUoT-gtsSos
  23. 23. 23 本日の流れ • Ansibleとは(概要) • Ansibleの基本的な使い方 • Ansibleの応用的な使い方 https://www.flickr.com/photos/gsfc/13902795556/in/photolist-nbxsKE-barXrZ-azd68k-bxoSSp-egb7rB-mhaDLa-bRYwBH-8NGh4Z-4d2XZ-dkiRVQ-36ELQM-ftbvxr-8LeQta-6cfCfe-9iWrrE-dZUfSq-neTxeK-ntL9MW-gzYp8-efDEVP-5j2f4x-bdd9ea-kJrs1Z-dz6k4z-oWv5Tp-tvQXW7-nuM4RK-66Khgv-8CPZUQ-MRo3L-khBpLd-pugD9j-pjjMoj-7DQWhU- 5kMcmT-priEv3-ticgYH-9jt6GK-d2McUy-aXHTdn-nRaCfF-hsuYJX-naQgip-edLBtV-edScNj-edSefj-aaEDDi-9Kzoa-c5gQRN-dyhNrD
  24. 24. 24 本日の流れ • Ansibleとは(概要) • Ansibleの基本的な使い方 • Ansibleの応用的な使い方 https://www.flickr.com/photos/gsfc/13902795556/in/photolist-nbxsKE-barXrZ-azd68k-bxoSSp-egb7rB-mhaDLa-bRYwBH-8NGh4Z-4d2XZ-dkiRVQ-36ELQM-ftbvxr-8LeQta-6cfCfe-9iWrrE-dZUfSq-neTxeK-ntL9MW-gzYp8-efDEVP-5j2f4x-bdd9ea-kJrs1Z-dz6k4z-oWv5Tp-tvQXW7-nuM4RK-66Khgv-8CPZUQ-MRo3L-khBpLd-pugD9j-pjjMoj-7DQWhU- 5kMcmT-priEv3-ticgYH-9jt6GK-d2McUy-aXHTdn-nRaCfF-hsuYJX-naQgip-edLBtV-edScNj-edSefj-aaEDDi-9Kzoa-c5gQRN-dyhNrD
  25. 25. 25 一言で
  26. 26. 26 サーバ構築を 自動化するシンプルな 構成管理ツール(+α)
  27. 27. 27 Provisioning Toolchain
  28. 28. 28 Application Service Orchestration (デプロイ・ノード間連携など) System Configuration (OSやミドルの構成管理など) Bootstrapping (OSの初期インストールなど) Provisioning Tool Chain 引用元:Provisioning Toolchain by Lee Thompon (Velocity 2010)
  29. 29. 29 Application Service Orchestration (デプロイ・ノード間連携など) System Configuration (OSやミドルの構成管理など) Bootstrapping (OSの初期インストールなど) Provisioning Tool Chain 引用元:Provisioning Toolchain by Lee Thompon (Velocity 2010)
  30. 30. 30 Application Service Orchestration (デプロイ・ノード間連携など) System Configuration (OSやミドルの構成管理など) Bootstrapping (OSの初期インストールなど) Provisioning Tool Chain 引用元:Provisioning Toolchain by Lee Thompon (Velocity 2010)
  31. 31. 31 Application Service Orchestration (デプロイ・ノード間連携など) System Configuration (OSやミドルの構成管理など) Bootstrapping (OSの初期インストールなど) Provisioning Tool Chain 引用元:Provisioning Toolchain by Lee Thompon (Velocity 2010)
  32. 32. 32 Application Service Orchestration (デプロイ・ノード間連携など) System Configuration (OSやミドルの構成管理など) Bootstrapping (OSの初期インストールなど) Provisioning Tool Chain 引用元:Provisioning Toolchain by Lee Thompon (Velocity 2010)
  33. 33. 33 特徴
  34. 34. 34 引用 http://www.ansible.com/home
  35. 35. 35 引用 http://www.ansible.com/home 数時間で使える 人間(非rubyプログラマ) も読みやすい
  36. 36. 36 引用 http://www.ansible.com/home エージェント不要 SSH等があればOK 数時間で使える 人間(非rubyプログラマ) も読みやすい
  37. 37. 37 引用 http://www.ansible.com/home エージェント不要 SSH等があればOK 構成管理のみならず デプロイ・オーケストレーション そして冪等性も対応 数時間で使える 人間(非rubyプログラマ) も読みやすい
  38. 38. 38 比べてみる
  39. 39. 39 Ansible Chef エージェント エージェントレス エージェントとサーバ 接続プロトコル SSHなど SSHなど 記述方法 YAML Ruby 柔軟さ △ ○ シンプルさ ○ △ テンプレート形式 Jinja2 erb 共用 Ansible Galaxy Community Cookbook (参考)開発言語 Python Ruby Ansible と Chef の比較
  40. 40. 40 本日の流れ • Ansibleとは(概要) • Ansibleの基本的な使い方 • Ansibleの応用的な使い方 https://www.flickr.com/photos/gsfc/13902795556/in/photolist-nbxsKE-barXrZ-azd68k-bxoSSp-egb7rB-mhaDLa-bRYwBH-8NGh4Z-4d2XZ-dkiRVQ-36ELQM-ftbvxr-8LeQta-6cfCfe-9iWrrE-dZUfSq-neTxeK-ntL9MW-gzYp8-efDEVP-5j2f4x-bdd9ea-kJrs1Z-dz6k4z-oWv5Tp-tvQXW7-nuM4RK-66Khgv-8CPZUQ-MRo3L-khBpLd-pugD9j-pjjMoj-7DQWhU- 5kMcmT-priEv3-ticgYH-9jt6GK-d2McUy-aXHTdn-nRaCfF-hsuYJX-naQgip-edLBtV-edScNj-edSefj-aaEDDi-9Kzoa-c5gQRN-dyhNrD
  41. 41. 41 • インストール • 使ってみる • 実行対象ホストを決める • 対象ホストで任意の処理を実施 Ansibleの基本的な使い方
  42. 42. 42 インストール // RedHat系 (EPEL導入後) $ sudo yum install ansible // Ubuntu等 $ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible // Mac OS $ brew update $ brew install ansible Pythonがある前提
  43. 43. 43 設定ファイル inventory 実行対象を設定するファイル ini形式で記述
  44. 44. 44 設定ファイル inventory playbook 実行対象を設定するファイル ini形式で記述 task(実施する処理)を まとめて記述したファイル
  45. 45. 45 設定ファイル inventory playbook ansible.cfg 実行対象を設定するファイル ini形式で記述 task(実施する処理)を まとめて記述したファイル Ansible自体の設定ファイル // 今回は省略
  46. 46. 46 設定ファイル inventory playbook ansible.cfg 実行対象を設定するファイル ini形式で記述 task(実施する処理)を まとめて記述したファイル Ansible自体の設定ファイル // 今回は省略
  47. 47. 47 inventoryファイル mail.example.com [webservers] foo.example.com bar.example.com [dbservers] db[01:05].example.com
  48. 48. 48 inventoryファイル mail.example.com [webservers] foo.example.com bar.example.com [dbservers] db[01:05].example.com シングルのホスト (SSHで接続するホスト名)
  49. 49. 49 inventoryファイル mail.example.com [webservers] foo.example.com bar.example.com [dbservers] db[01:05].example.com シングルのホスト (SSHで接続するホスト名) グループ名 複数のホストを束ねており、 複数ホストに対してまとめて 処理を実行する場合に便利
  50. 50. 50 inventoryファイル mail.example.com [webservers] foo.example.com bar.example.com [dbservers] db[01:05].example.com シングルのホスト (SSHで接続するホスト名) グループ名 複数のホストを束ねており、 複数ホストに対してまとめて 処理を実行する場合に便利 簡略化した まとめ指定も可能
  51. 51. 51 続:inventoryファイル example.com ansible_ssh_port=5555 // その他の設定 ansible_ssh_host=192.168.1.50 ansible_ssh_user=hoge ansible_ssh_private_key_file=/foo/bar/XX sshのポート番号
  52. 52. 52 続:inventoryファイル example.com ansible_ssh_port=5555 // その他の設定 ansible_ssh_host=192.168.1.50 ansible_ssh_user=hoge ansible_ssh_private_key_file=/foo/bar/XX sshのポート番号 sshの接続先IP
  53. 53. 53 続:inventoryファイル example.com ansible_ssh_port=5555 // その他の設定 ansible_ssh_host=192.168.1.50 ansible_ssh_user=hoge ansible_ssh_private_key_file=/foo/bar/XX sshのポート番号 sshの接続先IP sshで接続するユーザ名
  54. 54. 54 続:inventoryファイル example.com ansible_ssh_port=5555 // その他の設定 ansible_ssh_host=192.168.1.50 ansible_ssh_user=hoge ansible_ssh_private_key_file=/foo/bar/XX sshのポート番号 sshの接続先IP sshで接続するユーザ名 sshで利用する秘密鍵 ファイル
  55. 55. 55 ホスト名: jtf (VitualBox上のVM) ローカル Macbook 使ってみる
  56. 56. 56 ホスト名: jtf (VitualBox上のVM) ローカル Macbook 使ってみる ansible jtf -i host.ini -m ping -i インベントリファイルホストを指定 モジュール (ホスト上で 実行される) $ cat host.ini jtf
  57. 57. 57 ansible jtf -i host.ini -a ‘uname -a’ ホスト名: jtf (VitualBox上のVM) ローカル Macbook 続:使ってみる ansible jtf -i host.ini –m setup chefでお馴染みの 「ohai」を内部で利用し ホスト情報を取得
  58. 58. 58 設定ファイル inventory playbook ansible.cfg 実行対象を設定するファイル ini形式で記述 task(実施する処理)を まとめて記述したファイル Ansible自体の設定ファイル // 今回は省略
  59. 59. 59 Playbook --- - hosts: jtf sudo: yes tasks: - apt: name=sl update_cache=yes 対象ホスト sudoで 以下のタスク群を実行 「誰に対して、どういう条件で、何を実行」をYAMLで記述
  60. 60. 60 Playbook --- - hosts: jtf sudo: yes tasks: - apt: name=sl update_cache=yes chefでいうResources AnsibleではModuleと呼ぶ 重要なので、後に高頻度で利用 するモジュールを紹介 「誰に対して、どういう条件で、何を実行」をYAMLで記述
  61. 61. 61 Playbook - vars --- - hosts: jtf vars: username: jtf_user tasks: - user: name={{ username }} 変数を渡したいとき
  62. 62. 62 Playbook - vars --- - hosts: jtf vars: username: jtf_user tasks: - user: name={{ username }} 変数を渡したいとき taskで使う変数を組みこむ
  63. 63. 63 Playbook - handler tasks: - apt: name=nginx notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted chefでいうNotificationアクション
  64. 64. 64 Playbook - handler tasks: - apt: name=nginx notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted chefでいうNotificationアクション
  65. 65. 65 Playbook - handler tasks: - apt: name=nginx notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted chefでいうNotificationアクション
  66. 66. 66 Playbook - handler tasks: - apt: name=nginx notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted chefでいうNotificationアクション #Chefだとこんな感じ package “nginx” do action :install notifies :reload, ‘service[nginx]’ end service “nginx” do :reload => true end
  67. 67. 67 Playbook - loop tasks: - apt: name={{ item }} with_items: - gcc - make - git chefだとruby構文で頑張っていたところ
  68. 68. 68 Playbook - loop tasks: - apt: name={{ item }} with_items: - gcc - make - git chefだとruby構文で頑張っていたところ #Chefだとこんな感じ %w{gcc make git}.each do |pkg| package pkg do action : install end end
  69. 69. 69 Playbook - when tasks: - apt: name=apache2 state=latest when: ansible_os_family == “Debian” - apt: name=httpd state=latest when: ansible_os_family == “RedHat” 条件分岐したい場合に利用、Chefだとif/unlessなど 補足:ansible_os_familyは、ansible実行時に 自動で収集・設定される変数
  70. 70. 70 Playbook - when tasks: - apt: name=apache2 state=latest when: ansible_os_family == “Debian” - apt: name=httpd state=latest when: ansible_os_family == “RedHat” 条件分岐したい場合に利用、Chefだとif/unlessなど Chefだと”package”で抽象化されていた。 Ansibleへ移行時は注意。
  71. 71. 71 よく使うモジュール
  72. 72. 72 file ファイル・ディレクトリの作成や変更 (Chefでいう file + directory + link) - file: path=/etc/foo.conf owner=foo group=foo mode=0644 - file: path=/etc/some_directory state=directory mode=0755
  73. 73. 73 copy ansibleを実行するホストから 対象のホストにファイルをコピーする Chefでいうcookbook_file - copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644
  74. 74. 74 template Chefのテンプレートと同様 変数を埋め込めるfileモジュール テンプレー卜はerbではなくjinja2 - template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644 erb: <%= hoge %> jinja2: {{ hoge }}
  75. 75. 75 script 対象ホストでスクリプトを実行する createsはchefのcreatesと一緒。 tasks: # 冪等性無し - script: my_command.sh # 冪等性有り - script: my_command.sh creates=/tmp/done.txt
  76. 76. 76 get_url URLからファイルをダウンロードする 既にファイルが存在していた場合は ダウンロードをスキップできる (Chefでいうremote_file) tasks: - name: download foo.conf get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440
  77. 77. 77 その他は本家ドキュメントを参照
  78. 78. 78 本日の流れ • Ansibleとは(概要) • Ansibleの基本的な使い方 • Ansibleの応用的な使い方
  79. 79. 79 ディレクトリ構成 Best Practice ・ Chefにはenvironmentがあるが、Ansibleにはない ・対応としては、ディレクトリ構成のベストプラクティスが 公開されているのでそれで吸収可能 production # inventory file for プロダクション staging # inventory file for ステージ group_vars/ group1 # グループごとの変数をまとめておく host_vars/ hostname1 # ホスト固有の値を設定する site.yml # 全ての起点のplaybook webservers.yml # playbook for webサーバ dbservers.yml # playbook for dbサーバ
  80. 80. 80 続:ディレクトリ構成 Best Practice ・ role単位で構築していくのが基本 ・以下の例は nginx の例 roles/ nginx/ # ロールごとに作成(Chefでいうクックブック単位) tasks/ # 実行したい処理 main.yml # nginxのインストール処理 handlers/ # main.yml # notifyで呼ばれるハンドラ templates/ nginx.conf.j2 # nginxのコンフィグファイル files/ bar.txt # 変数不要で配備したいファイル vars/ main.yml # このロールの変数を設定
  81. 81. 81 ChefでいうCommunity Cookbookに近い roleごとに必要なものをDL可
  82. 82. 82 Dynamic Inventry ・ 管理ホストが多くなると、Inventry管理が大変 ・特にクラウド上のホストは生成・破棄の繰り返し ・ Inventryには静的ファイルの他、スクリプト指定可能 // AWSを利用するためのキー情報 $ export AWS_ACCESS_KEY_ID=’xxxxxxxxx.......' $ export AWS_SECRET_ACCESS_KEY='yyyyy.......’ // 動的にホストを取得するスクリプト取得(公式が用意) $ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inven tory/ec2.py $ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inven tory/ec2.ini
  83. 83. 83 Dynamic Inventry ・ 管理ホストが多くなると、Inventry管理が大変 ・特にクラウド上のホストは生成・破棄の繰り返し ・ Inventryには静的ファイルの他、スクリプト指定可能 // AWSを利用するためのキー情報 $ export AWS_ACCESS_KEY_ID=’xxxxxxxxx.......' $ export AWS_SECRET_ACCESS_KEY='yyyyy.......’ // 動的にホストを取得するスクリプト取得(公式が用意) $ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inven tory/ec2.py $ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inven tory/ec2.ini 静的ファイルの代わりに スクリプト指定
  84. 84. 84 Ansibleでデプロイまでやってみる HTTP Request HTTP Request
  85. 85. 85 Ansibleでデプロイまでやってみる 仕込み ・ nginxからRailsアプリの指定はシンボリックリンク 例: /usr/local/app ・本当のアプリは、タイムスタンプ名のディレクトリへ 例: /usr/local/20150726-131500 シンボリックリンク
  86. 86. 86 Ansibleでデプロイまでやってみる 旧 新 条件: ・Nginxをリバースプロキシとして利用 ・Nginxの背後にはRailsアプリ ・旧/新の切り替えをなるべくBlue Greenに行いたい
  87. 87. 87 - name: デプロイ先のディレクトリをtimestampとするために、timestampを得る command: date '+%Y%m%d-%H%I%S' register: date_output - name: timestamp名のディレクトリのPATH名を作る command: echo "/usr/local/{{ date_output.stdout }}" register: release_path # name: release_pathのディレクトリを作成し、任意の方法でアプリ配備 - name: 最新版のPATHにシンボリックリンクを貼る file: src=”{{ release_path }}" dest="/usr/local/app” state=link デプロイまでするplaybook例 補足1:capistrano等の責務をansibleで対応するイメージ。 ロールバックなども書けば対応可能。 補足2: 上記は説明用で完全なコードで無い点に注意
  88. 88. 88 インフラTDDしたい! ・ホワイトボックスアプローチ ⇒ ・ブラックボックスアプローチ ⇒ Infratester等 1. Ansible 2. Serverspec / Infratester
  89. 89. 89 インフラTDDしたい! ・ホワイトボックスアプローチ ⇒ ・ブラックボックスアプローチ ⇒ Infratester等 describe package(‘httpd’) it { should be_installed } end describe port(80) do it { should be_listening } end
  90. 90. 90 インフラTDDしたい! ・ホワイトボックスアプローチ ⇒ ・ブラックボックスアプローチ ⇒ Infratester等 describe server(:app) do describe http('http://app') do It "responds content including 'This is app server'" do expect(response.body).to include(‘This is app server’) end it "responds OK 200" do expect(response.status).to eq(200) end end end
  91. 91. 91 まとめ • Ansibleとは(概要) • Ansibleの基本的な使い方 • Ansibleの応用的な使い方
  92. 92. 92 本日のゴール (主にChef利用経験のあるご自身が) ChefからAnsibleへ移行する 第一歩を踏み出せる気分になること https://www.flickr.com/photos/opopododo/2571337302/in/photolist-4VdLZL-7b3bhQ-e9gbB-rCxB4-74Qv6t-7qFu1J-djqaWe-7qFjRU-9qhzWG-4zQ58L-7TjN4c-xvKpv-8a6rY5-5Zgg2m-foXf8P-52o5Gc-7qgahb-46ZCmT-7z9gq6-29XcLr-gok6wW-d47M9o-7g3JQC-eWLKj-7FigNd-7GjPxg- 8KmWjQ-mFWxJV-9vvqNJ-5NpC4G-7reTfX-dkwWyU-iRpzkL-7fdVJk-dND4jW-exLA6M-fS1km-bdD5hM-qrK89n-7dCcE4-pVyBQ7-drMZqC-4y7cC7-pcvQqb-rEN56p-4WdiMB-pLTQeU-pLWNDL-7uPUoT-gtsSos おしまい

×