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
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
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
440
Android CLI
fornewid
0
180
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
210
5分で問診!Composer セキュリティ健康診断
codmoninc
0
610
自作OSでスライド発表する
uyuki234
1
3.9k
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
霧の中の代数的エフェクト
funnyycat
1
430
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
110
継続モナドとリアクティブプログラミング
yukikurage
3
650
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
280
数百円から始めるRuby電子工作
tarosay
0
110
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
170
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
360
Building Adaptive Systems
keathley
44
3.1k
Docker and Python
trallard
47
4k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
250
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
190
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
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の中で重複ツイートのテストを実施