Плагин Ansible inventory для Azure выдает ошибку кодирования

Насколько я понимаю, использование модулей ansible-inventory-plugins вместо динамических-inventory-provisioners - это новый способ обработки динамических хостов, например, облачных провайдеров и так далее.

Итак, сначала я установил учетные данные Azure в своей среде:

 ± env | grep AZ
AZURE_SECRET=asdf
AZURE_TENANT=asdf
AZURE_SUBSCRIPTION_ID=asdf
AZURE_CLIENT_ID=asdf

Затем я написал ansible.cfg со следующим содержимым:

± cat ansible.cfg
[inventory]
enable_plugins = azure_rm

Наконец, я написал файл yaml с минимальными настройками, как показано в доступном инвентаре страница плагина:

± cat foo.azure_rm.yaml 
---
plugin: azure_rm

Когда я запускаю бинарный файл ansible-inventory в этом файле, я получаю:

± ansible-inventory -i foo.azure_rm.yaml --list
 [WARNING]:  * Failed to parse /path/to/foo.azure_rm.yaml with azure_rm plugin: Unicode-objects must be encoded before hashing

 [WARNING]: Unable to parse /path/to/foo.azure_rm.yaml as an inventory source

 [WARNING]: No inventory was parsed, only implicit localhost is available

{
    "_meta": {
        "hostvars": {}
    },
    "all": {
        "children": [
            "ungrouped"
        ]
    },
    "ungrouped": {}
}

Подводя итог: главной проблемой, похоже, является строка:

[WARNING]:  * Failed to parse /path/to/foo.azure_rm.yaml with azure_rm plugin: Unicode-objects must be encoded before hashing

Кто-нибудь поможет?


person ferdy    schedule 01.02.2019    source источник
comment
Проверьте кодировку файла /path/to/foo.azure_rm.yaml. Убедитесь, что это что-то нормальное, например UTF-8   -  person M_dk    schedule 01.02.2019
comment
@M_dk, да, это ...   -  person ferdy    schedule 01.02.2019


Ответы (3)


Думаю, это ошибка скрипта. Добавление флага отладки в Ansible дает мне следующую трассировку стека:

File "/usr/local/lib/python3.6/site-packages/ansible/inventory/manager.py", line 273, in parse_source
  plugin.parse(self._inventory, self._loader, source, cache=cache)
File "/usr/local/lib/python3.6/site-packages/ansible/plugins/inventory/azure_rm.py", line 235, in parse
  self._get_hosts()
File "/usr/local/lib/python3.6/site-packages/ansible/plugins/inventory/azure_rm.py", line 292, in _get_hosts
  self._process_queue_batch()
File "/usr/local/lib/python3.6/site-packages/ansible/plugins/inventory/azure_rm.py", line 412, in _process_queue_batch
  result.handler(r['content'], **result.handler_args)
File "/usr/local/lib/python3.6/site-packages/ansible/plugins/inventory/azure_rm.py", line 357, in _on_vm_page_response
  self._hosts.append(AzureHost(h, self, vmss=vmss))
File "/usr/local/lib/python3.6/site-packages/ansible/plugins/inventory/azure_rm.py", line 466, in __init__
  self.default_inventory_hostname = '{0}_{1}'.format(vm_model['name'], hashlib.sha1(vm_model['id']).hexdigest()[0:4])

Кажется, это было исправлено только недавно: https://github.com/ansible/ansible/pull/46608. Так что либо вам придется подождать 2.8, либо использовать версию для разработки.

person Sonata    schedule 19.02.2019
comment
На самом деле, я пошел назад, используя python 2.7 в моем pipenv, который отображает плагин динамической инвентаризации, который работает сейчас. Недостаток в том, что теперь молекула работает некорректно. Дилемма. - person ferdy; 19.02.2019

Я исправил это в форке github и использовал pipenv, чтобы включить эту версию в свою среду. На самом деле это должен быть резервный порт с devel, где проблема уже устранена. Возможно, я исправлю это в ближайшие дни и сделаю PR по возможности, чтобы включить его в стабильную версию 2.7, но, возможно, лучший вариант - дождаться версии 2.8 в мае.

person ferdy    schedule 09.04.2019

У меня была такая же проблема, и я решил ее с помощью python3

вы можете проверить свою доступную версию Python с помощью следующей команды

  ansible --version | grep "python version"
  python version = 2.7.17 (default, Nov  7 2019, 10:07:09) [GCC 7.4.0]

установить все пакеты python3

  pip3 install ansible azure azure-cli

при необходимости экспортировать переменную env для аутентификации

  export ANSIBLE_AZURE_AUTH_SOURCE=cli

затем запустите доступный инвентарь с помощью

python3 $(which ansible-inventory) -i my.azure_rm.yaml --graph

Файл my.azure_rm.yml выглядит так:

plugin: azure_rm
include_vm_resource_groups:
  - my_resource_group_rg
auth_source: cli
person khancell    schedule 16.04.2020