Ansible 2.10とCollections
こんにちは。株式会社SHIFT、自動化エンジニアの水谷です。
構成管理ツールの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
これで、下のようにインストールが完了しました。
ところが、"ansible --version"でAnsibleのバージョンを確認しようとしたところ、下のようにAnsibleが無いと表示されてしまいます。
一瞬驚いたのですが、いったん"exit"コマンドでWSLを終了し、再度起動してみると、下のようにちゃんとバージョン情報が表示され、Ansibleが正しくインストールされたことが確認できました(なぜ再起動が必要だったのかは不明です)。
さて、ここで見ていただきたいのが下の画面です。これはpip3のlistオプションを使って、pip3でインストールされているソフトウェアかつその名前が "ansible"にマッチしたものを表示したものですが、このようにansibleだけでなく、ansible-baseもインストールされていました。
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以外のモジュールはどこにインストールされているのでしょうか?
探してみると、ここにありました。
※--userオプションを付けてインストールした場合。また、Pythonのバージョンは環境によって異なります。
前回の記事で使用した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はここを見て名前解決をしているのです。
このようにしてAnsible 2.10はAnsible 2.9と互換性を保ちながら、Collectionへの移行というAnsibleにとっては大きな変化を実現しているのです。これをきっかけに、今後さらにAnsible Galaxyが充実して、より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/