Ansible Collections を使ってみよう!

みなさんこんにちは。レッドハットの杉村です。Ansible のテクニカルサポートをしています。

本日は Red Hat Ansible Automates 2021 Japan Day 1 が開催されています。多数の方にご参加いただいているとお聞きしています。ありがとうございます。

www.redhat.com

今回は最近よくお問合せをいただく Collections の使い方について紹介します。

Collections とは

Ansible では多くのモジュールがありましてリリースを重ねるごとにどんどん数も増えてきまして 3000を超えてしまい、一緒に配布することにさまざまな限界が出てきてしまいました。

2.8 〜 2.9 頃から本体と分けて Collections として切り出すことにより、開発ベンダーやコミュニティは独自に開発や配布を進めることができ、品質の向上や利用者の利便性を高めることができるようになりました。

Collections にはモジュールだけでなく、さまざまなものが含まれています。再利用な形で十分なテストがされているものであれば、取ってきて変数を設定するだけで簡単に自動化を実現できるというものも多数開発されています。

  • playbooks
  • roles
  • modules
  • plugins

Collections は Red Hat の SaaS サイトでも配布しています。

cloud.redhat.com

こちらはコミュニティの配布サイトです。

galaxy.ansible.com

インターネットへの接続がない閉じた環境でも同じように Collections を配布できるプロダクトも用意しています。以前この赤帽エンジニアブログでも紹介しましたので、ご興味あればご覧ください。

rheb.hatenablog.com

requirements.yml を書いて使う

Collections のインストールは ansible-galaxy コマンドから実行できます。一つだけであればコマンドラインに直接指定してもできるのですが、もし複数インストールしたいことがあれば、requirements.yml ファイルを書いてまとめることもできます。

---
collections:
  - community.vmware
  - vmware.vmware_rest

ansible-galaxy collection install コマンドから実行します。依存する collection があれば、自動的に取得して同時にインストールします。

$ ansible-galaxy collection install -r requirements.yml 

より詳しくはこちらのドキュメントをご覧ください。

docs.ansible.com

Ansible Tower から使う

Ansible Tower では、SCM プロジェクトに collections/requirements.yml ファイルを含めておくことで、SCM (git など) からプロジェクトディレクトリを同期したときに ansible-galaxy collections install コマンドを呼び出してインストールすることができます。

docs.ansible.com

SCM で管理していないときは、あらかじめ Tower にインストールしておくことで利用することができます。

こちらのドキュメントに沿って設定いただけます。

access.redhat.com

この例と同じように、インストールディレクトリを /opt/collections/ として説明します。

ディレクトリを作成して、権限を設定します。

# rm -rf /opt/collections
# mkdir /opt/collections
# chown awx:awx /opt/collections

Tower は awx ユーザでコマンドを実行しますので、awx ユーザで作業します。

# su - awx
$ whoami
awx

ここでは community.vmware をインストールする例で紹介します。別途ダウンロードしたものを scp 等で持ち込んでも構いません。ダウンロードしたら、ansible-galaxy コマンドでインストールします。

オンラインで ansible-galaxy collection install community.vmware -p /opt/collections/ コマンドをお使いいただくこともできます。

$ curl -LO https://galaxy.ansible.com/download/community-vmware-1.12.0.tar.gz
$ ansible-galaxy collection install community-vmware-1.12.0.tar.gz -p /opt/collections/
[WARNING]: The specified collections path '/opt/collections' is not part of the configured Ansible collections paths
'/var/lib/awx/.ansible/collections:/usr/share/ansible/collections'. The installed collection won't be picked up in an Ansible run.
Process install dependency map
Starting collection install process
Installing 'community.vmware:1.12.0' to '/opt/collections/ansible_collections/community/vmware'

ここに warning が表示されているように、collections の path を指定する必要があります。ansible.cfg で指定しないときには、Tower の Web UI から「設定」→「ジョブ」→「追加の環境変数」にこのように設定します。

{
  "ANSIBLE_COLLECTIONS_PATHS": "/opt/collections/"
}

/etc/ansible/ansible.cfg で設定していただくこともできますが、ここでは上記の方法を取ることにします。

[defaults]
collections_paths = /opt/collections/

プロジェクトを作り、collection を使うプレイブックを記述します。

$ mkdir /var/lib/awx/projects/test_vmware
$ cat /var/lib/awx/projects/test_vmware/playbook.yml 
---
- hosts: localhost
  gather_facts: false

  vars:
    vcenter_hostname: '192.168.0.XXX'
    vcenter_username: 'administrator@vsphere.local'
    vcenter_password: 'XXXXXXXX'

  tasks:
    - name: Provide information about vCenter
      community.vmware.vmware_about_info:
        hostname: '{{ vcenter_hostname }}'
        username: '{{ vcenter_username }}'
        password: '{{ vcenter_password }}'
        validate_certs: false
      register: vcenter_about_info

    - name: debug
      debug:
        var: vcenter_about_info 

もし /opt/collections/ 以外のディレクトリをご利用の場合には、ディレクトリによっては Web UI での追加の設定が必要になることがあります。「設定」→「ジョブ」を開いていただき、「ジョブの分離の有効化」が有効のときには、「分離されたジョブに公開するパス」にディレクトリを設定してください。「ジョブの分離の有効化」が無効であれば、awx ユーザで読み取り可能なディレクトリであれば動作します。

ここまで設定いただけましたら、Tower でプロジェクトとジョブテンプレートを作成して実行してください。

f:id:sugitk:20210713170455p:plain

また、コマンドラインからでも動作させたい場合には、awx ユーザで次のように実行していただけます。

$ source /var/lib/awx/venv/ansible/bin/activate
(ansible) $ ANSIBLE_COLLECTIONS_PATHS=/opt/collections/ ansible-playbook /var/lib/awx/projects/test_vmware/playbook.yml -e "ansible_python_interpreter=/var/lib/awx/venv/ansible/bin/python"

おわりに

Ansible 2.9 同梱のモジュールが古くなってしまい、いまどきの自動化に対応しない局面も増えてきました。対象の機器のベンダーやコミュニティから Collections として対応するものが出ていることも多いですので、今回の記事で検討していただけるとうれしく思います。

Ansible Towerの評価ライセンスリクエストはこちらからご利用いただけますのでご検討ください。

www.redhat.com

Happy Automation!

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。