Ansibleを実用的に。ansible-galaxyのロールをファイル管理しよう

Chefを使っている方はBerkshelfやLibrarian-Chefを使って、利用するクックブックのリストをファイルにまとめて管理するのは珍しくないことかと思います。

同様にAnsibleには ansible-galaxy コマンドにそうした機能が備わっていて、同じように利用するロールをファイルで管理することができます。このコマンドはAnsibleをインストールすれば使えるようになりますので、Ansibleはデフォルトでその機能を持っていると言ってもいいでしょう。

ただ、これまで ansible-galaxyによって利用できるロールはAnsible Galaxyへアップロードされたもののみとなっており、例えばGitHubのプライベートリポジトリなどを使うためにはlibrarian-ansibleのようなサードパーティ製のツールを使う必要がありました。

しかし昨年11月にリリースされた1.8でGitやMercurialなどのSCMやtarballsをサポートし、Ansible Galaxyにアップロードしたロール以外も使うことができるようになりました。これによりAnsible単体でもほぼChefでBerkshelfやLibrarian-Chefを使う時と遜色なく運用することが可能になったと言えます。

今回はAnsibleのファイルによるロールの管理と、GitHubなどAnsible Galaxy以外のソースを使う方法を紹介したいと思います。Ansible 1.8以降をインストールした環境があれば簡単に試すことができますので、実際にファイルを作成して試してみてください。

ロールを管理するためのファイル

ロールを管理するファイルは ansible-galaxy コマンドを実行する際に -r オプションで指定します。

このファイルはテキストファイルもしくはYAMLのフォーマットで記述することができ、ファイル名はどんなものを使えますが、通常はrequirements.txtやrequirements.ymlといった名前をつけるのが通例です。

requirements.txt(テキストフォーマット)

まずテキスト形式のファイルではシンプルなフォーマットでロールを管理することができます。
SCMの指定など柔軟な機能を使うことはできませんが、そうした機能が必要なければテキスト形式でも十分に実用的です。

-r オプションでrequirements.txtを指定すると、そこに記述されたロールが /opt/local/etc/ansible/roles のようなグローバルなディレクトリか、-p で指定した場所にインストールされます。例えば次のようなコマンドです。

$ ansible-galaxy install -r requirements.txt -p roles  

この時、指定したロールに依存性のあるロールも自動的にインストールしてくれます。これはファイルを使わずに ansible-galaxy コマンドを実行した場合も同様です。

肝心のファイルの内容は以下のように書きます。

zzet.rbenv
JasonGiedymin.nodejs

ロールがバージョニングされていればバージョンの指定も可能です。

zzet.rbenv,1.3.0
JasonGiedymin.nodejs

なおSCMの指定はできませんが、GitHubのURLであれば問題なくインストールできるようです(今のところアンドキュメンテッドのようなので今後も使えるかどうかはわかりませんので注意してください)。

https://github.com/bennojoy/nginx,master

プライベートリポジトリもOKです。この場合はSSHのclone URLの前にgit+を付けます。

git+git@github.com:moongift/private-sample-0.git

https経由でもGitHubのユーザIDとパスワードをプロンプトで入力すればOKです。

https://github.com/moongift/private-sample-1.git

ユーザIDの入力は省くことができます。

https://moongift@github.com/moongift/private-sample-2.git

推奨はしませんが、パスワードの入力を省くこともできます。

https://moongift:password@github.com/moongift/private-sample-3.git

requirements.yml(YAMLフォーマット)

YAML形式のファイルを使うとより柔軟な記述を行うことが可能となります。

なおこのファイルのファイル名は先述のように自由ですが、YAMLのフォーマットを使うと認識させるために、拡張子はymlである必要があります。

コマンドで指定する方法はテキスト形式のファイルと同様です。

$ ansible-galaxy install -r requirements.yml -p roles  

ファイルの内容は以下のようになります。

まずは基本です。

- src: zzet.rbenv

プライベートリポジトリももちろん使えます。

- src: git+git@github.com:moongift/private-sample-0.git

ロールのインストール先のパスを指定できます。これは-pで指定した場所よりも優先されます。

- src: zzet.rbenv
- path: ex_roles

バージョンの指定は以下のように行います。

- src: https://github.com/bennojoy/nginx
  version: master

ロールの名前を指定することができます。

- src: https://github.com/bennojoy/nginx
  name: nginx_role

ロールの名前に関してはGitHubから持ってきたロールの名前をAnsible Galaxyと同じ形式のbennojoy.nginxにしてもいいでしょうし、Ansible Galaxyをソースにした場合にユーザ名を取り除いたロール名にすることもできます。運用次第で便利に使えそうです。

そしてSCMの指定ができるためBitBucketでMercurialのリポジトリを使うことが可能となります。

- src: http://bitbucket.org/willthames/hg-ansible-galaxy
  scm: hg

それからコメントを使うことができるのも地味ですがメリットが大きいです。このためだけにでもYAMLフォーマットの方を使いたくなります。

# いったん別のものを試す
# - src: JasonGiedymin.nodejs
- src: laggyluke.nodejs

終わりに

Ansibleの本格的な運用に役立つAnsible Galaxyのロールのファイルでの管理について見てみました。

このロールのファイル管理に加え、Ansible 1.8からは外部のプライベートリポジトリからロールを取得できるようになったため、個人的にはAnsibleを実際のサービスでも使えるようになったと感じています。やはりプライベートリポジトリが使えないというのは実運用する上で大きなネックだったと言えます。

冒頭で述べたようにサードパーティ製のツールを使えば可能でしたが、そうではなくAnsibleのデフォルトのツールでできるようになったのは標準のワークフローを作っていく上で大きな意味があると言えます。

Ansible Galaxy | Find, reuse, and share the best Ansible content