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

92
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

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

Chef から Ansible へ引っ越したい

人のための Ansible 入門

July Tech Festa 2015/7/26@iwashi86 / Yoshimasa Iwase

1https://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

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-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

ある理由で移行

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

自身の例で、振り返ってみてください

前提VM 上のインフラ・ミドル構築をする

これまで構成管理ツールの利用経験無し

9

発見 導入 運用

新技術を導入時の工程

10

Chef 凄いらしいぞ!

発見 導入 運用

11

発見 導入 運用

(1 冊程度勉強して )

導入も OK !

12

半年後

13

ん?

発見 導入 運用

14https://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

おまけに・・・

16https://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 を調子に乗って自由に書きすぎた…

17https://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

そんなとき

19

ansible というのが流行ってるらしい

補足:当時は Itamae に気づいてませんでした

20

これならチームでメンテできそう!

まず使ってみよう!(そのまま導入)

21

本題

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

本日の流れ

• 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

本日の流れ

• 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

一言で

26

サーバ構築を自動化するシンプル

な構成管理ツール ( +

α)

27

ProvisioningToolchain

28

Application Service Orchestration(デプロイ・ノード間連携な

ど)System Configuration

( OS やミドルの構成管理など)

Bootstrapping ( OS の初期インストールな

ど)

Provisioning Tool Chain

引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)

29

Application Service Orchestration(デプロイ・ノード間連携な

ど)System Configuration

( OS やミドルの構成管理など)

Bootstrapping ( OS の初期インストールな

ど)

Provisioning Tool Chain

引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)

30

Application Service Orchestration(デプロイ・ノード間連携な

ど)System Configuration

( OS やミドルの構成管理など)

Bootstrapping ( OS の初期インストールな

ど)

Provisioning Tool Chain

引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)

31

Application Service Orchestration(デプロイ・ノード間連携な

ど)System Configuration

( OS やミドルの構成管理など)

Bootstrapping ( OS の初期インストールな

ど)

Provisioning Tool Chain

引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)

32

Application Service Orchestration(デプロイ・ノード間連携な

ど)System Configuration

( OS やミドルの構成管理など)

Bootstrapping ( OS の初期インストールな

ど)

Provisioning Tool Chain

引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)

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

共用 Ansible Galaxy Community Cookbook

(参考)開発言語

Python Ruby

Ansible と Chef の比較

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

• インストール

• 使ってみる• 実行対象ホストを決める• 対象ホストで任意の処理を実施

Ansible の基本的な使い方

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

設定ファイル

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.combar.example.com

[dbservers]db[01:05].example.com

48

inventory ファイルmail.example.com

[webservers]foo.example.combar.example.com

[dbservers]db[01:05].example.com

シングルのホスト(SSH で接続するホスト名 )

49

inventory ファイルmail.example.com

[webservers]foo.example.combar.example.com

[dbservers]db[01:05].example.com

シングルのホスト(SSH で接続するホスト名 )

グループ名複数のホストを束ねており、

複数ホストに対してまとめて

処理を実行する場合に便利

50

inventory ファイルmail.example.com

[webservers]foo.example.combar.example.com

[dbservers]db[01:05].example.com

シングルのホスト(SSH で接続するホスト名 )

グループ名複数のホストを束ねており、

複数ホストに対してまとめて

処理を実行する場合に便利

簡略化したまとめ指定も可能

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

続: 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

続: 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

続: 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

ホスト名 : jtf(VitualBox 上の

VM)

ローカルMacbook

使ってみる

56

ホスト名 : jtf(VitualBox 上の

VM)

ローカルMacbook

使ってみる

ansible jtf -i host.ini -m ping

-i インベントリファイル

ホストを指定 モジュール

( ホスト上で実行される )

$ cat host.inijtf

57

ansible jtf -i host.ini -a ‘uname -a’

ホスト名 : jtf(VitualBox 上の

VM)

ローカルMacbook

続:使ってみる

ansible jtf -i host.ini –m setup

chef でお馴染みの「 ohai 」を内部で利用

しホスト情報を取得

58

設定ファイル

inventory

playbook

ansible.cfg

実行対象を設定するファイルini 形式で記述task( 実施する処理 ) をまとめて記述したファイル

Ansible 自体の設定ファイル// 今回は省略

59

Playbook

---- hosts: jtf sudo: yes tasks: - apt: name=sl update_cache=yes

対象ホスト

sudo で

以下のタスク群を実行

「誰に対して、どういう条件で、何を実行」を YAMLで記述

60

Playbook

---- hosts: jtf sudo: yes tasks: - apt: name=sl update_cache=yes

chef でいう ResourcesAnsible では Module と呼ぶ

重要なので、後に高頻度で利用するモジュールを紹介

「誰に対して、どういう条件で、何を実行」を YAMLで記述

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 nginxhandlers: - name: restart nginx service: name=nginx state=restarted

chef でいう Notification アクション

64

Playbook - handler

tasks: - apt: name=nginx notify: restart nginxhandlers: - name: restart nginx service: name=nginx state=restarted

chef でいう Notification アクション

65

Playbook - handler

tasks: - apt: name=nginx notify: restart nginxhandlers: - name: restart nginx service: name=nginx state=restarted

chef でいう Notification アクション

66

Playbook - handler

tasks: - apt: name=nginx notify: restart nginxhandlers: - 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 => trueend

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 make git}.each do |pkg| package pkg do action : install endend

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

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

よく使うモジュール

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

copyansible を実行するホストから

対象のホストにファイルをコピーするChef でいう cookbook_file

- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644

74

templateChef のテンプレートと同様

変数を埋め込める file モジュールテンプレー卜は erb ではなく jinja2

- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644

erb: <%= hoge %>jinja2: {{ hoge }}

75

script対象ホストでスクリプトを実行する

creates は chef の creates と一緒。tasks:# 冪等性無し- script: my_command.sh

# 冪等性有り- script: my_command.sh creates=/tmp/done.txt

76

get_urlURLからファイルをダウンロードする既にファイルが存在していた場合はダウンロードをスキップできる

(Chef でいう remote_file)

tasks:- name: download foo.conf get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440

77

その他は本家ドキュメントを参照

78

本日の流れ

• Ansible とは(概要)• Ansible の基本的な使い

方• Ansible の応用的な使い

79

ディレクトリ構成 Best Practice・ Chef には environment があるが、 Ansible にはない・対応としては、ディレクトリ構成のベストプラクティスが 公開されているのでそれで吸収可能production # inventory file for プロダクション

staging # inventory file for ステージ

group_vars/ group1 # グループごとの変数をまとめておくhost_vars/ hostname1 # ホスト固有の値を設定する

site.yml # 全ての起点の playbookwebservers.yml # playbook for web サーバdbservers.yml # playbook for db サーバ

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

Chef でいう Community Cookbook に近い

role ごとに必要なものを DL 可

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/inventory/ec2.py$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini

// 実行$ ansible all -i ec2.py -m ping

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/inventory/ec2.py$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini

// 実行$ ansible all -i ec2.py -m ping

静的ファイルの代わりにスクリプト指定

84

Ansible でデプロイまでやってみる

HTTP Request HTTP Request

85

Ansible でデプロイまでやってみる仕込み ・ nginxから Rails アプリの指定はシンボリックリンク 例: /usr/local/app ・本当のアプリは、タイムスタンプ名のディレクトリへ  例: /usr/local/20150726-131500

シンボリックリンク

86

Ansible でデプロイまでやってみる

条件: ・ Nginx をリバースプロキシとして利用 ・ Nginx の背後には Rails アプリ ・旧 /新の切り替えをなるべく Blue Green に行いたい

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

インフラ TDD したい!・ホワイトボックスアプローチ ⇒ ・ブラックボックスアプローチ ⇒ Infratester 等

1. Ansible2. Serverspec / Infratester

89

インフラ TDD したい!・ホワイトボックスアプローチ ⇒ ・ブラックボックスアプローチ ⇒ Infratester 等

describe package(‘httpd’)   it { should be_installed }end

describe port(80) do   it { should be_listening }end

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  endend

91

まとめ

• Ansible とは(概要)• Ansible の基本的な使い

方• Ansible の応用的な使い

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

おしまい