Ansible Galaxy OSSを触ってみて

この記事は[Ansible Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ansible) の23日目の記事です。

# はじめに

ちょっと前(大分前？)にAnsible Galaxy がOSS化しましたね。
[Red Hat Launches First Open Source Release of Ansible Galaxy](https://www.redhat.com/en/about/press-releases/red-hat-launches-first-open-source-release-ansible-galaxy)

社内でのちょっとしたroleの共有とかが便利になるかなと思い、
試しに構築してみました。

OSSのinstall手順とか、使ってみた記事等を
パッと見た感じ、みつけられなかったので、
構築の手順とか、所感とかを諸々と残していきます。

# 結論

先に結論を書くと、思っていたものと違いました、ってところでした。
(勝手に勘違いしていた。。。)

そもそもOSS化、と聞いて思っていたものは、
Ansible Galaxyがローカルに建てられて、(githubではなく)そこにroleを保存して、
完全にローカルで閉じる、というものだったのですが、
Web版(OSSではない版)と同じように、
 
- githubとの連携が不可欠
- galaxyへのroleの登録 = githubにpushされたroleへのリンクを作成

という仕組みになっていました。

なので、
イメージしていた完全にローカルで閉じるのは無理そうですが、
(確認してはいませんが、)github enterpriseでprivateリポジトリを持っていれば、
privateなAnsible Galaxyを構築することはできるのかと思いました。

# 構築手順/やったこと

Ansible Galaxyのページにも、
githubのREADMEにもインストール手順がなくて多少あわてましたが、
Makefileがあるからそれを見ればいいのか、と思い構築しました。

## 方針
[Ansible Galaxy github リポジトリ](https://github.com/ansible/galaxy)
Makefileを見ると、

``` Makefile:Makefile_L.57-59
# Build Galaxy images 
build_from_scratch:
	ansible-container --var-file ansible/develop.yml build --from-scratch -- -e"@/ansible-container/ansible/develop.yml"
```
``` Makefile:Makefile_L.76-82
# Start Galaxy containers
run:
	ansible-container --var-file ansible/develop.yml run -d memcache; \
	ansible-container --var-file ansible/develop.yml run -d rabbit; \
	ansible-container --var-file ansible/develop.yml run -d postgres; \
	ansible-container --var-file ansible/develop.yml run -d elastic; \
	ansible-container --var-file ansible/develop.yml --debug run django gulp
```


とあります。
なるほどansible-containerを使えばbuildができて起動もできるようだ。
(ansible-container ってなんだ。。。orz)
でもdockerコンテナでやるっぽい。

## ansible-container
[新しいAnsible Containerを使うとPlaybookだけでDockerイメージをビルドできる](http://qiita.com/kjtanaka/items/ebf38ead92e4aa1fb50a)

なるほど。
playbook(main.yml)でDocker imageの作成手順を記載でき、
container.ymlにdocker-compose likeの記法で、
作成/起動するイメージを記載することで、上手いことやってくれるツールなのか。

## 必要なツール
ということで、Ansible Galaxy のコンテナ作成前に必要なツール一覧は以下です。

- python 2.7
- docker-engine
- pip
- setuptools 20.0.0+
- ansible-container
- git

これらをインスト―ルすると準備完了。

## 構築

```bash
git clone --depth 1 https://github.com/ansible/galaxy.git
cd galaxy
make build_from_scratch

# すんなり行けば問題ないが、イメージ作成後のイメージcommit時にerrorが発生した。
# UnixHTTPConnectionPool(host='localhost', port=None): Read timed out
# 解決策がわからなかったので手でcommit,tag付けを行った

make run

# http://<installしたserver ip>:8000 で接続できる
```

そうしたところ、以下が表示された。
![top_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/76107/3b42f408-8412-cb40-56c5-72e2adafd7f5.png)

本物だ！！となぜか感動してしまった。

アカウント認証は、
(使用していくのには[結論]でも書いたように最終的にはgithubが必要なのだが、)
ひとまずログインするだけは可能で、そのために以下を行った

```bash
# suの作成
make createsuperuser

# galaxy/accounts/admin.py
# 'fields': admin.util.flatten_fieldsets(self.add_fieldsets),
#  ↓
# 'fields': admin.utils.flatten_fieldsets(self.add_fieldsets),
# へと変更(djangoのVersion upに伴いメソッド名が変わったらしい)

# その後、http://<installしたserver ip>:8000/admin に接続
```

そうすると、Ansible Galaxy(Django)が使用している認証ライブラリ(django-allauth)の
管理画面に遷移できる。

そこで、アカウント登録、メールアドレスの登録/確認等を
してあげるとAnsible Galaxyにもログインできるようになる。
その後のroleの登録にはアカウントとgithub紐づけが必要。

# 終わりに

気になっていたAnsible Galaxy のOSS版を構築してみました。

思っていた完全クローズにするのは今は厳しそうで残念でしたが、
今後、githubがなくても良くなるような改修が入らないかなと、
人任せの期待を抱いています。


※ ansible-containerは結構使いやすかったので、使っていこうと思いました。


# 参考
https://github.com/ansible/ansible-container
http://docs.ansible.com/ansible-container/