質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ESXi

ESXiは、ハイパーバイザ「VMware ESX」の簡易版。サービスコンソールなどの管理機能が制限されており、無償で提供されています。シンプルな機能によりセキュリティ性が優秀であると言われています。

VMware

VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Q&A

解決済

1回答

1872閲覧

AWX を使って ESXi ホスト単体からインベントリ情報を収集したい

entertvl

総合スコア1

ESXi

ESXiは、ハイパーバイザ「VMware ESX」の簡易版。サービスコンソールなどの管理機能が制限されており、無償で提供されています。シンプルな機能によりセキュリティ性が優秀であると言われています。

VMware

VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

0グッド

0クリップ

投稿2020/06/30 06:07

編集2020/06/30 06:11

前提・実現したいこと

自宅で ESXi と AWX を使い、仮想マシンへプロビジョニングできる環境を構築中です。

ESXi Hypervisor を導入したホスト (host01) と、AWX を動かしているホスト (host02) があります。
host01 には 4台の仮想マシンが動いており、 govc を叩いて情報が取得できる事を確認しています。

$ govc find . -name '*host01*' /ha-datacenter/host/host01.example.com /ha-datacenter/host/host01.example.com/host01.example.com /ha-datacenter/vm/host01-guest01 /ha-datacenter/vm/host01-guest02 /ha-datacenter/vm/host01-guest03 /ha-datacenter/vm/host01-guest04

このとき、AWX から ESXi ホストに対し、インベントリソースを使って仮想マシンのインベントリ情報を収集しようとしています。
インベントリソースとして「VMware vCenter」を指定していますが、 vmware_vm_inventory のドキュメントを見る限りでは ESXi サーバを指定することも可能だと見受けられたため使用しています。

vmware_vm_inventory – VMware Guest inventory source

そのため、ドキュメントの記載の通り、認証情報とインベントリソースを設定しました。

15.3.4.1.5. VMware vCenter - Ansible Tower User Guide 3.7.1

この状態でインベントリの同期を試しましたが、エラーが出力されます。

質問したい事は、以下の3点です。

  1. 以下のエラーを解決する方法はあるのでしょうか
  2. 上記以外の方法で AWX のインベントリソースとして ESXi ホスト単体を指定可能なのでしょうか
  3. 指定可能であれば、どのように設定すればよいでしょうか(参考リンクなどで構いません)

発生している問題・エラーメッセージ

インベントリ同期のジョブを実行すると、以下のエラーが出力されます。

ansible-inventory 2.9.7 config file = /etc/ansible/ansible.cfg configured module search path = ['/var/lib/awx/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.6/site-packages/ansible executable location = /usr/bin/ansible-inventory python version = 3.6.8 (default, Nov 21 2019, 19:31:34) [GCC 8.3.1 20190507 (Red Hat 8.3.1-4)] Using /etc/ansible/ansible.cfg as config file setting up inventory plugins [WARNING]: * Failed to parse /tmp/awx_31_s98nn87d/vmware_vm_inventory.yml with auto plugin: 'NoneType' object has no attribute 'field' File "/usr/lib/python3.6/site-packages/ansible/inventory/manager.py", line 280, in parse_source plugin.parse(self._inventory, self._loader, source, cache=cache) File "/usr/lib/python3.6/site-packages/ansible/plugins/inventory/auto.py", line 58, in parse plugin.parse(inventory, loader, path, cache=cache) File "/var/lib/awx/vendor/inventory_collections/ansible_collections/community/vmware/plugins/inventory/vmware_vm_inventory.py", line 606, in parse cacheable_results = self._populate_from_source() File "/var/lib/awx/vendor/inventory_collections/ansible_collections/community/vmware/plugins/inventory/vmware_vm_inventory.py", line 670, in _populate_from_source field_mgr = self.pyv.content.customFieldsManager.field [WARNING]: Unable to parse /tmp/awx_31_s98nn87d/vmware_vm_inventory.yml as an inventory source ERROR! No inventory was parsed, please check your configuration and options.

以下は上記を含めたジョブ出力の全文です。

1.244 INFO Updating inventory 3: test-cluster 1.512 DEBUG Using base command: python /usr/bin/ansible-inventory -i /tmp/awx_31_s98nn87d/vmware_vm_inventory.yml --playbook-dir /tmp/awx_31_s98nn87d -vvvvv 1.512 INFO Reading Ansible inventory source: /tmp/awx_31_s98nn87d/vmware_vm_inventory.yml 1.513 INFO Using VIRTUAL_ENV: /var/lib/awx/venv/ansible 1.513 INFO Using PATH: /var/lib/awx/venv/ansible/bin:/var/lib/awx/venv/awx/bin:/usr/pgsql-10/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 1.513 INFO Using PYTHONPATH: /var/lib/awx/venv/ansible/lib/python3.6/site-packages: Traceback (most recent call last): File "/var/lib/awx/venv/awx/bin/awx-manage", line 8, in <module> sys.exit(manage()) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/__init__.py", line 152, in manage execute_from_command_line(sys.argv) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line utility.execute() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv self.execute(*args, **cmd_options) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/core/management/base.py", line 364, in execute output = self.handle(*args, **options) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/management/commands/inventory_import.py", line 1139, in handle raise exc File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/management/commands/inventory_import.py", line 1029, in handle venv_path=venv_path, verbosity=self.verbosity).load() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/management/commands/inventory_import.py", line 215, in load return self.command_to_json(base_args + ['--list']) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/management/commands/inventory_import.py", line 198, in command_to_json self.method, proc.returncode, stdout, stderr)) RuntimeError: ansible-inventory failed (rc=1) with stdout: stderr: ansible-inventory 2.9.7 config file = /etc/ansible/ansible.cfg configured module search path = ['/var/lib/awx/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.6/site-packages/ansible executable location = /usr/bin/ansible-inventory python version = 3.6.8 (default, Nov 21 2019, 19:31:34) [GCC 8.3.1 20190507 (Red Hat 8.3.1-4)] Using /etc/ansible/ansible.cfg as config file setting up inventory plugins [WARNING]: * Failed to parse /tmp/awx_31_s98nn87d/vmware_vm_inventory.yml with auto plugin: 'NoneType' object has no attribute 'field' File "/usr/lib/python3.6/site-packages/ansible/inventory/manager.py", line 280, in parse_source plugin.parse(self._inventory, self._loader, source, cache=cache) File "/usr/lib/python3.6/site-packages/ansible/plugins/inventory/auto.py", line 58, in parse plugin.parse(inventory, loader, path, cache=cache) File "/var/lib/awx/vendor/inventory_collections/ansible_collections/community/vmware/plugins/inventory/vmware_vm_inventory.py", line 606, in parse cacheable_results = self._populate_from_source() File "/var/lib/awx/vendor/inventory_collections/ansible_collections/community/vmware/plugins/inventory/vmware_vm_inventory.py", line 670, in _populate_from_source field_mgr = self.pyv.content.customFieldsManager.field [WARNING]: Unable to parse /tmp/awx_31_s98nn87d/vmware_vm_inventory.yml as an inventory source ERROR! No inventory was parsed, please check your configuration and options.

試したこと

AWX からそもそもログインできているのかについて確認しました(ホストに到達できているのかも含めて)。

認証情報をわざと変えて実行した所想定したエラーが表示されたため、そもそも到達できていなかったり認証回りでコケているわけではなさそうです。

[WARNING]: * Failed to parse /tmp/awx_32_ls9r6vhp/vmware_vm_inventory.yml with auto plugin: Unable to log on to vCenter or ESXi API at host01.example.com:443 as user01: Cannot complete login due to an incorrect user name or password.

また、自己署名の証明書を独自に作成して ESXi の標準の証明書を置き換えていますが、 validate_certs: False を設定しても状況は変わりませんでした。

補足情報(FW/ツールのバージョンなど)

  • ESXi 7.0.0 (Build 15843807): 無償版で、vCenter Server はありません
  • AWX 11.2.0 / Ansible 2.9.7: docker-compose で構築しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
この挙動ですが、バグだと思われます。

エラーが出る vmware_vm_inventory.py のコードは以下の部分になります。

python

1(snip) 2 def _populate_host_properties(self, vm_obj, current_host): 3(snip) 4 field_mgr = self.pyv.content.customFieldsManager.field 5(snip)

ここでは content オブジェクトの customFieldsManager のオブジェクトを指定しているのですが、確認したところESXiで作成した content の中には存在しませんでした。
そのため、うまくESXi経由ではダイナミックインベントリが動かないようです。
回避策ですがAWXのコンテナに入ってvmware_vm_inventory.pyに次の if を入れてみてください。

shell

1# vi /var/lib/awx/vendor/inventory_collections/ansible_collections/community/vmware/plugins/inventory/vmware_vm_inventory.py

python

1(snip) 2 def _populate_host_properties(self, vm_obj, current_host): 3(snip) 4 if hasattr(self.pyv.content, 'customFieldsManager'): 5 field_mgr = self.pyv.content.customFieldsManager.field 6(snip)

これで、一度試してみてください。

投稿2020/06/30 11:22

編集2020/06/30 11:50
sky-joker

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

entertvl

2020/06/30 13:03 編集

初めまして。 仰るとおり、適用して問題なく動きました。 ansible-collections/vmware の issue には無さそうでしたので、バグレポートとして提出することにします。 (何が問題ありましたらご連絡ください) ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問