沖縄オープンラボラトリ openstackハンズオンセミナー午後1
TRANSCRIPT
自動化編
1
openstackOpen source software to build public and private clouds.
OpenStackとAnsibleによるIaaS基盤運用の自動化
2014-07-30Hideki Saito
TwitterID: @saito_hidekiInternet Initiative Japan Inc.
目次
• はじめにü ITインフラ構築・運用管理の自動化
• ハンズオンü 本セッションで利用するシステム構成ü IaaS基盤を管理するü システム構築を自動化する
2
はじめに
3
• 自動化の目的ü 日々繰り返される単純作業からエンジニアを解放するü 作業ミスを未然に防ぎ品質を安定させる
• 自動化の変遷
• クラウド/自動化/構成管理ツールü OpenStack/CloudStack/Eucalyptus などü Ansible, Chef, Puppet など
ITインフラ構築・運用管理の自動化①
手順書と引き継ぎ手順書のスクリプト化 と自動実行
構成管理ツールの登場
4
ITインフラ構築・運用管理の自動化②
• 本セッションのテーマOpenStackとAnsibleを利用して、インフラエンジニアの日常業務である、クラウド基盤上の仮想リソース管理作業を可能な限り自動化する。
5
構築業務
サーバ設計・構築
ネットワーク設計・構築
ファシリティ設計
運用管理システムの設計・開発
運用業務
システム全体の運用管理
資産管理
ITインフラ構築・運用管理の自動化③
ITインフラエンジニアの典型的な業務は、このような感じでしょうか。
• ネットワーク機器を設定するp ポートを設定するp サーバのNICを物理的に接続するp wikiなどでドキュメントを更新する
• サーバを構築するp OSをインストールするp リモートログイン可能な状態にするp 追加パッケージのインストールや設定等の基本構築を行うp ミドルウェアのインストール&設定を行うp サービスに投入するp wikiなどのドキュメントを更新する
以降の章では、このような日常業務を省力化する方法を考えてみます。
6
ハンズオン
7
現在のシステム構成
本セッションで利用するシステム構成
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
IaaS基盤を管理する
9
• OpenStackを管理するOpenStackのクラウド基盤を操作するには、3つの方法があります。
以降の章ではOpenStackが提供するCLIを利用した操作を体験し、その後APIを利用した外部プログラム(Ansible)によるOpenStackの操作を体験してみましょう。
• Horizonが提供するDashboard• OpenStackの主要な機能のみを提供するWebUI
• 各コンポーネントが提供するコマンドラインインターフェイス• 管理者用コマンド• 一般利用者用コマンド
CLI
• RESTful APIでOpenStackの全ての機能を利用可能• Pythonのライブラリとしても提供されるAPI
IaaS基盤を管理する 〜~ CLIによる操作①
OpenStackの各コンポーネントが提供するCLIを利用して、以下の流れで仮想リソースを作成してみましょう。
CLIのコマンド名は、それぞれのnovaコマンドやglanceコマンドなど、コンポーネント名となっているのが通例です。
10
4. 仮想マシンにフローティングIPを付与してInternetに接続する
3. 仮想マシンを作成する
2. Internet接続用にフローティングIPを払い出す
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
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
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
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
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
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
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
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
現在のシステム構成
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を新たに作成しました
まとめ
ここまでの作業をまとめます
ü CLIを利用してIaaS基盤上に仮想マシンを作成しました
ü OpenStackのCLIで利用するクライアントコマンドは各コンポーネントが提供します
ü OpenStackのCLIは各コンポーネント(novaやneutronなど)が提供するAPI経由でコンポーネントにリクエストを投げることにより基盤の操作を行います
ü コマンドを利用するためには認証に必要な情報を特定の環境変数として設定するか、コマンドライン引数として渡してやる必要があります
ü Dashboard(WebUI)からは、OpenStackの機能をフル活用することはできず、CLIでのオペレーションが必要となる場合があります
20
システム構築を自動化する
21
Ansibleについて①
Ansibleの特徴AnsibleはPythonで書かれた*作業*だけなく*仕事*を自動化するためのツールで、OpenStackと組み合わせることにより、OS・ミドルウェア・アプリケーションのインストール・設定作業を自動化することが可能です。
ü 作業の一連の流れを1つにまとめるPlaybookを持つü 多数の外部モジュールが標準・オプションで提供されているü 必要な機能を提供するモジュールは自身で開発することが可能ü 作業の冪等性が担保されているü push型でエージェントレスであるü 動作に必要な要件が少ない
Ø SSHログイン可能Ø Python実行環境(2.4以降)といくつかのライブラリが存在する
22
• ファイルの転送、サービスの起動停止などAnsibleに行わせる作業がモジュールとして提供されているmodule
• Ansibleに行わせる一連の作業の流れをまとめたもの• Chefではrecipe、PuppetではmanifestにあたるPlaybook
• 実行結果にり実行されるcallbackモジュール群• 動的にターゲットホストをグルーピングするDynamic Inventoryプログラム
Plugin
• 操作対象ノードに関する情報を記録しているファイル• PluginのDynamic Inventoryプログラムを利用して動的生成することも可能
Inventory
Ansibleについて②
Ansibleの主な構成要素Ansibleは大きく以下の要素から構成されています。次章ではAnsibleを実際に利用しつつ、その仕組を解説します。
23
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と鍵のパスフレーズを書いてください
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"が返ってきていれば接続に成功しています
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で再利用することが可能です
Ansibleについて⑥
Ansibleの挙動以下にAnsibleの動きを図示します
27
Ansible
実行可能ファイル
実行可能ファイル
pingモジュール
setupモジュール
Inventoryファイル
sshd1
2
3
指定されたモジュールをインポートするターゲットノードにsftp/scpで実行可能ファイルを転送してssh経由でログインし実行する
指定されたグループのホスト群に関する情報を取得する モジュールから実行ファイル
を生成です
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
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
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とします
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
現在のシステム構成
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を新たに作成しました
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
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
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
IaaS基盤を管理する 〜~ Playbookによる操作①
仕事をまとめるPlaybookここまでは、ansibleコマンドにより単発の仕事をAnsibleに実行させてきましたが、現実ではこのようが仕事が複数集まって手順として実施されることになります。Ansibleは、下記のような手順をPlaybookとして定義して実行することが可能です。以降ではAnsibleのPlaybook機能を利用して、手順書にしたがった作業を自動化してみましょう。
36
パッケージインストール
設定変更
デーモン再起動
実行順序は常に保証される必要がある
AnsiblePlaybook
1
2
3
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://対象サーバ/ にアクセスして動作確認を行う
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に実行させる手順を実行順に列挙します
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
IaaS基盤を管理する 〜~ Playbookによる操作⑤サンプル・アプリケーションのインストール作業を自動化する
app-server, app-server1にブラウザでアクセスしてみましょう
40
まとめ
ここまでの作業をまとめます
ü Ansibleの仕組みを説明しました
ü Ansibleを利用してIaaS基盤上に仮想マシンを作成しました
ü Dynamic Inventoryを利用して動的にInventoryを生成する方法を説明しました
ü AnsibleのPlaybookを利用して複数手順を1つにまとめる方法について説明しました
ü Playbookを利用してサンプルアプリケーションを同時に複数ホストに対してインストールしました
41
現在のシステム構成
自動化編 完了時点
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サンプルアプリケーションをインストールしました
自動化編 〜~おつかれさまでした〜~
43
追補1: Playbookで仮想マシンを作成する
44
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
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
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で実行するモジュール群 を列挙する。記載順に実行される---------------------------------------
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
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
追補2: サンプル・アプリケーションの展開
50
サンプル・アプリケーションの展開①役割を分けたノードへの展開
WEB/ReST/DBの3台の仮想マシンを構築して、それぞれ役割ごとにアプリケーションをインストールしてみましょう。
51
サンプル・アプリケーションの展開②役割を分けたノードへの展開
● 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
サンプル・アプリケーションの展開③役割を分けたノードへの展開
● 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
サンプル・アプリケーションの展開④役割を分けたノードへの展開
● エディタで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
サンプル・アプリケーションの展開⑤役割を分けたノードへの展開
● 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
サンプル・アプリケーションの展開⑥役割を分けたノードへの展開
● 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
追補3:APIによる操作
57
APIによる操作①
APIによる操作クラウド基盤管理の自動化を進めるにあたって、外部プログラムからの制御は必須の要件となります。OpenStackの各コンポーネントは、外部プログラムから制御されることを想定したAPIを提供しています。
58
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クラスのインスタンスリストが取得できます
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
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クラスのリストが取得できます
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クラスのリストが取得できます
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の作成が終わって起動状態となった
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が割り当てられた