SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
OpenStack Osloを使おう
~ cliff編 ~
July Tech Festa 2016
Hideki Saito
Japan OpenStack User Group
Internet Initiative Japan Inc.
JAPAN OPENSTACK USER GROUP 1
JULY TECH FESTA 2016
自己紹介
氏名: 齊藤 秀喜 (さいとう ひでき)
勤務先: 株式会社インターネットイニシアティブ
所属: 日本OpenStackユーザ会 ボードメンバー
趣味: OpenStack / Ansible / Solaris
TwitterID: @saito_hideki
IRC: saitou
JAPAN OPENSTACK USER GROUP 2
JULY TECH FESTA 2016
00
JAPAN OPENSTACK USER GROUP 3
はじめに
JULY TECH FESTA 2016
みなさんに伝えたいこと
はじめに
今日、みなさんに伝えたいこと(2つ)
1.効率的にCLIを開発する手法の紹介
メインロジックに注力するために、OpenStackの成果を
利用しよう!
2.OSSに対する貢献
少しだけ肩の力を抜いてやってみませんか?
JAPAN OPENSTACK USER GROUP 4
JULY TECH FESTA 2016
目次
1. DevOpsとInfrastructure as Code
2. 自分のためにコードを書こう
3. まとめ
4. おまけ - ちょっとエモーショナル
JAPAN OPENSTACK USER GROUP 5
JULY TECH FESTA 2016
01
JAPAN OPENSTACK USER GROUP 6
DevOpsとInfrastructure as
Code
JULY TECH FESTA 2016
Infrastructure as Codeって何だっけ?
Infrastructure as Code
JAPAN OPENSTACK USER GROUP 7
JULY TECH FESTA 2016
[出典] https://en.wikipedia.org/wiki/DevOps<Infrastructure as Codeの真価>
Devの現場で利用されている、QAのような仕組みをOpsの
仕事にも適用できるのが最大のメリット。
• 手順書のコード化 <= 今日の主題
• コードのリビジョンの管理
• チケットシステムによる課題管理
• コードレビュー
• テスト
• デプロイシステム
• インフラの構成管理
コード化により得られる恩恵
JAPAN OPENSTACK USER GROUP 8
JULY TECH FESTA 2016
テスト&激怒 レビューデプロイ
リビジョン管理
課題管理
真の目的に集中したい
DevOpsが定着した現在、われわれインフラエンジニアも、
作業を自動化するために、手順書ではなくコードを書くの
が日常的な仕事の1つとなっています。
しかしながら、日常のオペレーションをコード化しようと
するとき、ソフトウェア開発を生業としていない我々が、
ゼロからコードを書くのは、かなりの苦行です。
JAPAN OPENSTACK USER GROUP 9
JULY TECH FESTA 2016
OpenStackのコンポーネントが利用している
ライブラリが使えないかな?
02
JAPAN OPENSTACK USER GROUP 10
自分のためにコードを
書こう
JULY TECH FESTA 2016
実際にCLIベースのツールを書いてみましょう
OPS♡CLIですよね?
• インフラエンジニアが開発するツールは、CLIベースとなる場合
が多い(当社比) => コマンドライン中心の作業手順をコード化
○
手順書からソフトウェアへ
JAPAN OPENSTACK USER GROUP 11
JULY TECH FESTA 2016
WebUI CLI
△
こんな素敵なCLIを作りたい
JAPAN OPENSTACK USER GROUP 12
JULY TECH FESTA 2016
普通に書いてみる
Slackクライアントを例に、Osloライブラリ群の利用方法を紹介し
ます。
JAPAN OPENSTACK USER GROUP 13
JULY TECH FESTA 2016
メッセージを投稿
Slack CLI
I♡CLI
Slack CLIを書く
事前準備
1.Slackにチームを作成する
➡ 例: coffee4u.slack.com
2.チームにチャネルを追加する
➡ 例: #notice
3.プログラムで利用するBot用のTOKENを取得する
4.python-slackclientをインストールする
5.クライアントコードを書く!
JAPAN OPENSTACK USER GROUP 14
JULY TECH FESTA 2016
Slack CLIを書く
01: import sys
02: from slackclient import SlackClient
03:
04: TOKEN = “自主規制”
05: CHANNEL = "#notice"
06: USER = "misuzu_aoyama"
07: ICON_URL = "https://pbs.twimg.com/profile_images/354648329/600-600_B.jpg"
08:
09: def get_client(token):
10: return SlackClient(token)
11: def check_client(client):
12: result = client.api_call("api.test")
13: return result["ok"]
14: def send_message(client, message):
15: result = client.api_call("chat.postMessage", channel=CHANNEL, username=USER, text=message, icon_url=ICON_URL)
16: return result[“ok"]
17: def main():
18: sc = get_client(TOKEN)
19: if not check_client(sc):
20: sys.stderr.write("Error: {0:s} Invalid connection.n".format(__file__))
21: for message in sys.argv[1:]:
22: print('Send message: "{0:s}" ...'.format(message))
23: result = send_message(sc, message)
24: if result:
25: print('Succeeded')
26: else:
27: print('Failed')
28: if __name__ == "__main__":
29: main()
JAPAN OPENSTACK USER GROUP 15
JULY TECH FESTA 2016
slackのチャネル(#noticeにメッセージを投稿する
Slack CLIを書く - デモ
実際に動かしてみる
JAPAN OPENSTACK USER GROUP 16
JULY TECH FESTA 2016
次のステップとして
JAPAN OPENSTACK USER GROUP 17
JULY TECH FESTA 2016
機能をライブラリ
としてまとめて…
単機能コマンド1
チャネルリスト取得
単機能コマンド2
メンバーリスト取得
単機能コマンド3
メッセージ取得
単機能コマンド4
メッセージ送信
CLI化する
– Oslo Mission Statement –
“To produce a set of python libraries containing code shared by
OpenStack projects. The APIs provided by these libraries should be
high quality, stable, consistent, documented and generally applicable.”
JAPAN OPENSTACK USER GROUP
JULY TECH FESTA 2016
もうすこしブラッシュアップ!
18
OsloのCLIフレームワーク”cliff”
を利用してみよう
Osloが提供するライブラリ群
JAPAN OPENSTACK USER GROUP 19
JULY TECH FESTA 2016
# Name
1 automaton
2 cliff (☆)
3 debtcollector
4 futurist
5 openstack-cookiecutter
6 osprofiler
7 oslo.cache
8 oslo.concurrency
9 oslo.context
10 oslo.config
11 oslo-cookiecutter
12 oslo.db
13 oslo.i18n
14 oslo.log
15 oslo.messaging
16 oslo.middleware
17 oslo.policy
18 oslo.privsep
# Name
19 oslo.reports
20 oslo.rootwrap
21 oslo.serialization
22 oslo.service
23 oslosphinx
24 oslotest
25 oslo.utils
26 oslo.versionedobjects
27 oslo.version
28 oslo.vmware
29 pylockfile
30 hacking
31 pbr (☆)
32 pyCADF
33 stevedore
34 taskflow
35 tooz
- -
OpenStackの各コンポーネント
が、独自に実装していた基本的
な機能を整理して切り出した。
https://wiki.openstack.org/wiki/Oslo
(1)
(2)
CLIに必要な機能を提供するフレームワーク(cliff)とsetuptools用
パッケージマネージャ(pbr)を利用してCLIを書いてみる。
$ git clone https://github.com/saito-hideki/slackcli.git
$ cd slackli && python setup.py build && python setup.py install
slackcli
├── sc
│   ├── __init__.py
│   ├── libsc.py
│    ├── main.py
│    ├── command.py
│    ├── list.py
│    └── show.py
├── setup.cfg
└── setup.py
CLIを書いてパッケージング
JAPAN OPENSTACK USER GROUP 20
JULY TECH FESTA 2016
<cliffがフレームワークを提供>
CLIを書く - cliffを活用
コマンドラインベースのツールに必要な機能、実は3つしかない。
「1.機能実行」・「2.一覧取得」・「3.詳細情報取得」
JAPAN OPENSTACK USER GROUP 21
JULY TECH FESTA 2016
機能を実行
なにかの一覧情報を取得
なにかの詳細情報を取得
CLIを書く - モジュールマップ
pbrはsetuptoolsを少しだけ簡単に使うためのライブラリ。
JAPAN OPENSTACK USER GROUP 22
JULY TECH FESTA 2016
import setuptools
setuptools.setup(
setup_requires=['pbr>=1.8'], pbr=True)
[metadata]
name = sc
summary = Command-Line for Slack
author = Hideki Saito
author-email = saito@fgrep.org
[files]
packages =
sc
[entry_points]
console_scripts =
sc = sc.main:main
sc.cli =
channel_list = sc.list:ChannelList
channel_history = sc.list:ChannelHistory
member_list = sc.list:MemberList
member_show = sc.show:MemberShow
message_send = sc.command:MessagePost
<setup.py> <setup.cfg>
作成するパッケージ名:”sc”
scコマンドのmain()メソッド
サブコマンドとクラスのマップ: ”sc.cli”
定義
$ sc help
<…>
Commands:
channel history Show a list of channel histroy.
channel list Show a list of channels in the slack team.
complete print bash completion command
help print detailed help for another command
member list Show a list of members in the slack team.
member show Show detail information of user
message send Sending message to the specified channel.
CLIを書く - cliffの恩恵
JAPAN OPENSTACK USER GROUP 23
JULY TECH FESTA 2016
今回、scコマンドに実装した機能は以下の通り。
1. チャネルの一覧取得 => "channel list"
2. チームメンバーの一覧取得 => "member list"
3. チームメンバーの情報取得 => "member show"
4. チャネルのメッセージ取得 => "channel history"
5. チャネルへのメッセージ送信 => "message send"
<cliffの恩恵>
help、history、出力フォーマットの指定などの
CLIに必要な共通機能は、利用者が独自実装しなくても
cliffが提供してくれる!!
Slack CLI - デモ
scコマンドを動かしてみます
JAPAN OPENSTACK USER GROUP 24
JULY TECH FESTA 2016
CLIを書く - サンプルコード
import sys, pbr.version
from cliff.app import App
from cliff.commandmanager import CommandManager
version_info = pbr.version.VersionInfo('sc')
class SlackClientCommand(App):
def __init__(self):
super(SlackClientCommand, self).__init__(
description='Slack Command-line Client', version=version_info,
command_manager=CommandManager('sc.cli'), deferred_help=True)
def main(argv=sys.argv[1:]):
return SlackClientCommand().run(argv)
JAPAN OPENSTACK USER GROUP 25
JULY TECH FESTA 2016
<main.py>
"sc"コマンド実行時に呼び出されるcliffのapp.Appを継承したクラスを定義
CommandManagerにsetup.cfgで定義済の"sc.cli"を指定
cliffのapp.Appで定義されているrun()を実行
CLIを書く - サンプルコード
import datetime, os, sc.libsc
from cliff.lister import Lister
def _append_global_args(parser):
parser.add_argument('--token', default=os.environ.get('SC_TOKEN'),
help='Defaults to env[SC_TOKEN] or None.')
return parser
class ChannelList(Lister):
"Show a list of channels in the slack team."
def get_parser(self, prog_name):
parser = super(ChannelList, self).get_parser(prog_name)
parser = _append_global_args(parser)
return parser
def take_action(self, parsed_args):
client = sc.libsc.Client(parsed_args.token)
channels = client.list_channels()
return (('Name', 'Id'),
((name, channels[name]) for name in channels)
)
<…>
JAPAN OPENSTACK USER GROUP 26
JULY TECH FESTA 2016
<list.py>
"token"オプションをコマンドラインに追加する
ために get_parser() をオーバーライド
サブコマンドが指定された際に実行されるメソッド
"channel list"サブコマンド実行時に呼び出されるクラスを定義
一覧を取得する機能なので cliff.lister.Lister を継承する。
戻り値として、((キーのタプル), (キーに対応する値のタプル)) を返す。
CLIを書く - サンプルコード
import os, sc.libsc
from cliff.show import ShowOne
def _append_global_args(parser):
parser.add_argument('--token', default=os.environ.get('SC_TOKEN'),
help='Defaults to env[SC_TOKEN] or None.')
return parser
class MemberShow(ShowOne):
"Show detail information of user"
def get_parser(self, prog_name):
parser = super(MemberShow, self).get_parser(prog_name)
parser.add_argument('name', nargs='?', default='.')
parser = _append_global_args(parser)
return parser
def take_action(self, parsed_args):
client = sc.libsc.Client(parsed_args.token)
result = client.show_member(parsed_args.name)
columns = ('Id', 'Name', 'Email', 'Skype', 'Phone', 'RealName', 'TimeZone', 'Bot')
data = (result['id'], result['name'], result['email'], result['skype'],
result['phone'], result['real_name'], result['tz'], result['is_bot'])
return (columns, data)
JAPAN OPENSTACK USER GROUP 27
JULY TECH FESTA 2016
<show.py>
"member show"サブコマンド実行時に呼び出されるクラスを定義
詳細情報を取得する機能なので cliff.show.ShowOne を継承する。
戻り値の形式は、一覧を取得する場合と同様
sc member list <name> のように
オプションなしの引数を取得する
CLIを書く - サンプルコード
import os, sc.libsc
from cliff.command import Command
class MessagePost(Command):
"Sending message to the specified channel."
def get_parser(self, prog_name):
parser = super(MessagePost, self).get_parser(prog_name)
parser.add_argument('--token', default=os.environ.get('SC_TOKEN'),
help='Defaults to env[SC_TOKEN] or None.')
parser.add_argument('--channel', default='general', help='Defaults to "general"')
parser.add_argument('--user', default='None', help='Defaults to None')
parser.add_argument('--icon_url', default=os.environ.get('SC_ICON_URL'),
help='Defaults to env[SC_ICON_URL] or None.')
parser.add_argument('message', nargs='?', default='')
return parser
def take_action(self, parsed_args):
client = sc.libsc.Client(parsed_args.token)
result = client.send_message(username=parsed_args.user, channel=parsed_args.channel,
message=parsed_args.message, icon_url=parsed_args.icon_url)
print('Send message: "{0:s}" to "{1} channel"'.format(parsed_args.message, parsed_args.channel))
if result:
print('Succeeded')
else:
print('Failed')
JAPAN OPENSTACK USER GROUP 28
JULY TECH FESTA 2016
<command.py>
"message send"サブコマンド実行時に呼び出されるクラスを定義
命令を実行する機能は cliff.command.Command を継承する。
実装の過程 - デモ
実際に実装の過程を
みていきましょう
JAPAN OPENSTACK USER GROUP 29
JULY TECH FESTA 2016
03
JAPAN OPENSTACK USER GROUP 30
まとめ
JULY TECH FESTA 2016
本セッションのまとめ
まとめ
本セッションでは、OpenStackのように巨大なOSSプロダクトの
成果を、インハウスな開発にも応用できる例を紹介しました。
• cliffはCLI開発用のフレームワークです
• CLIで提供したい本来の機能の開発に集中できます
• pbrは独自Pythonコードのパッケージ化を支援してくれます
• cliffとpbrはOsloプロジェクトがメンテナンスしています
• OpenStack OsloはIaaS管理基盤向けのライブラリ群です
• Osloは、さまざまな機能をライブラリとして提供しています
JAPAN OPENSTACK USER GROUP 31
JULY TECH FESTA 2016
04
JAPAN OPENSTACK USER GROUP 32
ちょっとエモーショナル
JULY TECH FESTA 2016
今年は何かいいことしませんか?
社会貢献ってやつですよ:-)
ちょっとエモーショナル
JAPAN OPENSTACK USER GROUP 33
JULY TECH FESTA 2016
我々が得ている
OSSからの恩恵
恩返しをしませんか?
一方的に利用するだけではなく、OSSに貢献してみませんか?
July Tech Festaに参加している皆さんなら、すぐにでもできるこ
とが何かあります!
• OSSのユーザグループに参加してノウハウをシェア(自慢もできて満足)
• 勉強会を企画・運営する
• カンファレンスのボランティアとして協力する
• OSSプロダクトのドキュメント翻訳プロジェクトに参加する
• バグレポートを出す
• コードを書く
• コードをレビューする
• あなたが大富豪なら開発資金を寄付する
JAPAN OPENSTACK USER GROUP 34
JULY TECH FESTA 2016
You can do it if you try:)
Thank you!
JAPAN OPENSTACK USER GROUP 35
JULY TECH FESTA 2016
参考にした情報
• OpenStack
- https://wiki.openstack.org/wiki/Main_Page
• Oslo - OpenStack
- https://wiki.openstack.org/wiki/Oslo
• Contribute to OpenStack
- https://wiki.openstack.org/wiki/How_To_Contribute
• python-slackclient
- http://python-slackclient.readthedocs.io/en/latest/index.html
• Slack - Creating and regenerating API tokens
- https://api.slack.com/bot-users
JAPAN OPENSTACK USER GROUP 36
JULY TECH FESTA 2016

Mais conteúdo relacionado

Mais procurados

[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
OpenStack Korea Community
 

Mais procurados (20)

Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
 Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編 Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
 
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
 
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Red Hat OpenStack 17 저자직강+스터디그룹_1주차Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
 
OVN 設定サンプル | OVN config example 2015/12/27
OVN 設定サンプル | OVN config example 2015/12/27OVN 設定サンプル | OVN config example 2015/12/27
OVN 設定サンプル | OVN config example 2015/12/27
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
OpenStackでも重要な役割を果たすPacemakerを知ろう!
OpenStackでも重要な役割を果たすPacemakerを知ろう!OpenStackでも重要な役割を果たすPacemakerを知ろう!
OpenStackでも重要な役割を果たすPacemakerを知ろう!
 
ONIC-Japan-2019-OVN public
ONIC-Japan-2019-OVN publicONIC-Japan-2019-OVN public
ONIC-Japan-2019-OVN public
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Keystone fernet token
Keystone fernet tokenKeystone fernet token
Keystone fernet token
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能
 
Prometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start PrometeusPrometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start Prometeus
 
君にもできる! にゅーとろん君になってみよー!! 「Neutronになって理解するOpenStack Net - OpenStack最新情報セミナー ...
君にもできる! にゅーとろん君になってみよー!!  「Neutronになって理解するOpenStack Net - OpenStack最新情報セミナー ...君にもできる! にゅーとろん君になってみよー!!  「Neutronになって理解するOpenStack Net - OpenStack最新情報セミナー ...
君にもできる! にゅーとろん君になってみよー!! 「Neutronになって理解するOpenStack Net - OpenStack最新情報セミナー ...
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
 
大規模サービスを支えるネットワークインフラの全貌
大規模サービスを支えるネットワークインフラの全貌大規模サービスを支えるネットワークインフラの全貌
大規模サービスを支えるネットワークインフラの全貌
 
AvailabilityZoneとHostAggregate
AvailabilityZoneとHostAggregateAvailabilityZoneとHostAggregate
AvailabilityZoneとHostAggregate
 
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
 

Destaque

Google Container Engine と Kubernetes で 無理をしないコンテナ管理
Google Container Engine と Kubernetes で 無理をしないコンテナ管理Google Container Engine と Kubernetes で 無理をしないコンテナ管理
Google Container Engine と Kubernetes で 無理をしないコンテナ管理
Ryosuke Suto
 

Destaque (11)

OpenStack 最新動向 2016/11
OpenStack 最新動向 2016/11OpenStack 最新動向 2016/11
OpenStack 最新動向 2016/11
 
密かに話題のBufferbloat
密かに話題のBufferbloat密かに話題のBufferbloat
密かに話題のBufferbloat
 
Nutanixってナニ?
Nutanixってナニ?Nutanixってナニ?
Nutanixってナニ?
 
Nutanixを導入してみて思ったこと(仮)
Nutanixを導入してみて思ったこと(仮)Nutanixを導入してみて思ったこと(仮)
Nutanixを導入してみて思ったこと(仮)
 
Google Container Engine と Kubernetes で 無理をしないコンテナ管理
Google Container Engine と Kubernetes で 無理をしないコンテナ管理Google Container Engine と Kubernetes で 無理をしないコンテナ管理
Google Container Engine と Kubernetes で 無理をしないコンテナ管理
 
Yahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumi
Yahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumiYahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumi
Yahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumi
 
実用段階に入ったOpenStack ~ もうすぐ絶滅するというPrivate Cloudの多様性について ~
実用段階に入ったOpenStack ~ もうすぐ絶滅するというPrivate Cloudの多様性について ~実用段階に入ったOpenStack ~ もうすぐ絶滅するというPrivate Cloudの多様性について ~
実用段階に入ったOpenStack ~ もうすぐ絶滅するというPrivate Cloudの多様性について ~
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
OpenStack on OpenStack
OpenStack on OpenStackOpenStack on OpenStack
OpenStack on OpenStack
 
mTCP使ってみた
mTCP使ってみたmTCP使ってみた
mTCP使ってみた
 
Fluentd vs. Logstash for OpenStack Log Management
Fluentd vs. Logstash for OpenStack Log ManagementFluentd vs. Logstash for OpenStack Log Management
Fluentd vs. Logstash for OpenStack Log Management
 

Semelhante a OpenStack Osloを使おう - cliff編

Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
irix_jp
 
OSC2013 Tokyo Spring OpenStack Overview
OSC2013 Tokyo Spring OpenStack OverviewOSC2013 Tokyo Spring OpenStack Overview
OSC2013 Tokyo Spring OpenStack Overview
irix_jp
 
JTF2014:OpenStackの概要と最新技術動向
JTF2014:OpenStackの概要と最新技術動向JTF2014:OpenStackの概要と最新技術動向
JTF2014:OpenStackの概要と最新技術動向
irix_jp
 
CloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/SwiftCloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/Swift
irix_jp
 
Open stack nova_austin報告書
Open stack nova_austin報告書Open stack nova_austin報告書
Open stack nova_austin報告書
Yasuhiro Arai
 
OpenCloudCampus : Cloud Technologies Meeting (OpenStack)
OpenCloudCampus : Cloud Technologies Meeting (OpenStack)OpenCloudCampus : Cloud Technologies Meeting (OpenStack)
OpenCloudCampus : Cloud Technologies Meeting (OpenStack)
Masanori Itoh
 

Semelhante a OpenStack Osloを使おう - cliff編 (20)

OpenStackをさらに”使う”技術 概要と基礎操作
OpenStackをさらに”使う”技術 概要と基礎操作OpenStackをさらに”使う”技術 概要と基礎操作
OpenStackをさらに”使う”技術 概要と基礎操作
 
OpenStack Now!
OpenStack Now!OpenStack Now!
OpenStack Now!
 
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
 
Ansible2とOpenStackの関係
Ansible2とOpenStackの関係Ansible2とOpenStackの関係
Ansible2とOpenStackの関係
 
OSC2013 Tokyo Spring OpenStack Overview
OSC2013 Tokyo Spring OpenStack OverviewOSC2013 Tokyo Spring OpenStack Overview
OSC2013 Tokyo Spring OpenStack Overview
 
JTF2014:OpenStackの概要と最新技術動向
JTF2014:OpenStackの概要と最新技術動向JTF2014:OpenStackの概要と最新技術動向
JTF2014:OpenStackの概要と最新技術動向
 
OSC2013 Tokyo/Spring JOSUG
OSC2013 Tokyo/Spring JOSUGOSC2013 Tokyo/Spring JOSUG
OSC2013 Tokyo/Spring JOSUG
 
OpenStackSDK with Ansible
OpenStackSDK with AnsibleOpenStackSDK with Ansible
OpenStackSDK with Ansible
 
CEDEC2015_OpenStack で運用する Private Cloud の泥臭い(リアル)な話
CEDEC2015_OpenStack で運用する Private Cloud の泥臭い(リアル)な話CEDEC2015_OpenStack で運用する Private Cloud の泥臭い(リアル)な話
CEDEC2015_OpenStack で運用する Private Cloud の泥臭い(リアル)な話
 
パブリッククラウドConoHaを使ってOpenStack APIを理解する
パブリッククラウドConoHaを使ってOpenStack APIを理解するパブリッククラウドConoHaを使ってOpenStack APIを理解する
パブリッククラウドConoHaを使ってOpenStack APIを理解する
 
OpenStack on Softlayer
OpenStack on SoftlayerOpenStack on Softlayer
OpenStack on Softlayer
 
JJUG CCC 2014 ATL
JJUG CCC 2014 ATLJJUG CCC 2014 ATL
JJUG CCC 2014 ATL
 
OpenStack Summit Austin 2016 参加報告 - OpenStack最新情報セミナー 2016年5月
OpenStack Summit Austin 2016 参加報告 - OpenStack最新情報セミナー 2016年5月OpenStack Summit Austin 2016 参加報告 - OpenStack最新情報セミナー 2016年5月
OpenStack Summit Austin 2016 参加報告 - OpenStack最新情報セミナー 2016年5月
 
OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料
 
CloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/SwiftCloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/Swift
 
Open stack nova_austin報告書
Open stack nova_austin報告書Open stack nova_austin報告書
Open stack nova_austin報告書
 
Invitation to the Open Cloud Campus #osckansai 2011
Invitation to the Open Cloud Campus #osckansai 2011Invitation to the Open Cloud Campus #osckansai 2011
Invitation to the Open Cloud Campus #osckansai 2011
 
OpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR OpsOpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR Ops
 
OpenCloudCampus : Cloud Technologies Meeting (OpenStack)
OpenCloudCampus : Cloud Technologies Meeting (OpenStack)OpenCloudCampus : Cloud Technologies Meeting (OpenStack)
OpenCloudCampus : Cloud Technologies Meeting (OpenStack)
 
Japan OSS promotion Forum symposium - Neaoss wg2 activity
Japan OSS promotion Forum symposium - Neaoss wg2 activityJapan OSS promotion Forum symposium - Neaoss wg2 activity
Japan OSS promotion Forum symposium - Neaoss wg2 activity
 

Mais de Hideki Saito

Mais de Hideki Saito (20)

これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024
 
Ansible automationplatform product updates 2021
Ansible automationplatform product updates 2021Ansible automationplatform product updates 2021
Ansible automationplatform product updates 2021
 
Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021
 
Ansible Fest 2020 技術トピックまとめ
Ansible Fest 2020 技術トピックまとめAnsible Fest 2020 技術トピックまとめ
Ansible Fest 2020 技術トピックまとめ
 
Getting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NGGetting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NG
 
Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007
 
How to contribute code to ansible awx
How to contribute code to ansible awxHow to contribute code to ansible awx
How to contribute code to ansible awx
 
Update: Ansible Tower 3.6.0
Update: Ansible Tower 3.6.0Update: Ansible Tower 3.6.0
Update: Ansible Tower 3.6.0
 
How to contribute AWX
How to contribute AWXHow to contribute AWX
How to contribute AWX
 
Ansible Tower on OpenShift
Ansible Tower on OpenShiftAnsible Tower on OpenShift
Ansible Tower on OpenShift
 
IT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWXIT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWX
 
IT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWXIT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWX
 
Ansible with AWX
Ansible with AWXAnsible with AWX
Ansible with AWX
 
Ansible101
Ansible101Ansible101
Ansible101
 
Ansible handson ood2016
Ansible handson ood2016Ansible handson ood2016
Ansible handson ood2016
 
Ansible handson
Ansible handsonAnsible handson
Ansible handson
 
OpenStack & Ansible で実現する自動化
OpenStack & Ansible で実現する自動化OpenStack & Ansible で実現する自動化
OpenStack & Ansible で実現する自動化
 
Okinawa Open Days 2015 Handson - Ansible
Okinawa Open Days 2015 Handson - AnsibleOkinawa Open Days 2015 Handson - Ansible
Okinawa Open Days 2015 Handson - Ansible
 
OpenStack with SR-IOV
OpenStack with SR-IOVOpenStack with SR-IOV
OpenStack with SR-IOV
 
Ansible meetuptokyo 2015 Dynamic Inventory
Ansible meetuptokyo 2015 Dynamic InventoryAnsible meetuptokyo 2015 Dynamic Inventory
Ansible meetuptokyo 2015 Dynamic Inventory
 

OpenStack Osloを使おう - cliff編

  • 1. OpenStack Osloを使おう ~ cliff編 ~ July Tech Festa 2016 Hideki Saito Japan OpenStack User Group Internet Initiative Japan Inc. JAPAN OPENSTACK USER GROUP 1 JULY TECH FESTA 2016
  • 2. 自己紹介 氏名: 齊藤 秀喜 (さいとう ひでき) 勤務先: 株式会社インターネットイニシアティブ 所属: 日本OpenStackユーザ会 ボードメンバー 趣味: OpenStack / Ansible / Solaris TwitterID: @saito_hideki IRC: saitou JAPAN OPENSTACK USER GROUP 2 JULY TECH FESTA 2016
  • 3. 00 JAPAN OPENSTACK USER GROUP 3 はじめに JULY TECH FESTA 2016 みなさんに伝えたいこと
  • 5. 目次 1. DevOpsとInfrastructure as Code 2. 自分のためにコードを書こう 3. まとめ 4. おまけ - ちょっとエモーショナル JAPAN OPENSTACK USER GROUP 5 JULY TECH FESTA 2016
  • 6. 01 JAPAN OPENSTACK USER GROUP 6 DevOpsとInfrastructure as Code JULY TECH FESTA 2016 Infrastructure as Codeって何だっけ?
  • 7. Infrastructure as Code JAPAN OPENSTACK USER GROUP 7 JULY TECH FESTA 2016 [出典] https://en.wikipedia.org/wiki/DevOps<Infrastructure as Codeの真価> Devの現場で利用されている、QAのような仕組みをOpsの 仕事にも適用できるのが最大のメリット。 • 手順書のコード化 <= 今日の主題 • コードのリビジョンの管理 • チケットシステムによる課題管理 • コードレビュー • テスト • デプロイシステム • インフラの構成管理
  • 8. コード化により得られる恩恵 JAPAN OPENSTACK USER GROUP 8 JULY TECH FESTA 2016 テスト&激怒 レビューデプロイ リビジョン管理 課題管理
  • 10. 02 JAPAN OPENSTACK USER GROUP 10 自分のためにコードを 書こう JULY TECH FESTA 2016 実際にCLIベースのツールを書いてみましょう
  • 11. OPS♡CLIですよね? • インフラエンジニアが開発するツールは、CLIベースとなる場合 が多い(当社比) => コマンドライン中心の作業手順をコード化 ○ 手順書からソフトウェアへ JAPAN OPENSTACK USER GROUP 11 JULY TECH FESTA 2016 WebUI CLI △
  • 14. Slack CLIを書く 事前準備 1.Slackにチームを作成する ➡ 例: coffee4u.slack.com 2.チームにチャネルを追加する ➡ 例: #notice 3.プログラムで利用するBot用のTOKENを取得する 4.python-slackclientをインストールする 5.クライアントコードを書く! JAPAN OPENSTACK USER GROUP 14 JULY TECH FESTA 2016
  • 15. Slack CLIを書く 01: import sys 02: from slackclient import SlackClient 03: 04: TOKEN = “自主規制” 05: CHANNEL = "#notice" 06: USER = "misuzu_aoyama" 07: ICON_URL = "https://pbs.twimg.com/profile_images/354648329/600-600_B.jpg" 08: 09: def get_client(token): 10: return SlackClient(token) 11: def check_client(client): 12: result = client.api_call("api.test") 13: return result["ok"] 14: def send_message(client, message): 15: result = client.api_call("chat.postMessage", channel=CHANNEL, username=USER, text=message, icon_url=ICON_URL) 16: return result[“ok"] 17: def main(): 18: sc = get_client(TOKEN) 19: if not check_client(sc): 20: sys.stderr.write("Error: {0:s} Invalid connection.n".format(__file__)) 21: for message in sys.argv[1:]: 22: print('Send message: "{0:s}" ...'.format(message)) 23: result = send_message(sc, message) 24: if result: 25: print('Succeeded') 26: else: 27: print('Failed') 28: if __name__ == "__main__": 29: main() JAPAN OPENSTACK USER GROUP 15 JULY TECH FESTA 2016 slackのチャネル(#noticeにメッセージを投稿する
  • 16. Slack CLIを書く - デモ 実際に動かしてみる JAPAN OPENSTACK USER GROUP 16 JULY TECH FESTA 2016
  • 17. 次のステップとして JAPAN OPENSTACK USER GROUP 17 JULY TECH FESTA 2016 機能をライブラリ としてまとめて… 単機能コマンド1 チャネルリスト取得 単機能コマンド2 メンバーリスト取得 単機能コマンド3 メッセージ取得 単機能コマンド4 メッセージ送信 CLI化する
  • 18. – Oslo Mission Statement – “To produce a set of python libraries containing code shared by OpenStack projects. The APIs provided by these libraries should be high quality, stable, consistent, documented and generally applicable.” JAPAN OPENSTACK USER GROUP JULY TECH FESTA 2016 もうすこしブラッシュアップ! 18 OsloのCLIフレームワーク”cliff” を利用してみよう
  • 19. Osloが提供するライブラリ群 JAPAN OPENSTACK USER GROUP 19 JULY TECH FESTA 2016 # Name 1 automaton 2 cliff (☆) 3 debtcollector 4 futurist 5 openstack-cookiecutter 6 osprofiler 7 oslo.cache 8 oslo.concurrency 9 oslo.context 10 oslo.config 11 oslo-cookiecutter 12 oslo.db 13 oslo.i18n 14 oslo.log 15 oslo.messaging 16 oslo.middleware 17 oslo.policy 18 oslo.privsep # Name 19 oslo.reports 20 oslo.rootwrap 21 oslo.serialization 22 oslo.service 23 oslosphinx 24 oslotest 25 oslo.utils 26 oslo.versionedobjects 27 oslo.version 28 oslo.vmware 29 pylockfile 30 hacking 31 pbr (☆) 32 pyCADF 33 stevedore 34 taskflow 35 tooz - - OpenStackの各コンポーネント が、独自に実装していた基本的 な機能を整理して切り出した。 https://wiki.openstack.org/wiki/Oslo
  • 20. (1) (2) CLIに必要な機能を提供するフレームワーク(cliff)とsetuptools用 パッケージマネージャ(pbr)を利用してCLIを書いてみる。 $ git clone https://github.com/saito-hideki/slackcli.git $ cd slackli && python setup.py build && python setup.py install slackcli ├── sc │   ├── __init__.py │   ├── libsc.py │    ├── main.py │    ├── command.py │    ├── list.py │    └── show.py ├── setup.cfg └── setup.py CLIを書いてパッケージング JAPAN OPENSTACK USER GROUP 20 JULY TECH FESTA 2016
  • 22. CLIを書く - モジュールマップ pbrはsetuptoolsを少しだけ簡単に使うためのライブラリ。 JAPAN OPENSTACK USER GROUP 22 JULY TECH FESTA 2016 import setuptools setuptools.setup( setup_requires=['pbr>=1.8'], pbr=True) [metadata] name = sc summary = Command-Line for Slack author = Hideki Saito author-email = saito@fgrep.org [files] packages = sc [entry_points] console_scripts = sc = sc.main:main sc.cli = channel_list = sc.list:ChannelList channel_history = sc.list:ChannelHistory member_list = sc.list:MemberList member_show = sc.show:MemberShow message_send = sc.command:MessagePost <setup.py> <setup.cfg> 作成するパッケージ名:”sc” scコマンドのmain()メソッド サブコマンドとクラスのマップ: ”sc.cli” 定義 $ sc help <…> Commands: channel history Show a list of channel histroy. channel list Show a list of channels in the slack team. complete print bash completion command help print detailed help for another command member list Show a list of members in the slack team. member show Show detail information of user message send Sending message to the specified channel.
  • 23. CLIを書く - cliffの恩恵 JAPAN OPENSTACK USER GROUP 23 JULY TECH FESTA 2016 今回、scコマンドに実装した機能は以下の通り。 1. チャネルの一覧取得 => "channel list" 2. チームメンバーの一覧取得 => "member list" 3. チームメンバーの情報取得 => "member show" 4. チャネルのメッセージ取得 => "channel history" 5. チャネルへのメッセージ送信 => "message send" <cliffの恩恵> help、history、出力フォーマットの指定などの CLIに必要な共通機能は、利用者が独自実装しなくても cliffが提供してくれる!!
  • 24. Slack CLI - デモ scコマンドを動かしてみます JAPAN OPENSTACK USER GROUP 24 JULY TECH FESTA 2016
  • 25. CLIを書く - サンプルコード import sys, pbr.version from cliff.app import App from cliff.commandmanager import CommandManager version_info = pbr.version.VersionInfo('sc') class SlackClientCommand(App): def __init__(self): super(SlackClientCommand, self).__init__( description='Slack Command-line Client', version=version_info, command_manager=CommandManager('sc.cli'), deferred_help=True) def main(argv=sys.argv[1:]): return SlackClientCommand().run(argv) JAPAN OPENSTACK USER GROUP 25 JULY TECH FESTA 2016 <main.py> "sc"コマンド実行時に呼び出されるcliffのapp.Appを継承したクラスを定義 CommandManagerにsetup.cfgで定義済の"sc.cli"を指定 cliffのapp.Appで定義されているrun()を実行
  • 26. CLIを書く - サンプルコード import datetime, os, sc.libsc from cliff.lister import Lister def _append_global_args(parser): parser.add_argument('--token', default=os.environ.get('SC_TOKEN'), help='Defaults to env[SC_TOKEN] or None.') return parser class ChannelList(Lister): "Show a list of channels in the slack team." def get_parser(self, prog_name): parser = super(ChannelList, self).get_parser(prog_name) parser = _append_global_args(parser) return parser def take_action(self, parsed_args): client = sc.libsc.Client(parsed_args.token) channels = client.list_channels() return (('Name', 'Id'), ((name, channels[name]) for name in channels) ) <…> JAPAN OPENSTACK USER GROUP 26 JULY TECH FESTA 2016 <list.py> "token"オプションをコマンドラインに追加する ために get_parser() をオーバーライド サブコマンドが指定された際に実行されるメソッド "channel list"サブコマンド実行時に呼び出されるクラスを定義 一覧を取得する機能なので cliff.lister.Lister を継承する。 戻り値として、((キーのタプル), (キーに対応する値のタプル)) を返す。
  • 27. CLIを書く - サンプルコード import os, sc.libsc from cliff.show import ShowOne def _append_global_args(parser): parser.add_argument('--token', default=os.environ.get('SC_TOKEN'), help='Defaults to env[SC_TOKEN] or None.') return parser class MemberShow(ShowOne): "Show detail information of user" def get_parser(self, prog_name): parser = super(MemberShow, self).get_parser(prog_name) parser.add_argument('name', nargs='?', default='.') parser = _append_global_args(parser) return parser def take_action(self, parsed_args): client = sc.libsc.Client(parsed_args.token) result = client.show_member(parsed_args.name) columns = ('Id', 'Name', 'Email', 'Skype', 'Phone', 'RealName', 'TimeZone', 'Bot') data = (result['id'], result['name'], result['email'], result['skype'], result['phone'], result['real_name'], result['tz'], result['is_bot']) return (columns, data) JAPAN OPENSTACK USER GROUP 27 JULY TECH FESTA 2016 <show.py> "member show"サブコマンド実行時に呼び出されるクラスを定義 詳細情報を取得する機能なので cliff.show.ShowOne を継承する。 戻り値の形式は、一覧を取得する場合と同様 sc member list <name> のように オプションなしの引数を取得する
  • 28. CLIを書く - サンプルコード import os, sc.libsc from cliff.command import Command class MessagePost(Command): "Sending message to the specified channel." def get_parser(self, prog_name): parser = super(MessagePost, self).get_parser(prog_name) parser.add_argument('--token', default=os.environ.get('SC_TOKEN'), help='Defaults to env[SC_TOKEN] or None.') parser.add_argument('--channel', default='general', help='Defaults to "general"') parser.add_argument('--user', default='None', help='Defaults to None') parser.add_argument('--icon_url', default=os.environ.get('SC_ICON_URL'), help='Defaults to env[SC_ICON_URL] or None.') parser.add_argument('message', nargs='?', default='') return parser def take_action(self, parsed_args): client = sc.libsc.Client(parsed_args.token) result = client.send_message(username=parsed_args.user, channel=parsed_args.channel, message=parsed_args.message, icon_url=parsed_args.icon_url) print('Send message: "{0:s}" to "{1} channel"'.format(parsed_args.message, parsed_args.channel)) if result: print('Succeeded') else: print('Failed') JAPAN OPENSTACK USER GROUP 28 JULY TECH FESTA 2016 <command.py> "message send"サブコマンド実行時に呼び出されるクラスを定義 命令を実行する機能は cliff.command.Command を継承する。
  • 30. 03 JAPAN OPENSTACK USER GROUP 30 まとめ JULY TECH FESTA 2016 本セッションのまとめ
  • 31. まとめ 本セッションでは、OpenStackのように巨大なOSSプロダクトの 成果を、インハウスな開発にも応用できる例を紹介しました。 • cliffはCLI開発用のフレームワークです • CLIで提供したい本来の機能の開発に集中できます • pbrは独自Pythonコードのパッケージ化を支援してくれます • cliffとpbrはOsloプロジェクトがメンテナンスしています • OpenStack OsloはIaaS管理基盤向けのライブラリ群です • Osloは、さまざまな機能をライブラリとして提供しています JAPAN OPENSTACK USER GROUP 31 JULY TECH FESTA 2016
  • 32. 04 JAPAN OPENSTACK USER GROUP 32 ちょっとエモーショナル JULY TECH FESTA 2016 今年は何かいいことしませんか? 社会貢献ってやつですよ:-)
  • 33. ちょっとエモーショナル JAPAN OPENSTACK USER GROUP 33 JULY TECH FESTA 2016 我々が得ている OSSからの恩恵
  • 34. 恩返しをしませんか? 一方的に利用するだけではなく、OSSに貢献してみませんか? July Tech Festaに参加している皆さんなら、すぐにでもできるこ とが何かあります! • OSSのユーザグループに参加してノウハウをシェア(自慢もできて満足) • 勉強会を企画・運営する • カンファレンスのボランティアとして協力する • OSSプロダクトのドキュメント翻訳プロジェクトに参加する • バグレポートを出す • コードを書く • コードをレビューする • あなたが大富豪なら開発資金を寄付する JAPAN OPENSTACK USER GROUP 34 JULY TECH FESTA 2016
  • 35. You can do it if you try:) Thank you! JAPAN OPENSTACK USER GROUP 35 JULY TECH FESTA 2016
  • 36. 参考にした情報 • OpenStack - https://wiki.openstack.org/wiki/Main_Page • Oslo - OpenStack - https://wiki.openstack.org/wiki/Oslo • Contribute to OpenStack - https://wiki.openstack.org/wiki/How_To_Contribute • python-slackclient - http://python-slackclient.readthedocs.io/en/latest/index.html • Slack - Creating and regenerating API tokens - https://api.slack.com/bot-users JAPAN OPENSTACK USER GROUP 36 JULY TECH FESTA 2016