Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
RHTN2021.1.14 AnsibleTwitterModuleの話
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
nanodayo
January 14, 2021
Programming
350
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RHTN2021.1.14 AnsibleTwitterModuleの話
RHTN2021.1.14 で話したもの
nanodayo
January 14, 2021
More Decks by nanodayo
See All by nanodayo
RHTN2021.1.14 お料理ハンズオン
nanodayo
0
1.3k
Other Decks in Programming
See All in Programming
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
0
880
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
390
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
Jetpack Compose Mechanisms
skydoves
3
820
The Rails Doctrine Decade
koic
2
590
最近”作らせてる” ローカルAIアプリの話
akit37
0
470
APNsからLive Activityを開始する話
yumnumm
0
170
カツオ、ご期待ください
suneo3476
0
190
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
ChromeでローカルLLM
ryu1013
0
140
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
YesSQL, Process and Tooling at Scale
rocio
174
15k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
RailsConf 2023
tenderlove
30
1.6k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
410
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Code Reviewing Like a Champion
maltzj
529
40k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
990
Transcript
まずは一句 我々も バグか仕様か わからない 詳しくは オープンソース製品の「仕様」 - 赤帽エンジニアブログ にて
Ansible Twitter module の話 Red Hat コンサルタント 松井大輔
Ansible Twitter module とは • Twitterにつぶやきを投稿する。 それだけの機能の Ansible moduleです •
以下で公開中 Ansible Galaxy https://galaxy.ansible.com/nanodayo/twitter GitHub https://github.com/nanodayo/ansible_twitter_module
何故 Ansible twitter module を作ったか 実用性は全く考えてない。ジョークアプリの感覚で作った。 • Ansible Moduleを作ってみたかった •
twitter のAPIも使ってみたかった
Ansible twitter module 開発の道のり
Step1: Ansible module の作り方を調べる • 公式 ◦ Ansible module development:
getting started ◦ https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html • 赤帽エンジニアブログ by ひよこ大佐 ◦ Ansibleのモジュールを開発してみよう ◦ https://rheb.hatenablog.com/entry/develop_ansible_module
Step2: TwitterにAPI Clientを登録 • https://developer.twitter.com/ で アプリの用途等を入力 • ansible_twitter_module で登録
• 自分のアカウントで ansible_twitter_module を 使うためのAPI Keyを発行
Step3: moduleを作る • Python で実装 • Pythonの twitter library https://pypi.org/project/twitter/
• twitter library に必要な値を module のパラメータとして定義 ◦ Twitter のAPI Key ◦ つぶやき内容 module = AnsibleModule( argument_spec={ 'state': {'required': False, 'default': 'present'}, 'server': {'required': False, 'default': 'api.twitter.com'}, 'https': {'required': False, 'type': 'bool', 'default': True}, 'consumer_key': {'required': True}, 'consumer_secret_key': {'required': True}, 'access_token': {'required': True}, 'access_token_secret': {'required': True}, 'tweet': {'required': True} }, ) tweet_text = module.params.get('tweet') tweet_result = Twitter( auth=OAuth( module.params.get('access_token'), module.params.get('access_token_secret'), module.params.get('consumer_key'), module.params.get('consumer_secret_key') ), domain=module.params.get('server'), secure=module.params.get('https') ) try: tweet_result.statuses.update(status=tweet_text)
Step4: つぶやく
Step5: Ansible Galaxy へ登録
Step6: CI対応 • GitHun Action + Toxで実行 • LINT ◦
Pylint, flake8 • Unit test, sanity test ◦ 未着
Step7: 機能拡張 • 公式以外のtwitter サーバを使う ◦ テスト用途 ◦ サーバを指定するための Module
引数を追加 • 既に同じツイートがあった場合は changed にしないで正常終了 ◦ Twitter 側で重複ツイートはNGにしている ◦ Twitter のResponse Codeから判定可 Response Codes | Docs ▪ 同じコード(403, 187)を返す ダミーサーバを作成してテスト @app.route('/1.1/statuses/update.json', methods=['POST']) def post_tweet(): tweet = request.form['status'] if tweet not in tweets: tweets.append(request.form['status']) return "", 200 else: return jsonify({ "errors": [ { "code": 187, "message": "Status is a duplicate." } ] }), 403
実行例 (中略) "item": { "debug_info": { "errors": [ { "code":
187, "message": "Status is a duplicate." } ] }, "tweet": "Ansible moduleからのつぶやきテスト https://galaxy.ansible.com/nanodayo/twitter" } } PLAY RECAP ******************************************************************* *************************************** localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 (中略) "https": true, "server": "api.twitter.com", "state": "present", "tweet": "Ansible moduleからのつぶやきテスト https://galaxy.ansible.com/nanodayo/twitter" } }, "item": { "tweet": "Ansible moduleからのつぶやきテスト https://galaxy.ansible.com/nanodayo/twitter" } } PLAY RECAP ******************************************************************* ******************************************************** localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 重複ツイートがない場合 重複ツイートがある場合
今後の開発計画 • CIのテスト拡充 ◦ Sanity Test ◦ Unit Test •
twitter APIのダミーサーバでのテストをCIに組み込み ◦ CIの中で重複ツイートのテストを実施