見出し画像

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

例として、データベースソフトの1つ"mysql"のCollectionを検索してダウンロードしてみましょう。検索ワードとして"mysql"を入力して検索ボタンを押すと、下のような検索結果が表示されます。

画像2

一番上にあるのが、Ansible communityで開発されたmysqlのCollectionです。今回は、これをインストールしてみましょう。

CollectionのインストールはRoleのインストールと同様にansible-galaxyコマンドで行います。mysql collectionの詳細ページに進むと、インストールコマンドが"ansible-galaxy collection install community.mysql"であることがわかります。

さっそくこのコマンドを実行してみたところ、下のように数秒でインストールが完了しました。どうやら、依存性を確認した後、Collectionを固めたtarファイルをダウンロードして展開しているだけのようです。

画像4

なお、インストール先は、デフォルトでは ~/.ansible/collections/ansible_collections/community/mysql/となります。Ansible communityで開発されたCollectionは、すべて~/.ansible/collections/ansible_collections/community/の下にインストールされるようになっています。

そして、インストールされたフォルダやファイルを見てみると、どうやらPlaybookやRoleはなく、5つのモジュールだけで構成されているようです。

画像4

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の実行結果は以下のようになりました。

画像5

なお、このモジュールの使い方については、こちらのページに書かれています。
https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_db_module.html

確認のため、mysqlのCLIでテーブル一覧を表示してみると、下のように"testdb"が作られていることが分かります。

画像6

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への影響はそれほど大きくないようです。次回の記事ではこのあたりの状況をもう少し掘り下げてまとめてみたいと思います。

――――――――――――――――――――――――――――――――――

執筆者プロフィール:水谷 裕一
大手外資系IT企業で15年間テストエンジニアとして、多数のプロジェクトでテストの自動化作業を経験。その後画像処理系ベンチャーを経てSHIFTに入社。
SHIFTでは、テストの自動化案件を2件こなした後、株式会社リアルグローブ・オートメーティッド(RGA)にPMとして出向中。RGAでは主にAnsibleに関する案件をプレーイングマネジャーとして担当している。

お問合せはお気軽に
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/