Ansibleのドキュメント検索とGitHubアクセスをサポートするChrome拡張を作ってみた

本記事は[Ansible 2 Advent Calendar 2019(通称:裏アドカレ)](https://qiita.com/advent-calendar/2019/ansible2)の23日目のエントリになります。
Ansibleの技術的な話でなく、便利に使うツールの話です。

# TL;DR

Ansibleのドキュメント検索とモジュール・プラグインのGitHub上のソースへのアクセスが簡単になるChrome拡張作ってみました。
[usansible - Chrome ウェブストア](https://chrome.google.com/webstore/detail/usansible/aphgdbhkenbiokjnafmboeagdhjkafee?hl=ja&gl=JP)

このChrome拡張を入れると、次の2つの機能が使えるようになります。

1. アドレスバーに`usa`と入力すると、Ansible Documentationサイトの検索モードになるので、そのままキーワード入力してEnter押下すればSearch Resultへ一気に飛べます

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/b6644bb3-9585-1e71-bb19-489f4ddcafc4.png)

2. モジュールまたはプラグインのドキュメントページの右上の"Edit on GitHub"の横に"View Source"というリンクを差し込みます。GitHub上のソースへ直接アクセスできます

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/80990308-b834-8541-2e23-5c857dedafc6.png)

    ちなみにドキュメントの表示しているバージョン(latestとかdevelとか特定バージョン)に応じて、GitHubのブランチも自動で切り替えます。

# 作ったきっかけ

[表アドベントカレンダー2日目](https://qiita.com/advent-calendar/2019/ansible)の[Go で作る Ansible モジュール - ちゃんるいすのブログ](https://blog.luispc.com/entry/ansible-advent-calendar-2019)がとても分かりやすく、というよりはモジュール作成はこれまで手付かずだったけど意外と簡単にできるんだなと思って自分もチャレンジしようとしたのですが、モジュール作成ネタは他のみなさんやってそうでネタかぶり不可避だったので、ちょっと企画を再考してみました。
モジュール作成に関しては、[裏アドカレ13日目の「シェルスクリプトでAnsibleモジュールを作ってみる | 日常系エンジニアのTech Blog」](https://sky-joker.tech/2019/12/13/%e3%82%b7%e3%82%a7%e3%83%ab%e3%82%b9%e3%82%af%e3%83%aa%e3%83%95%e3%82%9a%e3%83%88%e3%81%a6%e3%82%99ansible%e3%83%a2%e3%82%b7%e3%82%99%e3%83%a5%e3%83%bc%e3%83%ab%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6/)も、とても分かりやすかったです。

## GitHubへのリンク追加機能

モジュールやプラグインの検索は[Ansible Documentationサイト](https://docs.ansible.com/ansible/latest/index.html)の画面左側の検索機能で精度も良いし特に不自由してなかったのですが、モジュールに対するツッコんだ質問されて「ドキュメントにはそう書かれてるけど、どういう仕組みでそう動作するのか」をチェックしたいときに、やっぱりソースコードを確認したいケースがありました。

でそのとき、ドキュメントのページからGitHubのソースへ直接アクセスできれば楽だと思いつつ、ドキュメントページの右上に「Edit on GitHub」というリンクあるのにソースに直接飛べなくてぐぬぬって感じだったので、ここにソースのURLを差し込めたらハッピーだなと思って作り始めました。

## ドキュメント検索機能

これはChromeの設定の「検索エンジンの管理」で、キーワードとそれに対するクエリURLを入力することで、手動でも設定することができます。
が、拡張で設定できたら楽で良いよね、といことで、追加で組み込みました。

# 仕組み

拡張のソースは[GitHubに公開](https://github.com/zaki-lknr/usansible)しているので、興味があればチェックしてみてください。

## GitHubへのリンク

これは[Content Scripts](https://developer.chrome.com/extensions/content_scripts)を使用して、表示しているページの情報を取得・ソースの書き換えを行っています。
UIを実装しないため、Chrome拡張開発の解説記事でよく出てくる[browser_action](https://developer.chrome.com/extensions/browserAction)と[page_action](https://developer.chrome.com/extensions/pageAction)は使用しませんでした。

基本的にはモジュールとプラグインのAnsibleドキュメントサイトのページ内から、GitHubへの(Edit用の)リンクを拾って整形し、元々ある「Edit on GitHub」のところに差し込むという処理を行っています。
JavaScriptの読み書きができる方であればそんなに難しくないと思います。(私はGoogle Apps ScriptくらいでしかJavaScript使えないので苦労しましたがｗ)

具体的には、ページ下部の「Hint」のブロック内にある"edit this document"のリンクをベースにソースファイルへのリンクを組み立てています。
(ページ上部の"Edit on GitHub"のリンクだと、プラグインのURLの場合にうまく拾えなかった)

ブランチ名については開いているURLをベースに、"devel"はそのまま、"latest"は`<meta class="swiftype">`内から、それ以外はそのまま`stable-***`に置き換え。

参考にしたサイト

- [Chrome 拡張機能のマニフェストファイルの書き方 - Qiita](https://qiita.com/mdstoy/items/9866544e37987337dc79)
- [Chromeブラウザの拡張機能を作ってみたい初心者向けに開発方法を紹介！【サンプルあり】 - Qiita](https://qiita.com/guru_taka/items/37a90766f4f845e963e5)
- [Chromeのオリジナル拡張機能を開発しよう（ソースコードあり） | 東京上野のWeb制作会社LIG](https://liginc.co.jp/web/tool/browser/163575)
- [超最低限の Chrome エクステンションを開発しウェブストアで公開するまでの手順 - Qiita](https://qiita.com/otchy/items/e29bf2e377c5b7ddc2f7)

## 検索

これはChrome拡張のAPIの一つで[omnibox](https://developer.chrome.com/extensions/omnibox)というものを使っています。
ほぼ教科書通りで、サジェスト機能は今回は実装していないので作りはかなりシンプルです。
クラスメソッドさんの記事がわかりやすかったです。
[Google Chrome Extensionを作ってみた-その9- ｜ Developers.IO](https://dev.classmethod.jp/etc/google-chrome-extension-9/)

モジュール名やプラグイン名をサジェストできるとかなり便利になりそうですが、たぶんキーワードを自前で持っておかないといけない感じなので、(無理ではないけど)メンテナンスは難しそう。

# 拡張の公開

正直言って(何らかのアプリをpublicなストアで公開するときは大抵そうなのですが)ここが一番苦労しました。
アイコンの用意とアプリの詳細説明です。(英語で書いたのですが、多分日本語でも良いかも)
ちなみに、Androidアプリに比べると入力欄は少ないです。

あまり情報をチェックせずに画面に従って操作していったので、手順を簡単にメモ。

## ダッシュボード

Chromeウェブストアのこの辺から。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/8b63578e-c34f-1995-3a7c-36c2f6217e16.png)

もしなければここから直接。

[デベロッパー ダッシュボード - Chrome ウェブストア](https://chrome.google.com/webstore/developer/dashboard)

## お布施

初回(アプリ単位でなくアカウントの)登録は$5の登録料が必要です。
Googleウォレットとかでカード情報をGoogleに登録していればさくさく処理できます。

## アイテムの登録

拡張の登録です。
デベロッパーモードをonにしてローカル検証している際に「拡張機能をパッケージ化」というメニューがありますが、実はこれは使いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/3852e27d-d5e2-c3e2-a9de-3f952ab11bec.png)

ソースコード一式をzip圧縮して、それをアップロードすることになってます。
私は[srcディレクトリ以下](https://github.com/zaki-lknr/usansible/tree/master/src)をzipにアーカイブ(7zip32使用)したものを用意しました。

## 画像の用意

さまざまな解像度の画像を用意する必要があります。これが大変だった…

- アイコン
    - アプリに埋め込んだのと別で必要っぽい
    - 128x128 で用意する
        - ただし四角形アイコンの場合は96x96で用意し、外周16pixelはアルファ使って透過せよとの指示
        - 円形アイコンの場合は112x112が見える範囲で、残りの外側はアルファ使って透過
        - あと[平坦じゃないデザインのアイコンはNG](https://developer.chrome.com/webstore/images#perspective)とのこと
- スクリーンショット
    - 1200 x 800または640 x 400で用意する(複数可)
    - 任意でYouTube動画も指定可能
- プロモーションタイル画像
    - どこで使われてるかわからないけど、440x280(必須), 920x680(任意), 1400x560(任意)を用意

## 審査

すべて入力すると、審査が行われます。
審査があるとは思わず(冷静にあればあって当然だ…)、アドカレ担当の前日に登録して「これ間に合わなかったらどうしよう」とガクブルしてましたが、1時間ほどでストアに公開されたので良かったです。
ちなみに「更新」の場合は、即反映されます。

ただし、ググると審査で拒否されたなどの問い合わせなどいくつかヒットするので、そういうこともあるかもしれない。
(今回のアプリの実装が単純すぎて速かった、という可能性もあるかもしれない)

無事に公開されると、ステータスが「公開済み」になるので、別のPCなどでインストールしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/2231015b-bec3-a052-83c5-8c937bda0263.png)

# まとめ

という感じで、Ansibleのドキュメントサイトを便利に使うChrome拡張を作ってみました。
この拡張を使ってもらって便利にドキュメント検索してもらえると嬉しいです。
「こんな機能もあると便利なのでは？」というネタがあれば教えてください。

また、仕組みと実装はシンプルなので、自分が愛用してる・仕事で扱ってるプロダクトのドキュメントサイトに、プラスアルファで何かテキストやリンクを差し込んだりしたい場合にも応用してもらえればと思います。

---

# おまけ

画像がんばって用意したけどあまり出てこないのでここに貼っておこう…

![usansible-prom-440-280.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/f758cf3f-ad5c-2eb5-087d-e02b9dbf4e39.png)

あとネーミングですが、[「にゃんしぶる」を既に他で使ってしまった](https://qiita.com/zaki-lknr/items/5de3f11389090f38bf6e)ため、それに替わる名前とおもって、まぁやっぱりウサギかなー、そうするとusansibleで、、、uとsはなにをこじつけようかなと辞書をぱらぱらチェックしてたら[usher](https://eow.alc.co.jp/search?q=usher)という「案内係」みたいな意味を持つ単語を見つけたので、"Usher Source Ansible"となりました笑

あとは、、既存の類似ツール……探してみたけど見当たらないし、コミュニティとかで質問してみて本当に無くても「お、それあると便利そうだから作ってみるわー」と言われても…だし(笑)、直近でもつよつよな方々のドキュメント系のエントリがいくつかアップされてましたが、、、Chrome拡張というアプローチは出てこなかったので、まぁ大丈夫かなと思ってますが、「それ既にあるで？」という情報ありましたら、こっそり教えてください。

- [[Ansible] モジュールの探し方 - てくなべ (tekunabe)](https://tekunabe.hatenablog.jp/entry/2020/12/21/ansible_finding_module)
- [Ansible のサポートがよく見るドキュメント - 赤帽エンジニアブログ](https://rheb.hatenablog.com/entry/ansible_support_documentation)

あと、よかったらストアに★つけてってください！
[usansible - Chrome ウェブストア](https://chrome.google.com/webstore/detail/usansible/aphgdbhkenbiokjnafmboeagdhjkafee?hl=ja&gl=JP)