みなさんこんにちは。レッドハットの杉村です。Ansible のテクニカルサポートをしています。
本日は Red Hat Ansible Automates 2021 Japan Day 1 が開催されています。多数の方にご参加いただいているとお聞きしています。ありがとうございます。
今回は最近よくお問合せをいただく Collections の使い方について紹介します。
Collections とは
Ansible では多くのモジュールがありましてリリースを重ねるごとにどんどん数も増えてきまして 3000を超えてしまい、一緒に配布することにさまざまな限界が出てきてしまいました。
2.8 〜 2.9 頃から本体と分けて Collections として切り出すことにより、開発ベンダーやコミュニティは独自に開発や配布を進めることができ、品質の向上や利用者の利便性を高めることができるようになりました。
Collections にはモジュールだけでなく、さまざまなものが含まれています。再利用な形で十分なテストがされているものであれば、取ってきて変数を設定するだけで簡単に自動化を実現できるというものも多数開発されています。
- playbooks
- roles
- modules
- plugins
Collections は Red Hat の SaaS サイトでも配布しています。
こちらはコミュニティの配布サイトです。
インターネットへの接続がない閉じた環境でも同じように Collections を配布できるプロダクトも用意しています。以前この赤帽エンジニアブログでも紹介しましたので、ご興味あればご覧ください。
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
より詳しくはこちらのドキュメントをご覧ください。
Ansible Tower から使う
Ansible Tower では、SCM プロジェクトに collections/requirements.yml ファイルを含めておくことで、SCM (git など) からプロジェクトディレクトリを同期したときに ansible-galaxy collections install コマンドを呼び出してインストールすることができます。
SCM で管理していないときは、あらかじめ Tower にインストールしておくことで利用することができます。
こちらのドキュメントに沿って設定いただけます。
この例と同じように、インストールディレクトリを /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 でプロジェクトとジョブテンプレートを作成して実行してください。
また、コマンドラインからでも動作させたい場合には、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の評価ライセンスリクエストはこちらからご利用いただけますのでご検討ください。
Happy Automation!