Ansible の Role を Ansible Galaxy に登録し再利用

はじめに
--------

前回、[CentOS 7(REHL 7) 初期設定 Ansible 編](https://qiita.com/kouji-kojima/items/102254bdb860ead3f89b) にて、Ansible の Playbook の作成方法について、簡単ですが記載しました。今回は、前回作成したロールを Ansible Galaxy[^1] に登録し、いつでも簡単に取り出して再利用できるようにする方法を紹介します。


Ansible Galaxy に 登録する前準備
-------------------------------

GitHub に 空の プロジェクトを作成するところから始めます。Ansible Galaxy に 登録する準備として、２つの方法があります。

1.コマンドを実行してテンプレートを作成して始める方法（初めての場合こちらをおススメ）

```ruby:テンプレート作成
ansible-galaxy init (ロール名=GitHubプロジェクト名)
```

2.一度作成した roles の下から抜き出して作成する方法

![galaxy-move.png](https://qiita-image-store.s3.amazonaws.com/0/45117/beb18a4b-f1b5-7671-99fe-943fbf623f61.png)


重要な作業：「 meta/main.yml 」の記載
------------------------------------


単純な ロールに meta/main.yml を 記載するだけで Ansible Galaxy に 保存することができるようになります。meta/main.yml が 作成できたら、GitHubに登録しておくことで事前準備完了です。以下、meta/main.ymlの記載例を紹介します。

```ruby:meta/main.yml記載方法

galaxy_info:
  author: kouji kojima # 作成者
  description: sample-ansible-el7-init # ロールの説明
  company: your company (optional) # 会社名(任意)

  Some suggested licenses: # ライセンス
  - Apache
  license: Apache License Version 2.0

  min_ansible_version: 2.5.0 # Ansibleのバージョン

  platforms: # プラットフォーム(EL：RHEL,CentOSの意味)
  - name: EL
    versions:
    - 7

  galaxy_tags: # ロールのタグ
    - EL7
    - init
    - locale
    - timezone
    - proxy

dependencies: # 依存するロール
- kouji-kojima.ロール名
```


Ansible Galaxy と GitHub を紐づける
-----------------------------------

[Ansible Galaxy の サイト](https://galaxy.ansible.com/) から Signin with GitHub で ログインします。

![galaxy-site.png](https://qiita-image-store.s3.amazonaws.com/0/45117/1a2d427b-c9d4-2ccd-3644-54ac5408b82b.png)

ログインしたら、ユーザー名のボタンから My Imports を選択します。

![galaxy-myimports.png](https://qiita-image-store.s3.amazonaws.com/0/45117/bfd90940-d25a-39bc-8a8d-0277c3eab5c4.png)

「 ＋ADD 」ボタン を押します。

![galaxy-add.png](https://qiita-image-store.s3.amazonaws.com/0/45117/cc617583-bd6b-59d6-fb68-45f883436aec.png)

Search ボックスの横のリロードマークを押します。

![galaxy-reload.png](https://qiita-image-store.s3.amazonaws.com/0/45117/65e36b60-c81a-cad7-445d-931fad608f6d.png)

Ansible Galaxy が GitHub と うまく連携ができていたら、GitHub に 上げたAnsible Role に 関係するプロジェクトの一覧が表示されます。
プロジェクト名の左の ☑ ボタン をクリックすることで Ansible Galaxy へ Role 登録がスタートします。最後に ステータスが Succeeded に なったら登録完了です。
また GitHub の ソースを変更した場合も ☑ ボタン で更新されます。

![galaxy-myimports.png](https://qiita-image-store.s3.amazonaws.com/0/45117/a06c68a9-ff14-07b4-3a38-1edd06f75a85.png)


登録が完了したら、プロジェクト名のリンクを押してみます。すると meta/main.yml の 情報が表示されます。

![galaxy-meta.png](https://qiita-image-store.s3.amazonaws.com/0/45117/93b25025-ed6b-2f56-f498-a0d32f1ded71.png)

また、README の タブには GitHub に アップした README.md の 情報も表示されるようになっています。

![galaxy-readme.png](https://qiita-image-store.s3.amazonaws.com/0/45117/5ca7b794-dae7-41bc-39b3-de0de06a7d81.png)


登録したロールを再利用する方法
----------------------------

最後に、今回登録したロールを実際に使ってみます。

1.まずロールをローカル(ansibleサーバ)にインストール[^2]します。

```ruby:インストール方法
ansible-galaxy install kouji-kojima.sample-ansible-el7-init(ユーザ名.ロール名)
```

```ruby:インストール先
~/.ansible/roles/kouji-kojima.sample-ansible-el7-init
```

2.お好きな場所に site.yml を作成します。

```ruby:site.yml作成例
cat << EOF > site.yml
- hosts: servers
  remote_user: ec2-user
  become: yes # デフォルト root
  #become_user: xxx
  vars:
    val1: xxxxx # README を 見て変数が必要であれば
    val2: yyyyy
  roles:
    # ロールを指定すると勝手にインストール先を見てくれます。
    # dependencies に 記載されているロールが先に実行されます。
    - { role: kouji-kojima.sample-ansible-el7-init }
EOF
```

3.site.yml と 同じディレクトに hosts を作成します。

```ruby:hostsの作成例(staging環境の場合)
cat << EOF > staging
[servers]
HostName or IP
HostName or IP

[all:vars]
ansible_ssh_user=ec2-user
EOF
```

4.実行してみます。

```ruby:実行例
# 実行例
ansible-playbook -i staging site.yml --private-key=/path/key.pem
# デバッグ実行例
ansible-playbook -i staging site.yml --private-key=/path/key.pem -vvv
```

さいごに
-------

具体的なソースは GitHub を ご参照ください。
[GitHub 依存無](https://github.com/kouji-kojima/sample-ansible-el7-init) の 場合と [GitHub 依存有](https://github.com/kouji-kojima/sample-ansible-el7-ca) の 場合のサンプルを用意しました。


[^1]: Ansible Galaxy とは Ansible の コンテンツ(ロール)を検索、再利用、共有するための HUB ・・・[Ansible Galaxy HP](https://galaxy.ansible.com/) より引用

[^2]: meta/main.yml の dependencies に 記載したロールも一緒にインストールされます。