Azure 的 Ansible 库存插件抛出编码错误
Ansible inventory plugin for azure throws encoding error
据我所知,使用 ansible-inventory-plugins 而不是 dynamic-inventory-provisioner 是处理动态主机的新方法,如云提供商等。
所以,首先我在我的环境中设置了 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
最后我用 ansible inventory plugin 页面所示的最小设置编写了 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
有人帮忙吗?
我认为这是脚本中的一个错误。将调试标志添加到 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 要么使用开发版本。
我已在 github 分支中修复它并使用 pipenv 将此版本包含在我的环境中。其实应该是devel的备份端口,问题已经解决了。也许我会在接下来的几天里解决这个问题,并在 ansible 上做一个 PR 以将它包含到 stable-2.7 中,但也许更好的选择是等待 2.8 在 5 月发布。
我遇到了同样的问题,使用python3
解决了
您可以使用以下命令检查您的ansible 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
如果需要导出环境变量进行身份验证
export ANSIBLE_AZURE_AUTH_SOURCE=cli
然后 运行 ansible 库存
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
据我所知,使用 ansible-inventory-plugins 而不是 dynamic-inventory-provisioner 是处理动态主机的新方法,如云提供商等。
所以,首先我在我的环境中设置了 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
最后我用 ansible inventory plugin 页面所示的最小设置编写了 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
有人帮忙吗?
我认为这是脚本中的一个错误。将调试标志添加到 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 要么使用开发版本。
我已在 github 分支中修复它并使用 pipenv 将此版本包含在我的环境中。其实应该是devel的备份端口,问题已经解决了。也许我会在接下来的几天里解决这个问题,并在 ansible 上做一个 PR 以将它包含到 stable-2.7 中,但也许更好的选择是等待 2.8 在 5 月发布。
我遇到了同样的问题,使用python3
解决了您可以使用以下命令检查您的ansible 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
如果需要导出环境变量进行身份验证
export ANSIBLE_AZURE_AUTH_SOURCE=cli
然后 运行 ansible 库存
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