64
自動化編 1 openstack Open source software to build public and private clouds. OpenStackとAnsibleによる IaaS基盤運用の自動化 20140730 Hideki Saito TwitterID: @saito_hideki Internet Initiative Japan Inc.

沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Embed Size (px)

Citation preview

Page 1: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

自動化編

1

openstackOpen  source  software  to  build  public  and  private  clouds.

OpenStackとAnsibleによるIaaS基盤運用の自動化

2014-­07-­30Hideki  Saito

TwitterID:  @saito_hidekiInternet  Initiative  Japan  Inc.

Page 2: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

目次

•  はじめにü  ITインフラ構築・運用管理の自動化

•  ハンズオンü  本セッションで利用するシステム構成ü  IaaS基盤を管理するü  システム構築を自動化する

2

Page 3: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

はじめに

3

Page 4: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

•  自動化の目的ü  日々繰り返される単純作業からエンジニアを解放するü  作業ミスを未然に防ぎ品質を安定させる

•  自動化の変遷

•  クラウド/自動化/構成管理ツールü  OpenStack/CloudStack/Eucalyptus  などü  Ansible,  Chef,  Puppet  など

ITインフラ構築・運用管理の自動化①

手順書と引き継ぎ手順書のスクリプト化  と自動実行

構成管理ツールの登場  

4

Page 5: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

ITインフラ構築・運用管理の自動化②

•  本セッションのテーマOpenStackとAnsibleを利用して、インフラエンジニアの日常業務である、クラウド基盤上の仮想リソース管理作業を可能な限り自動化する。

5

構築業務

サーバ設計・構築

ネットワーク設計・構築

ファシリティ設計

運用管理システムの設計・開発

運用業務

システム全体の運用管理

資産管理

Page 6: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

ITインフラ構築・運用管理の自動化③

ITインフラエンジニアの典型的な業務は、このような感じでしょうか。

•  ネットワーク機器を設定するp  ポートを設定するp  サーバのNICを物理的に接続するp  wikiなどでドキュメントを更新する

•  サーバを構築するp  OSをインストールするp  リモートログイン可能な状態にするp  追加パッケージのインストールや設定等の基本構築を行うp  ミドルウェアのインストール&設定を行うp  サービスに投入するp  wikiなどのドキュメントを更新する

以降の章では、このような日常業務を省力化する方法を考えてみます。

6

Page 7: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

ハンズオン

7

Page 8: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

現在のシステム構成

本セッションで利用するシステム構成

8

<userID>-­router

Router

step-­server

Instance

OpenStackや仮想マシンに対する操作はstep-­server上から行います

Ext-­Net

<UserID

>-­netw

ork

10.0.0.0/24

10.0.0.1

10.0.0.N

Page 9: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する

9

•  OpenStackを管理するOpenStackのクラウド基盤を操作するには、3つの方法があります。

以降の章ではOpenStackが提供するCLIを利用した操作を体験し、その後APIを利用した外部プログラム(Ansible)によるOpenStackの操作を体験してみましょう。

• Horizonが提供するDashboard• OpenStackの主要な機能のみを提供するWebUI

• 各コンポーネントが提供するコマンドラインインターフェイス• 管理者用コマンド• 一般利用者用コマンド

CLI

• RESTful  APIでOpenStackの全ての機能を利用可能• Pythonのライブラリとしても提供されるAPI

Page 10: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  CLIによる操作①

OpenStackの各コンポーネントが提供するCLIを利用して、以下の流れで仮想リソースを作成してみましょう。

CLIのコマンド名は、それぞれのnovaコマンドやglanceコマンドなど、コンポーネント名となっているのが通例です。

10

4.  仮想マシンにフローティングIPを付与してInternetに接続する

3.  仮想マシンを作成する

2.  Internet接続用にフローティングIPを払い出す

1.事前準備

Page 11: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  CLIによる操作②事前準備

●  step-­serverにsshログインして作成済みの環境変数定義ファイル(openrc)を反映させます#  cd  $HOME#  source  openrc

●  作成する仮想マシンへのsshログインに使用するキーペアを作成します#  ssh-­keygen  -­t  rsa  -­b  2048Generating  public/private  rsa  key  pair.Enter  file  in  which  to  save  the  key  (/root/.ssh/id_rsa):Enter  passphrase  (empty  for  no  passphrase):  ********Enter  same  passphrase  again:  ********Your  identification  has  been  saved  in  /root/.ssh/id_rsa.Your  public  key  has  been  saved  in  /root/.ssh/id_rsa.pub.The  key  fingerprint  is:ba:18:ab:cf:31:43:4f:26:52:6c:87:9e:61:0f:84:29  root@step-­serverThe  key's  randomart  image  is:

●  novaコマンドで公開鍵をOpenStackに登録します#  nova  keypair-­add  key-­for-­app-­server  -­-­pub-­key  .ssh/id_rsa.pub#  nova  keypair-­list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  Name                              |  Fingerprint                                                                          |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  key-­for-­app-­server  |  ba:18:ab:cf:31:43:4f:26:52:6c:87:9e:61:0f:84:29  ||  key-­for-­step-­server|  bc:a7:7e:ec:59:55:3a:12:20:7a:9b:cc:1f:a6:47:ed  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

11

Page 12: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  CLIによる操作③事前準備

●  サンプルアプリケーションのサービス提供用にセキュリティグループを作成します#  nova  secgroup-­create  security-­for-­app-­server  "サンプルアプリケーションサービス用グループ"+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  Id                                                                      |  Name                                        |  Description                                                                |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  0e7d74ce-­593d-­4524-­980c-­83e06e6e3a69  |  security-­for-­app-­server  |  サンプルアプリケーションサービス用グループ  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

●  作成したセキュリティグループ(security-­for-­app-­server)に許可ルールを追加します#  nova  secgroup-­add-­rule  security-­for-­app-­server  tcp  22  22  0.0.0.0/0+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  IP  Protocol  |  From  Port  |  To  Port  |  IP  Range    |  Source  Group  |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  tcp                  |  22                |  22            |  0.0.0.0/0  |                            |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

#  nova  secgroup-­add-­rule  security-­for-­app-­server  tcp  80  80  0.0.0.0/0+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  IP  Protocol  |  From  Port  |  To  Port  |  IP  Range    |  Source  Group  |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  tcp                  |  80                |  80            |  0.0.0.0/0  |                            |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

#  nova  secgroup-­add-­rule  security-­for-­app-­server  icmp  -­1  -­1  0.0.0.0/0+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  IP  Protocol  |  From  Port  |  To  Port  |  IP  Range    |  Source  Group  |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  icmp                |  -­1                |  -­1            |  0.0.0.0/0  |                            |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

12

Page 13: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  CLIによる操作④事前準備

●  セキュリティグループ(security-­for-­app-­server)が作成されていることを確認します#  nova  secgroup-­list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  Id                                                                      |  Name                                          |  Description                                                            |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  1ea8746f-­d453-­42e4-­9dd5-­b82711a3710f  |  default                                    |  default                                                                    ||  0e7d74ce-­593d-­4524-­980c-­83e06e6e3a69  |  security-­for-­app-­server    |  サンプルアプリケーションサーバ用グループ  ||  40c83343-­9409-­402c-­ae89-­f6026a725193  |  security-­for-­step-­server  |  踏み台サーバ用のSSHを許可するグループ        |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

●  security-­for-­app-­serverに許可ルールが追加されていることを確認します#  nova  secgroup-­list-­rules  security-­for-­app-­server+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  IP  Protocol  |  From  Port  |  To  Port  |  IP  Range    |  Source  Group  |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  tcp                  |  22                |  22            |  0.0.0.0/0  |                            ||  tcp                  |  80                |  80            |  0.0.0.0/0  |                            ||  icmp                |  -­1                |  -­1            |  0.0.0.0/0  |                            |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

13

Page 14: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  CLIによる操作⑤事前準備

●  仮想マシンのリストを取得してみます#  nova  list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  ID                                                                      |  Name                |  Status  |  Task  State  |  Power  State  |  Networks                                                                |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  812c40ec-­538f-­4efe-­8511-­eab531d99807  |  step-­server  |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.3,  15.125.118.53  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

●  先ほど登録した公開鍵を確認してみます#  nova  keypair-­list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  Name                                |  Fingerprint                                                                          |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  key-­for-­app-­server    |  ba:18:ab:cf:31:43:4f:26:52:6c:87:9e:61:0f:84:29  ||  key-­for-­step-­server  |  bc:a7:7e:ec:59:55:3a:12:20:7a:9b:cc:1f:a6:47:ed  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

●  仮想マシンの品目であるフレーバのリストを取得してみます#  nova  flavor-­list+-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­+-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+|  ID    |  Name                          |  Memory_MB  |  Disk  |  Ephemeral  |  Swap  |  VCPUs  |  RXTX_Factor  |  Is_Public  |+-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­+-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+|  100  |  standard.xsmall    |  1024            |  10      |  10                |            |  1          |  1.0                  |  N/A              ||  101  |  standard.small      |  2048            |  30      |  10                |            |  2          |  1.0                  |  N/A              ||  102  |  standard.medium    |  4096            |  30      |  50                |            |  2          |  1.0                  |  N/A              ||  103  |  standard.large      |  8192            |  30      |  130              |            |  4          |  1.0                  |  N/A              ||  104  |  standard.xlarge    |  15360          |  30      |  270              |            |  4          |  1.0                  |  N/A              ||  105  |  standard.2xlarge  |  30720          |  30      |  470              |            |  8          |  1.0                  |  N/A              ||  110  |  standard.4xlarge  |  61440          |  30      |  870              |            |  12        |  1.0                  |  N/A              ||  114  |  standard.8xlarge  |  122880        |  30      |  1770            |            |  16        |  1.0                  |  N/A              ||  203  |  highmem.large        |  16384          |  30      |  130              |            |  4          |  1.0                  |  N/A              ||  204  |  highmem.xlarge      |  30720          |  30      |  270              |            |  4          |  1.0                  |  N/A              ||  205  |  highmem.2xlarge    |  61440          |  30      |  540              |            |  8          |  1.0                  |  N/A              |+-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­+-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+

14

Page 15: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  CLIによる操作⑥事前準備

●  GuestOSのイメージリストを取得してみます#  nova  image-­list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  ID                                                                      |  Name                                                                                                                                                              |  Status  |  Server                                                              |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  d782c03d-­9666-­4639-­a62f-­53b376880120  |  ActiveState  Stackato  v3.2.1                                                                                                                |  ACTIVE  |  255c22fe-­ebf3-­401d-­951a-­114b9bbb27d1  ||  0c8a7e05-­7c50-­52eb-­9c13-­2a9135a9890c  |  ActiveState  Stackato-­v3.0.1  -­  Partner  Image                                                                                |  ACTIVE  |                                                                            ||  32b40af5-­7a66-­47e0-­894f-­51c5883ea3f5  |  BLU  AGE  Modernization  Cobol2SpringMVC                                                                                            |  ACTIVE  |                                                                            ||  1f0e2be0-­c2c3-­480b-­a81b-­996b49c8cd09  |  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  50f28bce-­c8e7-­4174-­9554-­37cb319a4168  |  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  85de2abd-­83fe-­50e1-­9de5-­d3a3af216d2a  |  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  892c7ae6-­cdd0-­4d98-­8f55-­6204ea302c29  |  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  8b91d309-­bbef-­4ab7-­bc1d-­169af05a3716  |  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  aef1d2e9-­fc2b-­4bcc-­924b-­ffbd1404c0ec  |  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  bc1d8d02-­64f6-­4bf9-­b3e8-­c3cba6a71801  |  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  c5cfa114-­5f33-­4784-­a666-­83e9b7706933  |  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  dc055245-­4689-­468a-­81a4-­fb7c2b0e9331  |  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  9019a56e-­2986-­58ea-­a294-­59e7c2deeddc  |  CentOS  5.6  Server  64-­bit  20111207  (Ramdisk)  (deprecated)                                                      |  ACTIVE  |                                                                            ||  f8c11f9a-­436f-­4d65-­ac4f-­8638984c5f25  |  CentOS  5.8  Server  64-­bit  20120828  (b)                                                                                            |  ACTIVE  |                                                                            ||  8a1a6f25-­dff4-­532f-­b669-­2a7fe9304a25  |  CentOS  6.2  Server  64-­bit  20120125  (Kernel)  (deprecated)                                                        |  ACTIVE  |                                                                            ||  c08e69f9-­ce9d-­587c-­aec7-­2b4919e79757  |  CentOS  6.2  Server  64-­bit  20120125  (Ramdisk)  (deprecated)                                                      |  ACTIVE  |                                                                            ||  202e7659-­f7c6-­444a-­8b32-­872fe2ed080c  |  CentOS  6.3  Server  64-­bit  20130116                                                                                                    |  ACTIVE  |                                                                            |

<...>

|  ae250c63-­3e46-­5db4-­be29-­2df7248aaab7  |  Windows  Server  2008  Enterprise  SP2  x64  Volume  License  20121031  (b)  (deprecated)        |  ACTIVE  |                                                                            ||  84e9fd6e-­b5a4-­481b-­8d57-­2323ae5eb430  |  Windows  Server  2008  Enterprise  SP2  x64  Volume  License  20131017  (b)  (deprecated)        |  ACTIVE  |                                                                            ||  1294610e-­fdc4-­579b-­829b-­d0c9f5c0a612  |  Windows  Server  2008  Enterprise  SP2  x64  Volume  License  20140415  (b)                                  |  ACTIVE  |                                                                            ||  7ab537bf-­a274-­4eb8-­80f1-­8e4264f0e32f  |  Windows  Server  2008  Enterprise  SP2  x86  Volume  License  20131017  (b)  (deprecated)        |  ACTIVE  |                                                                            ||  8a398ff7-­f4f7-­5beb-­bab0-­300c47345080  |  Windows  Server  2008  Enterprise  SP2  x86  Volume  License  20140415  (b)                                  |  ACTIVE  |                                                                            ||  6a6790b6-­31d6-­4fe4-­b26f-­8950cb98725c  |  Windows  Server  2008  R2  Enterprise  SP1  x64  Volume  License  20130925  (b)  (deprecated)  |  ACTIVE  |                                                                            ||  e08ecab2-­4acd-­540d-­b16a-­60284769aceb  |  Windows  Server  2008  R2  Enterprise  SP1  x64  Volume  License  20140415  (b)                            |  ACTIVE  |                                                                            ||  18a78e14-­0f4f-­4af8-­85fd-­245ea407d3a0  |  desktopsites  Konect  Elite  Version  8.6.2.100  (20140211)                                                          |  ACTIVE  |                                                                            |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

●仮想マシンを接続するネットワークリストを取得してみます#  neutron  net-­list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  id                                                                      |  name                        |  subnets                                                                                    |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  5afad8aa-­b0e1-­479e-­af24-­b328d1a9f287  |  h-­saito-­network  |  103522e1-­421f-­4db8-­b47a-­9716c908d70c  10.0.0.0/24  ||  7da74520-­9d5e-­427b-­a508-­213c84e69616  |  Ext-­Net                  |  ef3bde66-­8ac4-­4356-­8ab4-­099519ba218a                          |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

15

Page 16: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  CLIによる操作⑦Internet接続用にフローティングIPを払い出す

●  Internet接続用にフローティングIPを払い出します#  nova  floating-­ip-­create+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+|  Ip                        |  Server  Id  |  Fixed  Ip  |  Pool        |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+|  15.125.74.215  |                      |  -­                |  Ext-­Net  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+

●  フローティングIPリストを取得してみます#  nova  floating-­ip-­list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+|  Ip                        |  Server  Id  |  Fixed  Ip  |  Pool        |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+|  15.125.74.215  |                      |  -­                |  Ext-­Net  ||  15.125.118.53  |                      |  10.0.0.3  |  Ext-­Net  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+

16

Page 17: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  CLIによる操作⑧仮想マシンを作成する

●  仮想マシン(app-­server)を作成して起動します#  nova  boot  app-­server  -­-­flavor  101  -­-­image  "CentOS  6.3  Server  64-­bit  20130116"  \-­-­key-­name  key-­for-­app-­server  -­-­security-­groups  security-­for-­app-­server  \-­-­nic  net-­id=5afad8aa-­b0e1-­479e-­af24-­b328d1a9f287+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  Property                                        |  Value                                                                                                                                        |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  OS-­EXT-­AZ:availability_zone  |  nova                                                                                                                                          ||  OS-­EXT-­STS:power_state            |  0                                                                                                                                                ||  OS-­EXT-­STS:task_state              |  scheduling                                                                                                                              ||  OS-­EXT-­STS:vm_state                  |  building                                                                                                                                  ||  accessIPv4                                    |                                                                                                                                                    ||  accessIPv6                                    |                                                                                                                                                    ||  adminPass                                      |  H2KGMy8ohH83                                                                                                                          ||  config_drive                                |                                                                                                                                                    ||  created                                          |  2014-­07-­23T04:53:22Z                                                                                                          ||  flavor                                            |  standard.small  (101)                                                                                                          ||  hostId                                            |                                                                                                                                                    ||  id                                                    |  ed98ec64-­6884-­4c7f-­b462-­8e375efd7148                                                                          ||  image                                              |  CentOS  6.3  Server  64-­bit  20130116  (202e7659-­f7c6-­444a-­8b32-­872fe2ed080c)  ||  key_name                                        |  key-­for-­app-­server                                                                                                              ||  metadata                                        |  {}                                                                                                                                              ||  name                                                |  app-­server                                                                                                                              ||  progress                                        |  0                                                                                                                                                ||  security_groups                          |  security-­for-­app-­server                                                                                                    ||  status                                            |  BUILD                                                                                                                                        ||  tenant_id                                      |  10012734753930                                                                                                                      ||  updated                                          |  2014-­07-­23T04:53:22Z                                                                                                          ||  user_id                                          |  10035956719298                                                                                                                      |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

17

Page 18: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  CLIによる操作⑨仮想マシンにフローティングIPを付与してInternetに接続する

●  app-­serverが作成されたことを確認します#  nova  list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  ID                                                                      |  Name                |  Status  |  Task  State  |  Power  State  |  Networks                                                                |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  ed98ec64-­6884-­4c7f-­b462-­8e375efd7148  |  app-­server    |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.39                              ||  812c40ec-­538f-­4efe-­8511-­eab531d99807  |  step-­server  |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.3,  15.125.118.53  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

●  割り当てるフローティングIPを確認します#  nova  floating-­ip-­list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+|  Ip                        |  Server  Id  |  Fixed  Ip  |  Pool        |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+|  15.125.74.215  |                      |  -­                |  Ext-­Net  ||  15.125.118.53  |                      |  10.0.0.3  |  Ext-­Net  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+

●  app-­serverにフローティングIPを割り当てます#  nova  floating-­ip-­associate  -­-­fixed-­address=10.0.0.39  app-­server  15.125.74.215

●  割り当てたフローティングIPに対してstep-­serverからsshログインできることを確認します#  ssh  [email protected][root@app-­server  ~˜]#  hostnameapp-­server

18

Page 19: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

現在のシステム構成

IaaS基盤を管理する  〜~  CLIによる操作⑩

19

<userID>-­router

Router

step-­server

Instance

Ext-­Net

<UserID

>-­netw

ork

10.0.0.0/24

10.0.0.1

10.0.0.N

app-­server

Instance

10.0.0.N

app-­serverを新たに作成しました

Page 20: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

まとめ

ここまでの作業をまとめます

ü  CLIを利用してIaaS基盤上に仮想マシンを作成しました

ü  OpenStackのCLIで利用するクライアントコマンドは各コンポーネントが提供します

ü  OpenStackのCLIは各コンポーネント(novaやneutronなど)が提供するAPI経由でコンポーネントにリクエストを投げることにより基盤の操作を行います

ü  コマンドを利用するためには認証に必要な情報を特定の環境変数として設定するか、コマンドライン引数として渡してやる必要があります

ü  Dashboard(WebUI)からは、OpenStackの機能をフル活用することはできず、CLIでのオペレーションが必要となる場合があります

20

Page 21: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

システム構築を自動化する

21

Page 22: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Ansibleについて①

Ansibleの特徴AnsibleはPythonで書かれた*作業*だけなく*仕事*を自動化するためのツールで、OpenStackと組み合わせることにより、OS・ミドルウェア・アプリケーションのインストール・設定作業を自動化することが可能です。

ü  作業の一連の流れを1つにまとめるPlaybookを持つü  多数の外部モジュールが標準・オプションで提供されているü  必要な機能を提供するモジュールは自身で開発することが可能ü  作業の冪等性が担保されているü  push型でエージェントレスであるü  動作に必要な要件が少ない

Ø  SSHログイン可能Ø  Python実行環境(2.4以降)といくつかのライブラリが存在する

22

Page 23: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

• ファイルの転送、サービスの起動停止などAnsibleに行わせる作業がモジュールとして提供されているmodule

• Ansibleに行わせる一連の作業の流れをまとめたもの• Chefではrecipe、PuppetではmanifestにあたるPlaybook

• 実行結果にり実行されるcallbackモジュール群• 動的にターゲットホストをグルーピングするDynamic  Inventoryプログラム

Plugin

• 操作対象ノードに関する情報を記録しているファイル• PluginのDynamic  Inventoryプログラムを利用して動的生成することも可能

Inventory

Ansibleについて②

Ansibleの主な構成要素Ansibleは大きく以下の要素から構成されています。次章ではAnsibleを実際に利用しつつ、その仕組を解説します。

23

Page 24: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Ansibleについて③●  step-­serverにsshログインします以降の作業は全てstep-­server上から実施します

●  step-­serverのrootユーザの.ssh/authorized_keysに自身の公開鍵を登録しておきます#  cat  ~˜/.ssh/id_rsa.pub  >>  ~˜/.ssh/authorized_keys

●  テキストエディタでinventoryファイルを作成しますAnsibleの挙動についてはP27で解説します

#  nano  $HOME/inventory

〜~inventoryファイルの内容ここから〜~[localhost]127.0.0.1

[localhost:vars]ansible_ssh_user=rootansible_ssh_pass=<パスフレーズ>

[app-­server]15.125.118.53

[app-­server:vars]ansible_ssh_user=rootansible_ssh_pass=<パスフレーズ>

〜~inventoryファイルの内容ここまで〜~

24

[グループ名]と前章で作成したapp-­serverに割り当てたフローティングIPを書いてください※step-­serverから到達可能なIPアドレスであればプライベートIP(fixed_ip)でもかまいません

sshログインするためのユーザIDと鍵のパスフレーズを書いてください

sshログインするためのユーザIDと鍵のパスフレーズを書いてください

Page 25: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Ansibleについて④●  known_hostsのチェックを無効化しておきます#  export  ANSIBLE_HOST_KEY_CHECKING=False

●  pingモジュールを使用してstep-­serverのAnsibleから管理対象サーバへの接続性を確認します[書式]  ansible  -­i  <インベントリファイル>  -­m  <モジュール名>  <ホストグループ名  or  ホスト名>#  ansible  -­i  inventory  -­m  ping  localhost127.0.0.1  |  success  >>  {        "changed":  false,        "ping":  "pong"}

#  ansible  -­i  inventory  -­m  ping  app-­server15.125.74.215  |  success  >>  {        "changed":  false,        "ping":  "pong"}

#  ansible  -­i  inventory  -­m  ping  all15.125.74.215  |  success  >>  {        "changed":  false,        "ping":  "pong"}

127.0.0.1  |  success  >>  {        "changed":  false,        "ping":  "pong"}

25

inventoryファイルの[グループ名]を指定します

[グループ名]にallを指定すると全てのinventoryのエントリに対してpingモジュールが実行されます

"ping"に対して"pong"が返ってきていれば接続に成功しています

Page 26: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Ansibleについて⑤●  setupモジュールを使用してapp-­serverの情報を取得してみます#  ansible  -­i  inventory  -­m  setup  app-­server15.125.74.215  |  success  >>  {        "ansible_facts":  {                "ansible_all_ipv4_addresses":  [                        "10.0.0.39"                ],                "ansible_all_ipv6_addresses":  [                        "fe80::f816:3eff:feab:3799"                ],

               "ansible_architecture":  "x86_64",                "ansible_bios_date":  "01/01/2011",                "ansible_bios_version":  "Bochs",<...>"ansible_distribution":  "CentOS",                "ansible_distribution_major_version":  "6",                "ansible_distribution_release":  "Final",                "ansible_distribution_version":  "6.3",

               "ansible_domain":  "",<...>

 "changed":  false}

26

取得した情報は、Ansibleで再利用することが可能です

Page 27: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Ansibleについて⑥

Ansibleの挙動以下にAnsibleの動きを図示します

27

Ansible

実行可能ファイル

実行可能ファイル

pingモジュール

setupモジュール

Inventoryファイル

sshd1

2

3

指定されたモジュールをインポートするターゲットノードにsftp/scpで実行可能ファイルを転送してssh経由でログインし実行する

指定されたグループのホスト群に関する情報を取得する モジュールから実行ファイル

を生成です

Page 28: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Ansibleによる操作①事前準備

●  ハンズオンで利用するAnsibleのモジュールをダウンロードします[URL]  https://github.com/h-­saito/openstack-­sample-­app

#  cd  /usr/share/ansible/cloud#  wget  -­O  hp_nova_floating_ip  -­-­no-­check-­certificate  http://goo.gl/mnSsh4#  wget  -­O  hp_nova_floating_ip_associate  -­-­no-­check-­certificate    http://goo.gl/GYW1RR#  lscloudformation                ec2_metric_alarm                              nova_compute                                      rax_factsdigital_ocean                  ec2_scaling_policy                          nova_keypair                                      rax_filesdigital_ocean_domain    ec2_snapshot                                      ovirt                                                    rax_files_objectsdigital_ocean_sshkey    ec2_tag                                                quantum_floating_ip                        rax_identitydocker                                ec2_vol                                                quantum_floating_ip_associate    rax_keypairdocker_image                    ec2_vpc                                                quantum_network                                rax_network

ec2                                      elasticache                                        quantum_router                                  rax_queueec2_ami                              gce                                                        quantum_router_gateway                  rdsec2_ami_search                gce_lb                                                  quantum_router_interface              rds_param_groupec2_asg                              gce_net                                                quantum_subnet                                  rds_subnet_groupec2_eip                              gce_pd                                                  rax                                                        route53ec2_elb                              gc_storage                                          rax_cbs                                                s3ec2_elb_lb                        glance_image                                      rax_cbs_attachments                        virtec2_facts                          hp_nova_floating_ip                        rax_clb                                                vsphere_guest

ec2_group                          hp_nova_floating_ip_associate    rax_clb_nodesec2_key                              keystone_user                                    rax_dnsec2_lc                                linode                                                  rax_dns_record

28

Page 29: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Ansibleによる操作②Internet接続用にフローティングIPを払い出す

●  hp_nova_floating_ipモジュールを利用してフローティングIPを払い出します#  cd  $HOME#  ansible  -­i  inventory  -­m  hp_nova_floating_ip  \-­a  "state=present  login_username=$OS_USERNAME  login_password=$OS_PASSWORDlogin_tenant_name=$OS_TENANT_NAME  auth_url=$OS_AUTH_URL  region_name=$OS_REGION_NAME"  localhost127.0.0.1  |  success  >>  {        "changed":  true,        "id":  "610f4d22-­4db7-­44a5-­9af1-­7ef652bb553c",        "ip":  "15.125.79.34",        "pool":  "Ext-­Net"}

●  払い出されたフローティングIPを確認しておきます#  nova  floating-­ip-­list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+|  Ip                        |  Server  Id  |  Fixed  Ip    |  Pool        |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+|  15.125.74.215  |                      |  10.0.0.39  |  Ext-­Net  ||  15.125.79.34    |                      |  -­                  |  Ext-­Net  ||  15.125.118.53  |                      |  10.0.0.3    |  Ext-­Net  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+

29

Page 30: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Ansibleによる操作③仮想マシンを作成する

●  nova_computeモジュールを利用して仮想マシン(app-­server1)を作成して起動します#  ansible  -­i  inventory  -­m  nova_compute  \-­a  "state=present  login_username=$OS_USERNAME  login_password=$OS_PASSWORDlogin_tenant_name=$OS_TENANT_NAME  auth_url=$OS_AUTH_URL  region_name=$OS_REGION_NAMEname=app-­server1image_id=202e7659-­f7c6-­444a-­8b32-­872fe2ed080cflavor_id=101key_name=key-­for-­app-­serversecurity_groups=security-­for-­app-­server"  localhost

127.0.0.1  |  success  >>  {        "changed":  true,        "id":  "093745cf-­8d31-­49fc-­8a7b-­95f5c98a6430",        "info":  {

               "OS-­EXT-­AZ:availability_zone":  "az3",                "OS-­EXT-­STS:power_state":  1,                "OS-­EXT-­STS:task_state":  null,                "OS-­EXT-­STS:vm_state":  "active",                "accessIPv4":  "",                "accessIPv6":  "",<...>        "private_ip":  "10.0.0.40",

       "public_ip":  "",        "status":  "ACTIVE"}

30

image_idには、novaコマンドとは違ってuuidを指定してやる必要があるので注意してください

"private_ip"のアドレスを、次頁のフローティングIP割り当て時に"-­-­fixed_ip"  として指定します

作成するサーバ名はapp-­server1とします

Page 31: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Ansibleによる操作④仮想マシンにフローティングIPを付与してInternetに接続する

●  app-­server1が作成されたことを確認します#  nova  list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  ID                                                                      |  Name                |  Status  |  Task  State  |  Power  State  |  Networks                                                                  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  ed98ec64-­6884-­4c7f-­b462-­8e375efd7148  |  app-­server    |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.39,  15.125.74.215  ||  093745cf-­8d31-­49fc-­8a7b-­95f5c98a6430  |  app-­server1  |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.40                                ||  812c40ec-­538f-­4efe-­8511-­eab531d99807  |  step-­server  |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.3,  15.125.118.53    |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

●  app-­server1にフローティングIPを割り当てます#  ansible  -­i  inventory  -­m  hp_nova_floating_ip_associate  \-­a  "state=present  login_username=$OS_USERNAME  login_password=$OS_PASSWORDlogin_tenant_name=$OS_TENANT_NAME  auth_url=$OS_AUTH_URL  region_name=$OS_REGION_NAMEname=app-­server1  floating_ip=15.125.79.34  fixed_ip=10.0.0.40"  localhost127.0.0.1  |  success  >>  {        "changed":  true,        "fixed_ip":  "10.0.0.40",        "floating_ip":  "15.125.79.34",        "id":  "093745cf-­8d31-­49fc-­8a7b-­95f5c98a6430",        "name":  "app-­server1"}

●  割り当てたフローティングIPに対してstep-­serverからsshログインできることを確認します#  ssh  [email protected][root@app-­server1  ~˜]#  hostnameapp-­server1

31

Page 32: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

現在のシステム構成

IaaS基盤を管理する  〜~  Ansibleによる操作⑥

32

<userID>-­router

Router

step-­server

Instance

Ext-­Net

<UserID

>-­netw

ork

10.0.0.0/24

10.0.0.1

10.0.0.N

app-­server

Instance

10.0.0.N

app-­server1

Instance

10.0.0.N

app-­server1を新たに作成しました

Page 33: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Ansibleによる操作⑦Dynamic  Inventoryを利用する

●  前章で作成した仮想マシンをAnsibleから操作するためにエディタでフローティングIPをInventoryファイルの[app-­server]グループに追加します※step-­serverから接続可能なIPアドレスであればプライベートIP(fixed_ip)でもかまいません

〜~[app-­server]グループのみ抜粋〜~[app-­server]15.125.74.21515.125.79.34

●  pingモジュールで接続確認を行います#  ansible  -­i  inventory  -­m  ping  app-­server15.125.79.34  |  success  >>  {        "changed":  false,        "ping":  "pong"}

15.125.74.215  |  success  >>  {        "changed":  false,        "ping":  "pong"}

33

Page 34: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Ansibleによる操作⑧Dynamic  Inventoryを利用する

●  Dynamic  Inventoryとは?Ansibleでは操作対象となるノードをInventoryファイルにあらかじめ記載しておく必要がありますが、プログラムを利用してInventoryファイルの内容を動的に生成する仕組みがDynamic  Inventoryですnova.pyはテナント名のホストグループを動的に生成します

●  Dynamic  Inventory生成プログラムをダウンロードします#  cd  $HOME#  wget  -­O  nova.py  -­-­no-­check-­certificate  http://goo.gl/Iwz9iY#  chmod  +x  nova.py#  ./nova.py  -­-­list{    "10186636762086-­Project":  {        "_meta":  {            "hostvars":  {                "15.125.74.215":  {<...>

"hosts":  [            "15.125.79.34",            "15.125.74.215"        ],        "vars":  {}    }}

34

ホストグループ名:  10186636762086-­Project

15.125.79.34 15.125.74.215

Page 35: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Ansibleによる操作⑨Dynamic  Inventoryを利用する

●  Dynamic  Inventoryを利用してみましょう今回利用するnova.pyは、Inventoryファイル(inventory)内で<グループ名:vars>で設定していたログイン情報は生成しないため、ansibleコマンドの引数として-­u  <ユーザID>と-­kで実行時のパスフレーズ入力オプションを明示的に指定してやる必要があります

[書式]  ansible  -­i  <収集プログラム名>  -­m  <モジュール名>  -­u  <ユーザID>  -­k  ホストグループ名

#  ansible  -­i  nova.py  -­m  ping  -­u  root  -­k  $OS_TENANT_NAMESSH  password:  ********15.125.74.215  |  success  >>  {        "changed":  false,        "ping":  "pong"}

15.125.79.34  |  success  >>  {        "changed":  false,        "ping":  "pong"}

35

Page 36: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Playbookによる操作①

仕事をまとめるPlaybookここまでは、ansibleコマンドにより単発の仕事をAnsibleに実行させてきましたが、現実ではこのようが仕事が複数集まって手順として実施されることになります。Ansibleは、下記のような手順をPlaybookとして定義して実行することが可能です。以降ではAnsibleのPlaybook機能を利用して、手順書にしたがった作業を自動化してみましょう。

36

パッケージインストール

設定変更

デーモン再起動

実行順序は常に保証される必要がある

AnsiblePlaybook

1

2

3

Page 37: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Playbookによる操作②

Playbookを利用するAnsibleのPlaybookを利用して、サンプルアプリケーションをインストールしてみましょう。サンプルアプリケーションの詳細は以下のサイトで確認できます。ü  [URL]  https://github.com/irixjp/openstack-­sample-­app手順は以下の通りです(ここでは手順の確認のみで作業は実施しません)

37

□  1.  インストール対象サーバにrootユーザでsshログインする-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­□  2.  以下の手順でコマンドを実行してインストールを行う-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­#  yum  install  -­q  -­y  git

#  cd  /root#  git  clone  https://github.com/irixjp/openstack-­sample-­app.git#  sh  /root/openstack-­sample-­app/server-­setup/install_web.sh#  sh  /root/openstack-­sample-­app/server-­setup/install_rest.sh#  sh  /root/openstack-­sample-­app/server-­setup/install_db.sh#  sh  /root/openstack-­sample-­app/server-­setup/web.init.sh#  sh  /root/openstack-­sample-­app/server-­setup/rest.init.sh-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­

□  3.  プラウザから  http://対象サーバ/  にアクセスして動作確認を行う

Page 38: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Playbookによる操作③サンプル・アプリケーションのインストール作業を自動化する

●  サンプルアプリケーションをダウンロードします[URL]  https://github.com/h-­saito/openstack-­sample-­app/blob/master/examples/playbooks/sample-­app.yml

#  wget  -­O  sample-­app.yml  -­-­no-­check-­certificate  http://goo.gl/FTvTpm〜~  sample-­app.yaml  〜~-­-­-­-­  name:  deploy  sample  application    hosts:  "{{  target  }}"

   tasks:    -­  name:  package  install        yum:  name={{  item  }}  state=latest        with_items:        -­  git    -­  name:  git  clone  sample-­app        git:  repo=https://github.com/irixjp/openstack-­sample-­app.git  dest=/root/openstack-­sample-­app    -­  name:  execute  install_web        raw:  /bin/sh  /root/openstack-­sample-­app/server-­setup/install_web.sh    -­  name:  execute  install_rest        raw:  /bin/sh  /root/openstack-­sample-­app/server-­setup/install_rest.sh    -­  name:  execute  install_db        raw:  /bin/sh  /root/openstack-­sample-­app/server-­setup/install_db.sh    -­  name:  web  init        raw:  /bin/sh  /root/openstack-­sample-­app/server-­setup/web.init.sh    -­  name:  rest  init        raw:  /bin/sh  /root/openstack-­sample-­app/server-­setup/rest.init.sh

38

hosts:  セクションにはInventoryファイル内のホストグループを設定します

task:  セクションにはAnsibleに実行させる手順を実行順に列挙します

Page 39: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Playbookによる操作④サンプル・アプリケーションのインストール作業を自動化する

●  サンプルアプリケーションをapp-­server,app-­server2にインストールします#  ansible-­playbook  -­i  nova.py  -­u  root  -­k  -­-­extra-­vars="target=$OS_TENANT_NAME"  sample-­app.ymlSSH  password:    ********PLAY  [deploy  sample  application]  **********************************************  GATHERING  FACTS  ***************************************************************  ok:  [15.125.74.215]ok:  [15.125.79.34]TASK:  [package  install]  *******************************************************  changed:  [15.125.79.34]  =>  (item=git)changed:  [15.125.74.215]  =>  (item=git)TASK:  [git  clone  sample-­app]  **************************************************  changed:  [15.125.74.215]changed:  [15.125.79.34]TASK:  [execute  install_web]  ***************************************************  ok:  [15.125.74.215]ok:  [15.125.79.34]TASK:  [execute  install_rest]  **************************************************  ok:  [15.125.79.34]ok:  [15.125.74.215]TASK:  [execute  install_db]  ****************************************************  ok:  [15.125.74.215]ok:  [15.125.79.34]TASK:  [web  init]  **************************************************************  ok:  [15.125.74.215]ok:  [15.125.79.34]TASK:  [rest  init]  *************************************************************  ok:  [15.125.79.34]ok:  [15.125.74.215]PLAY  RECAP  ********************************************************************  15.125.74.215                            :  ok=8        changed=2        unreachable=0        failed=0      15.125.79.34                              :  ok=8        changed=2        unreachable=0        failed=0  

39

Page 40: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

IaaS基盤を管理する  〜~  Playbookによる操作⑤サンプル・アプリケーションのインストール作業を自動化する

app-­server,  app-­server1にブラウザでアクセスしてみましょう

40

Page 41: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

まとめ

ここまでの作業をまとめます

ü  Ansibleの仕組みを説明しました

ü  Ansibleを利用してIaaS基盤上に仮想マシンを作成しました

ü  Dynamic  Inventoryを利用して動的にInventoryを生成する方法を説明しました

ü  AnsibleのPlaybookを利用して複数手順を1つにまとめる方法について説明しました

ü  Playbookを利用してサンプルアプリケーションを同時に複数ホストに対してインストールしました

41

Page 42: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

現在のシステム構成

自動化編  完了時点

42

<userID>-­router

Router

step-­server

Instance

Ext-­Net

<UserID

>-­netw

ork

10.0.0.0/24

10.0.0.1

10.0.0.N

app-­server

Instance

10.0.0.N

app-­server1

Instance

10.0.0.Nサンプルアプリケーションをインストールしました

Page 43: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

自動化編  〜~おつかれさまでした〜~

43

Page 44: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

追補1:  Playbookで仮想マシンを作成する

44

Page 45: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Playbookで仮想マシンを作成する①

仮想マシン作成手順のPlaybook化を進めるここまでの作業を手順としてまとめると、以下のようになります

•  フローティングIPを払い出す(hp_nova_floating_ipモジュール)•  仮想マシンを作成して起動する(nova_computeモジュール)•  フローティングIPを仮想マシンに割り当てる(hp_nova_floating_ip_associateモジュール)

45

hp_nova_floating_ip

nova_compute

hp_nova_floating_ip_associate

AnsiblePlaybook

1

2

3

Page 46: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Playbookで仮想マシンを作成する②●  Playbookをダウンロードします[URL]  https://github.com/h-­saito/openstack-­sample-­app/blob/master/examples/playbooks/

#  cd  $HOME  &&  source  openrc  &&  export  ANSIBLE_HOST_KEY_CHECKING=False#  wget  -­O  vm_with_floating_ip.yml  -­-­no-­check-­certificate  http://goo.gl/WjOzoP

●  仮想マシン(app-­server3)を作成します#  ansible-­playbook  -­i  inventory  -­-­extra-­vars="state=present  user=$OS_USERNAME  password=$OS_PASSWORD  tenant=$OS_TENANT_NAMEauth_url=$OS_AUTH_URL  region=$OS_REGION_NAMEserver_name=app-­server3"  vm_with_floating_ip.yml

PLAY  [create  vm  and  associate  floating_ip]  ************************************  GATHERING  FACTS  ***************************************************************  ok:  [127.0.0.1]TASK:  [create  floating_ip]  ****************************************************  changed:  [127.0.0.1]TASK:  [create  vm  instance]  ****************************************************  changed:  [127.0.0.1]TASK:  [associate  floating_ip  to  vm  instance]  **********************************  changed:  [127.0.0.1]PLAY  RECAP  ********************************************************************  127.0.0.1                                    :  ok=4        changed=3        unreachable=0        failed=0  

46

Page 47: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Playbookで仮想マシンを作成する③●  vm_with_floating_ip.yml  〜~前編〜~今回利用したPlaybookの内容は以下の通りです

-­-­-­-­  name:  create  vm  and  associate  floating_ip    hosts:  localhost    vars:        image_id:  "202e7659-­f7c6-­444a-­8b32-­872fe2ed080c"        flavor_id:  "101"        key_name:  "key-­for-­app-­server"        sec_group:  "security-­for-­app-­server"

   tasks:    -­  name:  create  floating_ip        local_action:  hp_nova_floating_ip            state={{  state  }}            login_username={{  user  }}            login_password={{  password  }}            login_tenant_name={{  tenant  }}            auth_url={{  auth_url  }}        register:  floating_ip

47

[解説]Playbookを構成するブロックの役割は以下の通りです========================================hosts  -­>  Playbookを適用する対象ホスト                  グループ-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­vars    -­>  Playbook内で利用する変数を定義                  するセクション                  定義した変数は  {{  変数名  }}  で                  値に置き換えられる                  ansible-­playbookコマンド実行時                  -­-­extra-­vars  "変数名=値  ..."                  としてオプション指定することも                  可能-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­tasks  -­>  Playbookで実行するモジュール群                  を列挙する。記載順に実行される-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­

Page 48: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Playbookで仮想マシンを作成する④●  vm_with_floating_ip.yml  〜~中編〜~

   -­  name:  create  vm  instance        local_action:  nova_compute            state={{  state  }}            login_username={{  user  }}            login_password={{  password  }}            login_tenant_name={{  tenant  }}            auth_url={{  auth_url  }}            name={{  server_name  }}            image_id={{  image_id  }}            flavor_id={{  flavor_id  }}            key_name={{  key_name  }}            security_groups={{  sec_group  }}        register:  instance

48

Page 49: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

Playbookで仮想マシンを作成する④●  vm_with_floating_ip.yml  〜~後編〜~

   -­  name:  associate  floating_ip  to  vm  instance        local_action:  hp_nova_floating_ip_associate            state={{  state  }}            login_username={{  user  }}            login_password={{  password  }}            login_tenant_name={{  tenant  }}            auth_url={{  auth_url  }}            name={{  server_name  }}            floating_ip={{  floating_ip.ip  }}            fixed_ip={{  instance.private_ip  }}####  [EOF]##

49

Page 50: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

追補2:  サンプル・アプリケーションの展開

50

Page 51: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

サンプル・アプリケーションの展開①役割を分けたノードへの展開

WEB/ReST/DBの3台の仮想マシンを構築して、それぞれ役割ごとにアプリケーションをインストールしてみましょう。

51

Page 52: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

サンプル・アプリケーションの展開②役割を分けたノードへの展開

●  web/rest/dbサーバをPlaybookで作成します小さめのフレーバで3台の仮想マシンを作成します

#  cd  $HOME  &&  source  openrc  &&  export  ANSIBLE_HOST_KEY_CHECKING=False#  ansible-­playbook  -­i  inventory  -­-­extra-­vars="state=present  user=$OS_USERNAME  password=$OS_PASSWORD  tenant=$OS_TENANT_NAMEauth_url=$OS_AUTH_URL  region=$OS_REGION_NAMEflavor_id=100  server_name=web"  vm_with_floating_ip.yml  

#  ansible-­playbook  -­i  inventory  -­-­extra-­vars="state=present  user=$OS_USERNAME  password=$OS_PASSWORD  tenant=$OS_TENANT_NAMEauth_url=$OS_AUTH_URL  region=$OS_REGION_NAMEflavor_id=100  server_name=rest"  vm_with_floating_ip.yml  

#  ansible-­playbook  -­i  inventory  -­-­extra-­vars="state=present  user=$OS_USERNAME  password=$OS_PASSWORD  tenant=$OS_TENANT_NAMEauth_url=$OS_AUTH_URL  region=$OS_REGION_NAMEflavor_id=100  server_name=db"  vm_with_floating_ip.yml  

#  nova  list+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  ID                                                                      |  Name                |  Status  |  Task  State  |  Power  State  |  Networks                                                                  |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  66bfb4d4-­73b1-­405b-­8716-­de0356beb069  |  db                    |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.47,  15.125.76.128  ||  184a20d5-­7bbc-­451f-­bc27-­fd3533f89f50  |  rest                |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.46,  15.125.76.0      ||  812c40ec-­538f-­4efe-­8511-­eab531d99807  |  step-­server  |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.3,  15.125.118.53    ||  b2b2cadc-­02a9-­42f6-­befe-­9a7bf8b1f41a  |  web                  |  ACTIVE  |  -­                    |  Running          |  h-­saito-­network=10.0.0.45,  15.125.75.89    |+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

52

Page 53: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

サンプル・アプリケーションの展開③役割を分けたノードへの展開

●  Playbook(sample-­app-­multinode.yml)をダウンロードします#  wget  -­O  sample-­app-­multinode.yml  -­-­no-­check-­certificate  http://goo.gl/wTCZQv

●  エディタでInventoryファイル(sample-­hosts)新規に作成してdb/rest/dbサーバを登録しますweb,rest,dbには、作成した仮想マシンのフローティングIPを設定してください#  nano  sample-­hosts

〜~  sample-­hosts  ここから  〜~[web]15.125.75.89  ansible_ssh_user=root  ansible_ssh_pass=<パスフレーズ>

[rest]15.125.76.0  ansible_ssh_user=root  ansible_ssh_pass=<パスフレーズ>

[db]15.125.76.128  ansible_ssh_user=root  ansible_ssh_pass=<パスフレーズ>

〜~  sample-­hosts  ここまで  〜~

●  pingモジュールで接続確認を行います#  ansible  -­i  sample-­hosts  -­m  ping  all15.125.75.89  |  success  >>  {  "changed":  false,    "ping":  "pong"  }  15.125.76.128  |  success  >>  {    "changed":  false,    "ping":  "pong"  }  15.125.76.0  |  success  >>  {    "changed":  false,      "ping":  "pong"  }

53

Page 54: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

サンプル・アプリケーションの展開④役割を分けたノードへの展開

●  エディタでendpoint.conf.j2ファイルを新規に作成します〜~  endpoint.conf.j2  ここから  〜~[rest-­server]rest_host  =  {{  rest  }}rest_endpoint  =  http://%(rest_host)s:5555/bbs

[db-­server]db_host  =  {{  db  }}db_endpoint  =  mysql://user:password@%(db_host)s/sample_bbs?charset=utf8

〜~  endpoint.conf.j2  ここまで  〜~

●  セキュリティグループにMySQL(TCP  Port:3306)とrestサーバのアプリケーション(TCP  Port:5555)を追加します#  nova  secgroup-­add-­rule  security-­for-­app-­server  tcp  3306  3306  10.0.0.0/24+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  IP  Protocol  |  From  Port  |  To  Port  |  IP  Range        |  Source  Group  |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  tcp                  |  3306            |  3306        |  10.0.0.0/24  |                            |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

#  nova  secgroup-­add-­rule  security-­for-­app-­server  tcp  5555  5555  10.0.0.0/24+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  IP  Protocol  |  From  Port  |  To  Port  |  IP  Range        |  Source  Group  |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+|  tcp                  |  5555            |  5555        |  10.0.0.0/24  |                            |+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­+-­-­-­-­-­-­-­-­-­-­-­-­-­-­+

54

Page 55: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

サンプル・アプリケーションの展開⑤役割を分けたノードへの展開

●  Playbook(sample-­app-­multinode.yml)をダウンロードします[URL]  https://github.com/h-­saito/openstack-­sample-­app

#  wget  -­O  sample-­app-­multinode.yml  -­-­no-­check-­certificate  http://goo.gl/Enk93Z

●  Playbook(sample-­app-­multinode.yml)を実行しますweb,rest,dbには、作成した仮想マシンのプライベートIPを設定してください

#  ansible-­playbook  -­i  sample-­hosts  -­-­extra-­vars="web=10.0.0.45  rest=10.0.0.46  db=10.0.0.47"  sample-­app-­multinode.yml

55

Page 56: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

サンプル・アプリケーションの展開⑥役割を分けたノードへの展開

●  PlayBook(sample-­app-­multinode.yml)実行結果Playbookに記述した条件(when)に合致した場合のみ処理が実行されているのがわかります

PLAY  [deploy  sample  application]  **********************************************GATHERING  FACTS  ***************************************************************ok:  [15.125.78.48]  ok:  [15.125.78.41]  ok:  [15.125.78.46]TASK:  [package  install]  *******************************************************changed:  [15.125.78.41]  =>  (item=git)  changed:  [15.125.78.48]  =>  (item=git)  changed:  [15.125.78.46]  =>  (item=git)TASK:  [git  clone  sample-­app]  **************************************************changed:  [15.125.78.41]  changed:  [15.125.78.46]  changed:  [15.125.78.48]TASK:  [install  web  service]  ***************************************************skipping:  [15.125.78.46]  skipping:  [15.125.78.48]  ok:  [15.125.78.41]TASK:  [install  rest  service]  **************************************************  skipping:  [15.125.78.48]  skipping:  [15.125.78.41]  ok:  [15.125.78.46]TASK:  [install  db  service]  ****************************************************skipping:  [15.125.78.46]  skipping:  [15.125.78.41]  ok:  [15.125.78.48]TASK:  [copy  endpoint.conf  to  all  servers]  *************************************skipping:  [15.125.78.48]  changed:  [15.125.78.46]  changed:  [15.125.78.41]NOTIFIED:  [start  web  service]  *************************************************skipping:  [15.125.78.46]  ok:  [15.125.78.41]NOTIFIED:  [start  rest  service]  ************************************************skipping:  [15.125.78.41]  ok:  [15.125.78.46]PLAY  RECAP  ********************************************************************15.125.78.41                              :  ok=6        changed=3        unreachable=0        failed=015.125.78.46                              :  ok=6        changed=3        unreachable=0        failed=015.125.78.48                              :  ok=4        changed=2        unreachable=0        failed=0

56

Page 57: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

追補3:APIによる操作

57

Page 58: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

APIによる操作①

APIによる操作クラウド基盤管理の自動化を進めるにあたって、外部プログラムからの制御は必須の要件となります。OpenStackの各コンポーネントは、外部プログラムから制御されることを想定したAPIを提供しています。

58

Page 59: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

APIによる操作②●  novaクライアントライブラリを利用して仮想マシンのリストを取得してみます※  ">>>"はbpythonのプロンプトです

#  cd  $HOME  &&  source  openrc  &&  export  ANSIBLE_HOST_KEY_CHECKING=False#  bpython>>>  from  novaclient.client  import  Client  as  NV>>>  from  neutronclient.v2_0.client  import  Client  as  NT>>>  import  os>>>  U  =  os.environ.get('OS_USERNAME')>>>  P  =  os.environ.get('OS_PASSWORD')>>>  T  =  os.environ.get('OS_TENANT_NAME')>>>  A  =  os.environ.get('OS_AUTH_URL')>>>  R  =  os.environ.get('OS_REGION_NAME')>>>  nv  =  NV(2,  U,  P,  T,  A,  region_name=R)>>>  nv.servers.list()[<Server:  db>,  <Server:  rest>,  <Server:  web>,  <Server:  app-­server1>,  <Server:  app-­server>,  <Server:  step-­server>]

59

仮想マシン毎に作られるServerクラスのインスタンスリストが取得できます

Page 60: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

APIによる操作③●  Serverクラスのインスタンスから仮想マシン情報(名前、UUID、Networkなど)を参照してみます>>>  vm  =  nv.servers.list()[0]>>>  vm.nameu'db'>>>  vm.idu'263d11e7-­d83b-­4864-­9286-­e0bc836da751'>>>  vm.flavor{u'id':  u'100',  u'links':  [{u'href':  u'https://region-­a.geo-­1.compute.hpcloudsvc.com/10012734753930/flavors/100',  u'rel':  u'bookmark'}]}>>>  vm.addresses{u'h-­saito-­network':  [{u'OS-­EXT-­IPS-­MAC:mac_addr':  u'fa:16:3e:14:b6:3a',  u'version':  4,  u'addr':  u'10.0.0.50',  u'OS-­EXT-­IPS:type':  u'fixed'},  {u'OS-­EXT-­IPS-­MAC:mac_addr':  u'fa:16:3e:14:b6:3a',  u'version':  4,  u'addr':  u'15.125.78.48',  u'OS-­EXT-­IPS:type':  u'floating'}]}

●  参照だけでなく仮想マシンの起動・停止・再起動などの操作も可能です>>>  vm.statusu'ACTIVE'>>>  vm.stop()>>>  vm.get()>>>  vm.statusu'SHUTOFF'

60

Page 61: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

APIによる操作④●  GuestOSのイメージリストを取得してみます>>>  nv.images.list()[        <Image:  Debian  Wheezy  7.6  64-­bit  20140714  -­  Partner  Image>,        <Image:  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)>,        <Image:  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)>,        <Image:  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)>,        <Image:  CentOS  5.6  Server  64-­bit  20111207  (Kernel)  (deprecated)>,...        <Image:  Ubuntu  Quantal  12.10  Server  64-­bit  20121017  (deprecated)>,        <Image:  Ubuntu  Raring  13.04  Server  64-­bit  20130601  (deprecated)>]

61

利用可能なImageクラスのリストが取得できます

Page 62: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

APIによる操作⑤●  フレーバのイメージリストを取得してみます>>>  nv.flavors.list()[        <Flavor:  standard.xsmall>,        <Flavor:  standard.small>,        <Flavor:  standard.medium>,        <Flavor:  standard.large>,        <Flavor:  standard.xlarge>,        <Flavor:  standard.2xlarge>,        <Flavor:  standard.4xlarge>,        <Flavor:  standard.8xlarge>,        <Flavor:  highmem.large>,        <Flavor:  highmem.xlarge>,        <Flavor:  highmem.2xlarge>]

62

利用可能なFlavorクラスのリストが取得できます

Page 63: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

APIによる操作⑥仮想マシンを作成する

●  CLIと同様に仮想マシン(app-­server2)を作成して起動します>>>  sg  =  nv.security_groups.find(name='security-­for-­app-­server')>>>  vm  =  nv.servers.create(...  name='app-­server2',...  image='202e7659-­f7c6-­444a-­8b32-­872fe2ed080c',...  flavor='100',...  security_groups=[sg.id],...  key_name='key-­for-­app-­server')>>>  vm.statusu'BUILD'>>>  vm.get()>>>  vm.statusu'ACTIVE'>>>  nv.servers.list()[<Server:  app-­server2>,  <Server:  db>,  <Server:  rest>,  <Server:  web>,  <Server:  app-­server1>,  <Server:  app-­server>,  <Server:  step-­server>]

63

セキュリティグループはUUIDで指定する必要があるため、予め  SecurityGroupクラスのインスタンス(sg)を取得しておく

app-­server2がリストアップされた

app-­server2の作成が終わって起動状態となった

Page 64: 沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1

APIによる操作⑦仮想マシンを作成する

●  サービス提供用にフローティングIPを払い出します>>>  nv.floating_ips.create()<FloatingIP  fixed_ip=None,  id=d729b237-­541c-­44f6-­bed1-­0522196a7454,  instance_id=None,  ip=15.125.81.160,  pool=Ext-­Net>

●  払い出したフローティングIPを仮想マシン(app-­server2)に割り当てます>>>  vm.networks{u'h-­saito-­network':  [u'10.0.0.51']}

●  仮想マシン(app-­server2)にフローティングIP(15.125.81.160)を割り当てます>>>  nv.servers.add_floating_ip(vm.id,  '15.125.81.160',  fixed_address='10.0.0.51')>>>  vm.get()>>>  vm.networks{u'h-­saito-­network':  [u'10.0.0.51',  u'15.125.81.160']}

●  仮想マシン(app-­server2)にsshログインしてみます#  ssh  [email protected][root@app-­server2  ~˜]#  hostnameapp-­server2

64

15.125.81.160  が払い出された

app-­server2のプライベートIPは  10.0.0.51

app-­server2にフローティングIPが割り当てられた