今日のAnsibleモジュールをツイートするTwitter botを作った話

こちらの記事は [Ansible 3 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ansible3) 25日目の記事になります。

今回は定期的にAnsibleのモジュール名をTweetするボットを作成したので紹介します。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Ansibleモジュール紹介<br><br>azure_rm_publicipaddress<br><br>Manage Azure Public IP Addresses<br><br>supported_by: community<br><br>version_added: 2.1<a href="https://t.co/f7XpVAYtBg">https://t.co/f7XpVAYtBg</a></p>&mdash; matsumuratomonori (@ma2muratomonori) <a href="https://twitter.com/ma2muratomonori/status/1208906614591373318?ref_src=twsrc%5Etfw">December 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Ansibleモジュール紹介<br><br>win_psmodule<br><br>Adds or removes a Windows PowerShell module<br><br>supported_by: community<br><br>version_added: 2.4<a href="https://t.co/Vc6w6j844n">https://t.co/Vc6w6j844n</a></p>&mdash; matsumuratomonori (@ma2muratomonori) <a href="https://twitter.com/ma2muratomonori/status/1208891452132143104?ref_src=twsrc%5Etfw">December 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Ansibleモジュール紹介<br><br>oneview_ethernet_network_info<br><br>Retrieve the information about one or more of the OneView Ethernet Networks<br><br>supported_by: community<br><br>version_added: 2.4<a href="https://t.co/5fJNdRZaaq">https://t.co/5fJNdRZaaq</a></p>&mdash; matsumuratomonori (@ma2muratomonori) <a href="https://twitter.com/ma2muratomonori/status/1208876343653519361?ref_src=twsrc%5Etfw">December 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Ansibleモジュール紹介<br><br>win_route<br><br>Add or remove a static route<br><br>supported_by: community<br><br>version_added: 2.4<a href="https://t.co/9BkqMLPdlQ">https://t.co/9BkqMLPdlQ</a></p>&mdash; matsumuratomonori (@ma2muratomonori) <a href="https://twitter.com/ma2muratomonori/status/1208861392150945792?ref_src=twsrc%5Etfw">December 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Ansibleモジュール紹介<br><br>script<br><br>Runs a local script on a remote node after transferring it<br><br>supported_by: core<br><br>version_added: 0.9<a href="https://t.co/TtWFWP07O0">https://t.co/TtWFWP07O0</a></p>&mdash; matsumuratomonori (@ma2muratomonori) <a href="https://twitter.com/ma2muratomonori/status/1208846119930912769?ref_src=twsrc%5Etfw">December 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 元ネタ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今日のラッキーAnsibleモジュール</p>&mdash; よこち(yokochi) (@akira6592) <a href="https://twitter.com/akira6592/status/1201493786624290817?ref_src=twsrc%5Etfw">December 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">そんなことないぽて〜 今日のモジュール紹介したいぽて〜</p>&mdash; 怒れるじゃがいも@Ansible AWX リリース早め (@angrypotato_jp) <a href="https://twitter.com/angrypotato_jp/status/1207529788597927936?ref_src=twsrc%5Etfw">December 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## リポジトリ

[python-tomo/twitter-ansible-bot | GitHub](https://github.com/python-tomo/twitter-ansible-bot)

開発環境を構築するためのDockerfileが含まれていますが実際のプログラム部分は赤枠のファイル のみです。

<img width="1440" alt="スクリーンショット 2019-12-24 21.11.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/e2dd79b4-be8b-c511-feec-2849b1a68772.png">

## 使い方

1. Twitter APIへ登録しアプリケーションキーを発行する
2. CircleCIとリポジトリを連携させる
3. CircleCIへアプリケーションキーを登録する
4. GitHubリポジトリでcronの設定を行う

### 1. Twitter APIへ登録しアプリケーションキーを発行する

登録方法は [こちらのサイト](https://qiita.com/kngsym2018/items/2524d21455aac111cdee) の情報を参考にします

### 2. CircleCIとリポジトリを連携させる

<img width="1440" alt="スクリーンショット 2019-12-23 20.47.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/7b663ff3-2165-2448-a78a-bc10ae77390f.png">


### 3. CircleCIへアプリケーションキーを登録する

<img width="1440" alt="スクリーンショット 2019-12-23 20.39.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/958a20f5-7ff2-0d9b-3c81-b666ed2d3388.png">


<img width="1440" alt="スクリーンショット 2019-12-23 20.36.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/4facc5cf-0eeb-5407-e7d7-8ec716d3a456.png">

### 4. GitHubリポジトリでcronの設定を行う

**twitter-ansible-bot/.circleci/config.yml** でcronの設定を行います。赤枠の部分はそれぞれcronの設定とコードを配置するブランチになります。

初期設定だと毎時間25分になったらtestブランチに置かれたスクリプトが実行されます。

初期設定はmasterブランチしかないので以下のようなコマンドでtestブランチをGitHubリポジトリに作成します。

testブランチが作成された時点でcronが有効になります。

```shell:.circleci/config.yml
cd twitter-ansible-bot
git branch test
Git checkout test
git push origin test
```


<img width="894" alt="スクリーンショット 2019-12-24 22.25.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/497ec98d-f5a7-fb2e-367c-de62f927bce1.png">

また下の画像の部分の赤枠の部分でリポジトリにpushがあった時点で処理が走る設定になっています。testブランチにpushした瞬間にTweetが実行されれば設定は成功です。

<img width="643" alt="スクリーンショット 2019-12-25 1.31.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/7de9734c-2d85-f3d1-8993-8d376931faf9.png">



## 改善点

### エラー処理が甘い

 モジュール情報を取得する処理を以下のように書いてますがモジュール情報が取得できない場合のエラー処理が書いてない

```shell: 
ansible-doc -l | awk '{print $1}' > list.txt
  
# Get total number of modules
total_number=$(cat list.txt | wc -l)
echo ${total_number}

# Set module number
module_number=$(echo $(($RANDOM % ${total_number})))
echo ${module_number}

# Set module name by random number
module=$(sed -n ${module_number}p list.txt)
echo ${module}

# Get module name
ansible-doc ${module} -j | jq ".${module}.doc.module" > module.txt

# Get short_description
ansible-doc ${module} -j | jq ".${module}.doc.short_description" > short_description.txt

# Get supported_by 
ansible-doc ${module} -j | jq ".${module}.metadata.supported_by" > supported_by.txt

# Get version_added 
ansible-doc ${module} -j | jq ".${module}.doc.version_added" > version_added.txt
```

### bashの部分をPython3にしたい

作成者のPython力が低いので部分的にbashが使われています。これらをPython3に置き換えたい。

### 将来的にはAWS Lambdaに置き換えたい

作成者のPython力が低くbashが扱えるCircleCI上で動いてますが将来的にはAWS Lambdaに置き換えたい

## 参考リンク

[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報 | Qiita](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)