roleを作成してAnsible Galaxyに登録するワークフロー

# はじめに

roleを作成してAnsible Galaxyに登録するのをやってみたので、作業手順をメモしておきます。
ansible-galaxyへの登録自体は[ansible-galaxy を使ってみた - @znz blog](http://blog.n-z.jp/blog/2014-06-02-ansible-galaxy.html)を参考にしました。ありがとうございます。

ここでは[私が登録した3つのrole](https://galaxy.ansible.com/list#/users/20)のうち、[homebrew-packages](https://galaxy.ansible.com/list#/roles/1003)を例に、role作成からAnsible Galaxyに登録する作業手順を説明します。

# roleの作成

## role用のディレクトリとファイル生成

まず、作業ディレクトリを作って、そこで以下のコマンドを実行します。

```shell-session
ansible-galaxy init homebrew-packages
```

すると以下の様なディレクトリツリーとファイルが作成されます。

```
homebrew-packages/
    README.md
    defaults/
        main.yml
    handlers/
        main.yml
    meta/
        .galaxy_install_info
        main.yml
    tasks/
        main.yml
    vars/
        main.yml
```

## roleを実装

生成されたファイルを編集してroleを実装していきます。
動作確認用に作業ディレクトリに以下の様なlocalhost.yamlを作ります。

```yaml:localhost.yaml
- hosts: localhost
  connection: local
  gather_facts: no
  sudo: no
  vars:
    homebrew_packages_taps:
      - homebrew/binary
      - homebrew/dupes
    homebrew_packages_packages:
      - { name: readline }
      - { name: openssl, state: linked }
      - { name: ansible }
      - { name: cmake }
      - { name: ctags }
      - { name: direnv }
      - { name: docker }
      - { name: git }
      - { name: jq }
      - { name: hub }
      - { name: imagemagick }
      - { name: mercurial }
      - { name: mysql }
      - { name: packer }
      - { name: pkg-config }
      - { name: pwgen }
      - { name: python }
      - { name: reattach-to-user-namespace }
      - { name: redis }
      - { name: subversion }
      - { name: the_silver_searcher }
      - { name: tig }
      - { name: tmux }
      - { name: whois }
      - { name: xz }
      - { name: vim }
      - { name: wget }
      - { name: zsh, install_options: disable-etcdir }
  roles:
    - homebrew-packages
```

tasks/main.yamlにroleの処理を記述しては、以下のコマンドで動作確認を行い、それを繰り返して実装していきます。

```shell-session
ansible-playbook localhost.yaml
```

### roleで使用するvariableの命名規則

[Ansible GalaxyのAboutページ](https://galaxy.ansible.com/intro)の"A note about variables"のセクションにroleで使用するvariableの命名規則が書かれています。変数名をそのまま使うのではなく ```${ロール名}_${変数名}``` のように ```${ロール名}_``` という接頭辞をつけるようにします。これは他のroleの変数と名前が衝突するのを避けるためです。

例えば上記の例ではロール名がhomebrew-packagesでpackagesという変数なので、```homebrew_pacakges_packages```という名前にしています。

### roleに自作モジュールを含める場合はlibraryディレクトリを作成

role内に自作モジュールを含めたい場合は、モジュールのディレクトリにlibraryというディレクトリを作成してそこに置けば良いです。

例えば[hnakamur/ansible-role-atom-packages](https://github.com/hnakamur/ansible-role-atom-packages)の場合は[library](https://github.com/hnakamur/ansible-role-atom-packages/tree/master/library)ディレクトリに[apm](https://github.com/hnakamur/ansible-role-atom-packages/blob/master/library/apm)ファイルを含めています。

ちなみに、このファイルはAnsible本体に含まれる[npm](https://github.com/ansible/ansible/blob/aaa16acdf14c2ed440ab55ce07fe428caacec03f/library/packaging/npm)のソースをコピペして10分ぐらいでちゃちゃっと作成しました。自作モジュールも簡単に作れるのがAnsibleの魅力ですね！

## meta/main.yamlとREADME.mdを書く

実装が終わったら、meta/main.yamlとREADME.mdを書きます。```ansible-galaxy init```で生成されたファイルにいろいろ説明が書いてあるので、それを読んで書いていきます。

# githubにレポジトリを作成してpush

github.comのウェブ画面でレポジトリを作成します。この例では
[hnakamur/ansible-role-homebrew-packages](https://github.com/hnakamur/ansible-role-homebrew-packages)というレポジトリを作りました。

## role用のgithubレポジトリ名はrole名と同じにしない

role名とレポジトリ名を同じにしてしまうと、Ansible roleが扱うupstreamのソフトウェアのレポジトリをforkするときに名前が衝突してしまいます。例えばnginxのroleをnginxという名前でgithubレポジトリを作ってしまうと、nginx自体のレポジトリをforkするときに困ってしまいます。そこで、role用のgithubレポジトリには```ansible-role-```という接頭辞をつけることにしました。

## roleのファイルをレポジトリにpush

github.comでレポジトリを作成した時に表示されたコマンドを参考に、ローカルレポジトリを作ってファイルを追加、commitし、github.comのレポジトリにpushします。

# Ansible Galaxyにroleを登録

Ansible Galaxyの[Add a Role](https://galaxy.ansible.com/accounts/role/add)メニューを選んでroleを登録します。

* Github Username/Account: hnakamur
* Github Repository: ansible-role-homebrew-packages
* Alternate Name: homebrew-packages

# Ansible Galaxyに登録したroleをダウンロードして動作確認

作業用に```~/ansible-workspace```を作成して、ここに先程登録したroleをダウンロードして利用してみます。名前の部分は```${ユーザ名}.${ロール名}```という形式で指定します。またインストール先のディレクトリはカレントディレクトリにしたいので```.```を指定します。

```shell-session
mkdir ~/ansible-workspace
cd ~/ansible-workspace
ansible-galaxy install --roles-path=. hnakamur.homebrew-packages
```

するとカレントディレクトリにhnakamur.homebrew-packagesというディレクトリが作られます。

動作確認用にlocalhost.yamlというファイルを作ります。

```yaml:localhost.yaml
- hosts: localhost
  connection: local
  gather_facts: no
  sudo: no
  vars:
    homebrew_packages_taps:
      - homebrew/binary
      - homebrew/dupes
    homebrew_packages_packages:
      - { name: readline }
      - { name: openssl, state: linked }
      - { name: ansible }
      - { name: cmake }
      - { name: ctags }
      - { name: direnv }
      - { name: docker }
      - { name: git }
      - { name: jq }
      - { name: hub }
      - { name: imagemagick }
      - { name: mercurial }
      - { name: mysql }
      - { name: packer }
      - { name: pkg-config }
      - { name: pwgen }
      - { name: python }
      - { name: reattach-to-user-namespace }
      - { name: redis }
      - { name: subversion }
      - { name: the_silver_searcher }
      - { name: tig }
      - { name: tmux }
      - { name: whois }
      - { name: xz }
      - { name: vim }
      - { name: wget }
      - { name: zsh, install_options: disable-etcdir }
  roles:
    - hnakamur.homebrew-packages
```

role作成時とはrolesの指定に```${ユーザ名}.```という接頭辞を付ける必要があることに注意してください。以下のコマンドで実行します。

```shell-session
ansible-playbook localhost.yaml
```