Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RHTN2021.1.14 AnsibleTwitterModuleの話
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
nanodayo
January 14, 2021
Programming
340
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
Lessons from Spec-Driven Development
simas
PRO
0
200
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
580
RTSPクライアントを自作してみた話
simotin13
0
610
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.1k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
760
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
120
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
250
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
540
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
260
Creating Composable Callables in Contemporary C++
rollbear
0
130
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
200
AIで効率化できた業務・日常
ochtum
0
140
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
Six Lessons from altMBA
skipperchong
29
4.3k
Leo the Paperboy
mayatellez
7
1.8k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Deep Space Network (abreviated)
tonyrice
0
170
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Claude Code のすすめ
schroneko
67
230k
Odyssey Design
rkendrick25
PRO
2
700
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
160
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Done Done
chrislema
186
16k
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の中で重複ツイートのテストを実施