Ansible Galaxyを使ったCollectionsの取得
こんにちは。株式会社SHIFT、自動化エンジニアの水谷です。
前回の記事ではAnsible Galaxyを使ってAnsibleのRoleを取得する方法について書きました。Ansibleには、Roleという単位で特定の機能を実現するコードを共有する仕組みがあり、Ansible Galaxyで公開されている良質なRoleをインストールして活用することで、短時間でクオリティの高いPlaybookを作成できます。
高品質なRoleが無料で手に入るだけでもとても有益なのですが、実はAnsible Galaxyには、RoleだけでなくPlaybook自体やモジュールなどにも範囲を広げた"Collection"という単位でAnsibleのコードを共有する仕組みもあります。
そこで今回は、Ansible Galaxyで公開されているCollectionを取り込んで活用する方法について書いてみたいと思います。
Ansible Collectionとは
まずは、AnsibleにおけるCollectionがどのようなものかを簡単に書いておくと、Collectionは「Playbook、Role、モジュール、プラグインを含むことのできるAnsibleコンテンツのディストリビューション形式」とされています。Collectionの仕組みを使うことで、Roleのみならず、Ansibleで"パーツ"として扱われているほとんどのものを1つのパッケージとして共有できるのです。
そして、有志あるいはソフトウェアおよびハードウェアメーカーから、多くのCollectionがAnsible Galaxyで共有されており、それらはすべて無料でダウンロードして使用することができるのです。
Ansible GalaxyからのCollectionの取得
Collectionのダウンロードは、基本的にRoleのダウンロードと同じ方法で行えます。
Ansible Galaxyのサイト(https://galaxy.ansible.com/)から、"Search"リンクをクリックし、Collectionを検索します。Roleを検索する際には、"Filters"の設定で"Type"を"Role"に設定して検索しましたが、Collectionを検索する場合は、基本的にそのまま検索ワードを入力して、検索ボタンを押せばよいようです。
例として、データベースソフトの1つ"mysql"のCollectionを検索してダウンロードしてみましょう。検索ワードとして"mysql"を入力して検索ボタンを押すと、下のような検索結果が表示されます。
一番上にあるのが、Ansible communityで開発されたmysqlのCollectionです。今回は、これをインストールしてみましょう。
CollectionのインストールはRoleのインストールと同様にansible-galaxyコマンドで行います。mysql collectionの詳細ページに進むと、インストールコマンドが"ansible-galaxy collection install community.mysql"であることがわかります。
さっそくこのコマンドを実行してみたところ、下のように数秒でインストールが完了しました。どうやら、依存性を確認した後、Collectionを固めたtarファイルをダウンロードして展開しているだけのようです。
なお、インストール先は、デフォルトでは ~/.ansible/collections/ansible_collections/community/mysql/となります。Ansible communityで開発されたCollectionは、すべて~/.ansible/collections/ansible_collections/community/の下にインストールされるようになっています。
そして、インストールされたフォルダやファイルを見てみると、どうやらPlaybookやRoleはなく、5つのモジュールだけで構成されているようです。
mysql Collectionを使ってみる
では、このCollectionをPlaybookから使ってみましょう。
試しに下のようなPlaybookを作ってみました(実行環境はUbuntu 18.04です)。これは、最初のタスクでmysqlをインストールし、次にmysqlのサービスを起動し、そして、"testdb"という名前のテーブルを作成するものです。この最後のタスクが、今回インストールしたCollectionに入っているモジュール"community.mysql.mysql_db"を使っています。
※ この例ではhostsをlocalhostにして、Ansibleを実行するそのマシンにmysqlをインストールするようにしています。他のマシンにインストールする場合は、別途インベントリーファイルを作成してください。
---
- hosts: localhost
become: yes
tasks:
- name: Install mysql
apt:
name: "{{ item }}"
state: latest
loop:
- mysql-server
- mysql-client
- python-mysqldb
- name: Start mysql
service:
name: mysql
state: started
enabled: yes
- name: Create database 'testdb'
community.mysql.mysql_db:
name: testdb
state: present
Playbookの実行結果は以下のようになりました。
なお、このモジュールの使い方については、こちらのページに書かれています。
https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_db_module.html
確認のため、mysqlのCLIでテーブル一覧を表示してみると、下のように"testdb"が作られていることが分かります。
CollectionのNamespace
上のPlaybookでは、モジュールの指定を完全修飾コレクション名(FQCN)で、"community.mysql.mysql_db"としていましたが、毎回FQCNで記述するのはやや手間がかかります。
そこで、以下のようにCollectionsを列挙しておくことで、そのNamespace以下を検索してくれるようになり、"mysql_db:"とモジュール名のみで記述できるようになります。
---
- hosts: localhost
collections:
- community.mysql
tasks:
- name: Install mysql
apt:
name: "{{ item }}"
state: latest
loop:
- mysql-server
- mysql-client
- python-mysqldb
- name: Start mysql
service:
name: mysql
state: started
enabled: yes
- name: Create a new database 'testdb'
mysql_db:
name: testdb
state: present
Ansible 2.10への移行
お気づきの方もいらっしゃると思いますが、Ansible 2.9などにはmysql_dbモジュールが同梱されており、Collectionのインストールを行わなくてもmysql_dbモジュールが使用できます。
では、なぜこのようにインストールしなくても使えるmysql関連のモジュールがCollectionとして公開されているのでしょうか?
それは、2020年10月に公開されたAnsibleの現在の最新バージョン2.10では、基本的なモジュールのみが入ったansible-baseに、必要なモジュールをCollectionから追加して使うように方針が変更されたからなのです。
Ansibleのモジュールは増え続けており、現時点ではすでに4000を超えています。これをすべてAnsibleのインストールパッケージに入れていてリリースするのは、さすがに(リリースマネジメントやクオリティ管理の上で)厳しくなってきたのでしょうか?
なお、このような変化があったとはいえ、バージョン2.9までとの互換性を(ある程度?)維持のため、通常の(Ansible 2.9までと同様の)インストール方法では、多くのコレクションも合わせてインストールされるようになっているとのこと。つまり、既存のPlaybookへの影響はそれほど大きくないようです。次回の記事ではこのあたりの状況をもう少し掘り下げてまとめてみたいと思います。
――――――――――――――――――――――――――――――――――
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/