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