見出し画像

Ansible 2.10とCollections

こんにちは。自動化エンジニアの水谷です。

構成管理ツールの1つとしてよく使われているAnsibleですが、現在主流のバージョンは2.9あるいは2.8です。バージョン2.9には、実に4000以上のモジュールが同梱されていて、Linux、WindowsなどのOSに対してさまざまな操作が行えるだけでなく、スイッチなどのネットワーク機器の操作も自動化できます。

Ansible 2.10の登場

そんなAnsibleですが、少し前にバージョン2.10がリリースされました。このバージョンでは、それまでのバージョンとは大きく異なっている点があります。それは、4000以上あって今も増え続けているモジュールを整理し、基本的なモジュールと、それ以外のモジュールに分けた点です。基本的なモジュール以外のモジュールについても、ジャンル別に仕分けして、必要なもののみをCollectionという形で導入して実行する形になったのです。

前回の記事でも書きましたが、Collectionとは何かを簡単に書いておきますと、Collectionは、AnsibleのPlaybookやRole、モジュールなどのプラグインを含んだファイルのセットです。Ansible Galaxyには有志あるいは企業が作成したCollectionが多数公開されており、検索し、ダウンロードして無料で使用することができます。

Ansible 2.10のUbuntuへのインストール

以前AnsibleをWSL上のUbuntuにインストールしたときは、aptコマンドでインストールしました。ppaリポジトリを追加して、"sudo apt-get install ansible"を実行すればよく、とても簡単でした。

しかし、このコマンドでインストールされるのは、現時点(2020年11月)ではバージョン2.9.6で、(私が試した範囲では)2.10はインストールできないようでした。そこで、別の方法として、pip3を使うことで、2.10のインストールしましたので、その手順を書いておきます。

まずは、pip3が入っていない場合は、下のコマンドでインストールします。

sudo apt-get python3-pip 

そして、pip3を使ってAnsibleをインストールします。

pip3 install --user ansible

これで、下のようにインストールが完了しました。

画像4

ところが、"ansible --version"でAnsibleのバージョンを確認しようとしたところ、下のようにAnsibleが無いと表示されてしまいます。

画像1

一瞬驚いたのですが、いったん"exit"コマンドでWSLを終了し、再度起動してみると、下のようにちゃんとバージョン情報が表示され、Ansibleが正しくインストールされたことが確認できました(なぜ再起動が必要だったのかは不明です)。

画像2

さて、ここで見ていただきたいのが下の画面です。これはpip3のlistオプションを使って、pip3でインストールされているソフトウェアかつその名前が "ansible"にマッチしたものを表示したものですが、このようにansibleだけでなく、ansible-baseもインストールされていました。

画像3

Ansible Baseとは

このansible-baseとは何でしょうか? 先ほど、Ansible 2.10ではモジュールが整理されたと書きましたが、そのことがここに現れています。つまり、バージョン2.9までは、Ansibleをインストールすると4000以上のモジュールも一緒にインストールされましたが、2.10ではAnsibleの実行コマンドと基本的なモジュールのみをまとめたAnsible Baseと、その他の多くのモジュールを含むAnsibleの2つに分離され、Ansibleをインストールするとその両方がインストールされる、という形になったのです。

このため、下のコマンドでAnsible Baseのみをインストールすることができます。

pip3 install --user ansible-base

また、少し紛らわしいですが、Ansibleをインストール後に以下のコマンドでアンインストールしても、Ansible Baseは残ります。

pip3 uninstall ansible

なお、Ansible Baseもアンインストールするには、上のコマンドに続いて、下のコマンドも実行してください。

pip3 uninstall ansible-base

このように、2.10ではインストール部分がやや複雑にはなってしまっていますが、これによってAnsible Baseだけをインストールして、必要なモジュールやロールをCollectionという形でAnsible Galaxyから取ってきて、必要最低限の構成で運用する、などの使い方ができますし、かつ通常のインストールでは2.9と同等のモジュールがインストールされるため、互換性も(完全とは言い切れませんが)保たれています。

Ansible Baseに入っているモジュール

Ansible Baseには基本的なモジュールのみが入っていると書きましたが、ではどのようなモジュールがあるのでしょうか?

下のAnsibleのGitHubで見てみたところ、includeやimport_roleなど他のPlaybookやRoleの呼び出しや、assertやpauseなどの動作制御にかかわるもの、それから、fileやcopy、commandなどの基本的な操作を行うモジュール、そしてaptやyumなどパッケージ管理に関するものなど、70個程度のモジュールが入っていました。


Base以外のモジュールとNamespaceについて

Ansibleをインストールした場合に、Base以外のモジュールはどこにインストールされているのでしょうか?

探してみると、ここにありました。

~/.local/lib/python3.8/site-packages/ansible_collections

※--userオプションを付けてインストールした場合。また、Pythonのバージョンは環境によって異なります。

画像5

前回の記事で使用したCommunityで開発されたmysqlのCollectionもここにありました。

では、Namespaceはどう解決しているのでしょうか? Collectionになったからと言って、FQCNで例えば"community.mysql.mysql_db:"と指定しなければいけなくなったのでしょうか? 

実際にはこれまで通り"myslq_db:"でこのモジュールの使用ができます。

その秘密は、~/.local/lib/python3.8/site-packages/ansible/config/ansible_builtin_runtime.yml にありました。このファイルには、下のようにmysql_db:などのモジュールをどのCollectionのどのモジュールにリダイレクトするかが記述されており、Ansibleはここを見て名前解決をしているのです。

...
mysql_db:
  redirect: community.mysql.mysql_db
mysql_info:
redirect: community.mysql.mysql_info
  mysql_query:
redirect: community.mysql.mysql_query
  mysql_replication:
redirect: community.mysql.mysql_replication
mysql_user:
  redirect: community.mysql.mysql_user
mysql_variables:
  redirect: community.mysql.mysql_variables
...

このようにしてAnsible 2.10はAnsible 2.9と互換性を保ちながら、Collectionへの移行というAnsibleにとっては大きな変化を実現しているのです。これをきっかけに、今後さらにAnsible Galaxyが充実して、よりAnsibleが便利、使いやすくなっていくことを期待したいところです。

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

執筆者プロフィール:水谷 裕一
大手外資系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/

みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!