Ansible collections の簡単な使い方

#<font color="DarkOrange">目次</font>
<ul>
<li><a href="#1-%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">1. はじめに</a></li>
<li><a href="#2-%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E4%BD%9C%E6%88%90">2. 仮想環境作成</a></li>
<li><a href="#3-ansible%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95">3. ansibleのインストール方法</a></li>
<li><a href="#4-collections%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95">4. collectionsのインストール方法</a></li>
<li><a href="#5-collections%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95">5. collectionsの使用方法</a></li>
<li><a href="#6-collections%E3%81%AE%E3%83%91%E3%82%B9">6. collectionsのパス</a></li>
<li><a href="#7-%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">7. おわりに</a></li>
<li><a href="#8-%E5%8F%82%E8%80%83%E8%B3%87%E6%96%99">8. 参考資料</a></li>
<li><a href="#9-%E6%8A%80%E8%A1%93%E6%83%85%E5%A0%B1">9. 技術情報</a></li>
</ul>

#<font color="DarkOrange">1. はじめに</font>
ansible2.10ではansible2.9までとは異なっており、『collections』という考え方が新しく実装されています。
collectionsにより、ansibleのバージョンを変更せずにモジュールのバージョンを管理できるようになります。
また、本記事では例として『vmware』collectionを用いて検証しています。

#<font color="DarkOrange">2. 仮想環境作成</font>
~~~
[root@localhost ~]# python3 -m venv venv
[root@localhost ~]# source venv/bin/activate
(venv) [root@localhost ~]#

### 仮想環境から抜ける場合は以下コマンド ###
(venv) [root@localhost ~]# deactivate
[root@localhost ~]#
~~~

#<font color="DarkOrange">3. ansibleのインストール方法</font>
~~~
(venv) [root@localhost ~]# pip install --upgrade pip
(venv) [root@localhost ~]# pip install ansible
(venv) [root@localhost ~]# pip freeze
ansible==2.10.6
ansible-base==2.10.5
~~~
従来は『ansible==2.9.10』のような表示でしたが、
ansible2.10からは『ansible』『ansible-base』がインストールされます。
『ansible-base』は基本機能と標準モジュール群、『ansible』はcollection群です。
バージョンはansibleコマンドで確認できますが、pipのパッケージでは『ansible-base』と同じバージョンのようです。
『ansible』のみがインストール済みの状態でも『ansible-base』がないとansibleコマンドは使用できません。
また、『ansible-base』のみがインストール済みの状態でもcollectionsがないため、モジュールを参照できず、プレイブックの実行エラーになります。

#<font color="DarkOrange">4. collectionsのインストール方法</font>
モジュールのアップデートや、個別にcollectionsをインストールする際に行います。

ansible garaxyからcollectionを探しインストールを行います。
https://galaxy.ansible.com/
![WS000000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611933/10d537ef-e8f7-6eb0-6ad4-dbe421866657.png)
検索から、指定のcollectionsを検索します。
![WS000001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611933/0835142c-69be-579b-0807-e612fcc15db1.png)
該当のcollectionsをクリックすると、インストール方法などが確認できます。
![WS000002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611933/3d358135-c7b3-31f3-1cac-5e0d0e1614b8.png)
確認したら以下の方法でインストールする。

~~~
### 最新のcollection インストール方法 ###
(venv) [root@localhost ~]#　ansible-galaxy collection install community.vmware

### バージョン指定インストール方法 ###
(venv) [root@localhost ~]#　ansible-galaxy collection install community.vmware:1.4.0

### 既にcollectionがインストール済みの状態でバージョンを変更する場合 ###
(venv) [root@localhost ~]#　ansible-galaxy collection install -f community.vmware:1.5.0
~~~
~~~
### collectionsの確認 ###
(venv) [root@localhost ~]# ansible-galaxy collection list
# /root/.ansible/collections/ansible_collections
Collection       Version
---------------- -------
community.vmware 1.4.0

# /root/venv/lib/python3.6/site-packages/ansible_collections
Collection                Version
------------------------- -------
community.vmware          1.7.0
~~~


#<font color="DarkOrange">5. collectionsの使用方法</font>
モジュールを使用するためにプレイブック、ロール、タスクで指定できます。
ロールを使用する場合はmetaに記載すれば読み込まれます。

~~~
### プレイブックで指定する場合 ###
---
- name: sample
  hosts: vcenter
  gather_facts: no
  collections:
    - community.vmware
  tasks:
    - name: sample name
      vmware_guest:
~~~

~~~
### ロールで指定する場合 ###
.
|-- roles
|   `-- test
|       |-- meta
|       |   `-- main.yml
|       `-- tasks
|           |-- main.yml
|           `-- test.yml
`-- site.yml

(venv) [root@localhost meta]# pwd
/etc/ansible/playbook/roles/test/meta
(venv) [root@localhost meta]# cat main.yml
---
collections:
 - community.vmware

(venv) [root@localhost meta]# cat ../tasks/test.yml
---
- name: sample name
  vmware_guest:
~~~

~~~
### タスクで指定する場合 ###
---
- name: sample
  hosts: vcenter
  gather_facts: no
  tasks:
    - name: sample name
      community.vmware.vmware_guest:
~~~

また、以下のように指定なしでもプレイブックの実行は可能です。
実行時にモジュールのパスへリダイレクトし、実行できるような仕組みになっているようです。
そのため、従来のプレイブックをansible2.10でも実行できるようになっています。

~~~
### collections指定なしの場合 ###
---
- name: sample
  hosts: vcenter
  gather_facts: no
  tasks:
    - name: sample name
      vmware_guest:
~~~

#<font color="DarkOrange">6. collectionsのパス</font>
ansible.cfgを確認したところ、以下の記載がありました。
デフォルトでは、ansible-galaxyコマンド等で個別インストールしたcollections(~/.ansible/collections)が優先されるようになっています。

~~~
### デフォルトのcollections_paths###
# collections_paths = ~/.ansible/collections:/usr/share/ansible/collections
~~~

#<font color="DarkOrange">7. おわりに</font>
ansible2.10リリース後触れられていなかったので、参考資料をもとに検証しまとめてみました。
より詳しい内容は参考資料をご覧いただければと思います。

#<font color="DarkOrange">8. 参考資料</font>
https://techblog.ap-com.co.jp/entry/2020/11/13/101710
https://tekunabe.hatenablog.jp/entry/2020/09/20/ansible_role_collections
https://docs.ansible.com/ansible/latest/user_guide/collections_using.html

#<font color="DarkOrange">9. 技術情報</font>
[会社Webサイト](http://c.itdo.jp/author/tsukada/)にて技術ブログを掲載しております。ご覧いただければ幸いです。