はじめに
roleを作成してAnsible Galaxyに登録するのをやってみたので、作業手順をメモしておきます。
ansible-galaxyへの登録自体はansible-galaxy を使ってみた - @znz blogを参考にしました。ありがとうございます。
ここでは私が登録した3つのroleのうち、homebrew-packagesを例に、role作成からAnsible Galaxyに登録する作業手順を説明します。
roleの作成
role用のディレクトリとファイル生成
まず、作業ディレクトリを作って、そこで以下のコマンドを実行します。
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を作ります。
- 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の処理を記述しては、以下のコマンドで動作確認を行い、それを繰り返して実装していきます。
ansible-playbook localhost.yaml
roleで使用するvariableの命名規則
Ansible GalaxyのAboutページの"A note about variables"のセクションにroleで使用するvariableの命名規則が書かれています。変数名をそのまま使うのではなく ${ロール名}_${変数名}
のように ${ロール名}_
という接頭辞をつけるようにします。これは他のroleの変数と名前が衝突するのを避けるためです。
例えば上記の例ではロール名がhomebrew-packagesでpackagesという変数なので、homebrew_pacakges_packages
という名前にしています。
roleに自作モジュールを含める場合はlibraryディレクトリを作成
role内に自作モジュールを含めたい場合は、モジュールのディレクトリにlibraryというディレクトリを作成してそこに置けば良いです。
例えばhnakamur/ansible-role-atom-packagesの場合はlibraryディレクトリにapmファイルを含めています。
ちなみに、このファイルはAnsible本体に含まれる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というレポジトリを作りました。
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メニューを選んでroleを登録します。
- Github Username/Account: hnakamur
- Github Repository: ansible-role-homebrew-packages
- Alternate Name: homebrew-packages
Ansible Galaxyに登録したroleをダウンロードして動作確認
作業用に~/ansible-workspace
を作成して、ここに先程登録したroleをダウンロードして利用してみます。名前の部分は${ユーザ名}.${ロール名}
という形式で指定します。またインストール先のディレクトリはカレントディレクトリにしたいので.
を指定します。
mkdir ~/ansible-workspace
cd ~/ansible-workspace
ansible-galaxy install --roles-path=. hnakamur.homebrew-packages
するとカレントディレクトリにhnakamur.homebrew-packagesというディレクトリが作られます。
動作確認用に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の指定に${ユーザ名}.
という接頭辞を付ける必要があることに注意してください。以下のコマンドで実行します。
ansible-playbook localhost.yaml