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

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

ただいまの
回答率

89.09%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 138

entertvl

score 1

前提・実現したいこと

自宅で 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 で構築しています
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

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

(snip)
    def _populate_host_properties(self, vm_obj, current_host):
(snip)
        field_mgr = self.pyv.content.customFieldsManager.field
(snip)

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

# vi /var/lib/awx/vendor/inventory_collections/ansible_collections/community/vmware/plugins/inventory/vmware_vm_inventory.py
(snip)
    def _populate_host_properties(self, vm_obj, current_host):
(snip)
        if hasattr(self.pyv.content, 'customFieldsManager'):
            field_mgr = self.pyv.content.customFieldsManager.field
(snip)

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/30 21:31 編集

    初めまして。

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

    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる