Ansible Galaxy にロールを登録してバージョン管理してみる(Aerospike構築Roleで)

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

# キミは小宇宙(コスモ)を感じたことがあるか！

すべったところではじめます。
<br>


"Ansible Galaxy"(ここでは便宜上Galaxyと呼びます)とはAnsbile ロールのパブリックな共有サービスです。
Chefで言う"Community Cookbook"ですね。
大きな違いは同じことを行うロールが複数あります。以下の画像のようにmemcachedで検索すると複数出てきます。Cookbookだと1つしかないですよね。
 
 

![クリップボード01.png](https://qiita-image-store.s3.amazonaws.com/0/27932/4ea96494-ad4e-3452-dfdb-97423324fdaf.png)
<br>

12/4にoritaさんがGalaxyの利用については書いているので、今回は自分で作ったロールの登録するところをご説明したいと思います。
<br>
<br>
###今回みんな大好きな"Aerospike"のロールを作成しました。
<br>
実際の構築が簡単なので、ロールもそれほどボリュームがあるものではないのですが、
Galaxyからこのロールを使って変数の必要箇所を環境に合わせてAnsible-Playbookしてもられてば、
1台であれば1台のAerospikeクラスタとしてデータ領域が初期化され稼働できる状態にまでなります。2台でやれば2台のクラスタが構築されます。プラスAMCというリソース可視化ツールも同梱させてやってます。おせっかいですよねぇw

あ、ただAerospikeにはモードは3種類あります。マルチモード対応ではございません。今回はmemcachedやredisのようなオンメモリモードを選択したPlaybookになっています。メモリ＋SSDモードだといろいろ前準備が必要で。。まぁめんどくさいのでAnsibleがどうこうの話でなくなるので割愛。


###ロールを作る部分は割愛します

作ったロールは以下を見てください^^;
https://github.com/pioho07/aerospike
<br>

##Galaxyに上げる準備

みなさんも作ったロールが既にローカルにあるとします。
まず、以下を実行しgalaxyに必要なメタ情報やREADMEを含めたロールのディレクトリを作ります。

```
[root@ansiblesvr01 playbook]# ansible-galaxy init aerospike
aerospike was created successfully
```
<br>
ディレクトリができます。追加で修正が必要なものがREADME.md、meta/main.ymlです。
それ以外はローカルで作ったものをコピーしてあげましょう。


```
[root@ansiblesvr01 playbook]# ls -la aerospike/
合計 40
drwxr-xr-x 9 root root 4096 12月  7 11:07 2014 .
drwxr-xr-x 7 root root 4096 12月  7 11:07 2014 ..
-rw-r--r-- 1 root root 1328 12月  7 11:07 2014 README.md
drwxr-xr-x 2 root root 4096 12月  7 11:07 2014 defaults
drwxr-xr-x 2 root root 4096 12月  7 11:07 2014 files
drwxr-xr-x 2 root root 4096 12月  7 11:07 2014 handlers
drwxr-xr-x 2 root root 4096 12月  7 11:07 2014 meta
drwxr-xr-x 2 root root 4096 12月  7 11:07 2014 tasks
drwxr-xr-x 2 root root 4096 12月  7 11:07 2014 templates
drwxr-xr-x 2 root root 4096 12月  7 11:07 2014 vars

```
<br>
### meta/main.yml 修正

これはGalaxyに登録した際のカテゴリーなどの情報のテンプレートみたいなものです。
必要な個所をコメントアウトを外して利用しましょう。AerospikeはKVSなのでcategoriesをdatabase:nosqlにする等です。
今回だと以下を修正しました。

```
[root@ansiblesvr01 aerospike]# sdiff -s meta/main.yml meta/main.yml.org
  author: pioho07                                             |   author: your name
  description: aerospike_role                                 |   description:
  company: cyberz                                             |   company: your company (optional)
  # the ones that apply to your role. If you don't see your   |   # the ones that apply to your role. If you don't see your
  platforms:                                                  |   #platforms:
  - name: EL                                                  |   #- name: EL
    - 6                                                       |   #  - 6
                                                              >   #- name: SmartOS
                                                              >   #  versions:
                                                              >   #  - all
                                                              >   #  - any
  categories:                                                 |   #categories:
  - database:nosql                                            |   #- database:nosql
                                                              |
                                                              >
```
<br>
### README.mdを修正

こちらも適宜修正します。READMEのテンプレートの内容はロールの"必要条件"、"変数説明"、"依存関係"、"例"を書いてほしいようです。
ただ、好きにかいても問題ないでしょう。

書けたらいよいよアップします。gitとの連携が一番手間がないのでまずはgitにpushします。
リポジトリ名とロール名は同じにします。

gitにpushする際、Galaxy側でバージョン管理させたい時(Galaxyからダウのロードする際バージョン指定できます)、git tagを付与してgit pushします。そうすることでGalaxy側でバージョン管理されます。

```
[root@ansiblesvr01 aerospike]# git tag -a v1.0.0 -m 'Create tag for v1.0.0'
[root@ansiblesvr01 aerospike]# git tag
v1.0.0
[root@ansiblesvr01 aerospike]# git push  https://github.com/pioho07/aerospike.git tag v1.0.0
Password:
Counting objects: 1, done.
Writing objects: 100% (1/1), 165 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://pioho07@github.com/pioho07/aerospike.git
 * [new tag]         v1.0.0 -> v1.0.0
```

<br>
次はAnsible Galaxyのページで"Add a Role"をします。この時にgitのユーザー名とリポジトリ名を入力します。

![クリップボード02.png](https://qiita-image-store.s3.amazonaws.com/0/27932/ae85de66-3230-e69e-17ee-29641cdf9158.png)

<br>
OKと出れば完了です。(以下は既にv1.0.0を作っていたので、v1.0.1を追加した状態の画面になります)

![クリップボード05.png](https://qiita-image-store.s3.amazonaws.com/0/27932/e6a2ed25-ecf2-5f9f-d8c1-80ff684db224.png)


<br>
反映には少し時間がかかります。実際にGalaxyのExploreで登録したロールを探すと、カテゴリーに設定したdatabase:nosqlに"aerospike"を見つけることができました。v1.0.0とv1.0.1も表示されています。

![クリップボード06.png](https://qiita-image-store.s3.amazonaws.com/0/27932/4396a991-04dc-e636-dc18-2f19c7f80b63.png)


<br>
アップしたロールの利用時は、git cloneとansible-galaxyコマンドの2つありますがどっちでもいいんじゃないかなぁ。ansible-galaxyコマンドでやると/etc/ansible/roles/username.rolenameというディレクトリになるので普通にgit cloneした方がいいような気もしてますがちょっと調べきれませんでした。
パス指定もきっとあると思いますが拘る理由が今のところない気がするので、まぁどっちでもいいです。
ダウンロード時にバージョン指定が可能です。例えば以下のような指定で任意のバージョンのロールをダウンロード可能です。
※後から気付きましたがバージョンをGalaxy側で管理するならansible-galaxyコマンドの方がよさそうですね

```
ansible-galaxy install pioho07.aerospike,v1.0.0
```
<br>
こんな感じ

```
[root@ansiblesvr01 aerospike]# ansible-galaxy install pioho07.aerospike,v1.0.1
 downloading role 'aerospike', owned by pioho07
 - downloading role from https://github.com/pioho07/aerospike/archive/v1.0.1.tar.gz
 - extracting pioho07.aerospike to /etc/ansible/roles/pioho07.aerospike
pioho07.aerospike was installed successfully
[root@ansiblesvr01 aerospike]# ls /etc/ansible/roles/pioho07.aerospike/
README.md  defaults  files  handlers  meta  tasks  templates  vars

```
<br>
## その他ansible-galaxyコマンド

```option:help
[root@ansiblesvr01 aerospike]# ansible-galaxy -h
Usage: ansible-galaxy [init|info|install|list|remove] [--help] [options] ...

Options:
  -h, --help  show this help message and exit

See 'ansible-galaxy <command> --help' for more information on a specific command.

```

```option:list
[root@ansiblesvr01 aerospike]# ansible-galaxy list
 pioho07.aerospike, v1.0.1

```

```option:remove
[root@ansiblesvr01 aerospike]# ansible-galaxy remove pioho07.aerospike
successfully removed pioho07.aerospike
[root@ansiblesvr01 aerospike]# ansible-galaxy list
[root@ansiblesvr01 aerospike]#
```

```option:info
ごめんね不明
```

<br>
## それでは、実際Ansibleを使ってAerospikeを構築してみてください。もしよければw

Ansible実行前に変数を環境に合わせてください。AerospikeのバージョンやAerospikeに当てるメモリ量やログのローテート期間などは私が適当に入れています。default/main.ymlもほぼ同じ内容で作ってますので、必要パラメーターをvars/main.ymlを更新し上書かせてください。

```roles/aerospike/vars/main.yml
[root@ansiblesvr01 playbook_infra]# cat roles/aerospike/vars/main.yml
## variables associated with this role
## aerospike pkg variable
aero_url:
  http://www.aerospike.com/download/server/3.3.22/artifact/el6
aero_pkg_tar:
  aerospike-server-community-3.3.22-el6.tgz
aero_pkg:
  aerospike-server-community-3.3.22-el6
aero_pkg_rpm:
  aerospike-server-community-3.3.21.el6.x86_64.rpm
aerotools_rpm:
  aerospike-tools-3.3.23.el6.x86_64.rpm
pythonargparse_rpm:
  python-argparse-1.2.1-2.el6.noarch.rpm

## amc pkg variable
amc_url:
  http://www.aerospike.com/download/amc/3.4.10/artifact/el6
amc_pkg_rpm:
  aerospike-amc-community-3.4.10-el5.x86_64.rpm

## aerospike.conf modify
svcthreads_num:
  4
tranqueues_num:
  4
tranthreadsperque_num:
  4
ns_memsize:
  4G
ns_name:
  test

## os modify
rotate_day:
  14
archive_dir:
  /usr/local/src/archive
```

あとは以下のようなsite.yml作って実行してみてください。Aerospike構築できるはずです。出来なかったら苦情くださいmm

```
[root@ansiblesvr01 ansible]# cat playbook_infra/site_aero.yml
#playbook for "aerospike cluster" tier
---
- hosts: test
  sudo: yes
  roles:
    - aerospike
```