Вот контекст:
Следующий плейбук (упрощенный до одной задачи для этой темы stackoverflow и для простоты использования) получил разные результаты в зависимости от того, где я его запускаю. Он использует коллекцию галактики nutanix.ncp (проверено с версиями 1.9.0, 1.8.0, 1.7.0...)
Метод ntnx_subnets_info
вызывается для извлечения всего списка существующих подсетей на центральном экземпляре Prism и фильтруется по параметру имени для извлечения только сведений о конкретной VLAN.
---
- name: test-get-subnet-info
hosts: localhost
vars:
nutanix_host: "{{ XXXXXXX }}"
nutanix_username: "{{ XXXXXXX }}"
nutanix_password: "XXXXXXX "
collections:
- nutanix.ncp
module_defaults:
group/nutanix.ncp.ntnx:
nutanix_host: "{{ XXXXXXX }}"
nutanix_username: "{{ XXXXXXX }}"
nutanix_password: "XXXXXXX "
tasks:
- name: Retrieve subnet info
ntnx_subnets_info:
filter:
name: "my-VLAN"
На сервере Debian 11 эта задача выполняется без проблем, как вы можете видеть ниже.
В то время как на моем пользовательском AWX EE (тестировалось и с Docker, и с K8s) я получил следующую ошибку, которая не слишком явная:Failed to convert API response to json
Действия по устранению неполадок:
- попробуйте понизить версию коллекции nutanix.ncp с 1.9.0 до 1.8.0 и 1.7.0 => результат тот же (работает на Debian, а не на Docker)
- сравнить версию ansible => обе среды работают на ядре ansible 2.15.4
- сравните версию Python => среда образа Docker находится на 3.9.17, а сервер Debian — на 3.9.2
- запустить запросы curl вручную из обеих сред =>все работает в обеих средах
- запустите плейбук с опцией -vvvvv и сравните различия в журнале => nutanix.ncp не такой уж болтливый, я не получаю никаких других ошибок, как вы можете видеть на скриншоте ниже.
Вопросы
- Есть ли способ «анализировать» запросы API Ansible? Например, Wireshark/Fiddler для Ansible?
- как мне продвинуться дальше, чтобы устранить неполадки и исправить эту проблему? поскольку с одной стороны все работает, а с другой нет, я могу сравнить некоторые вещи и, надеюсь, найти разницу?
Спасибо
решение1
После многих тестов и исследований, только что нашел entity.py в файлах коллекции nutanix.ncp. Это был файл, который отвечает за сообщение "Не удалось преобразовать ответ API в json"
Одна функция отправляет сообщение об ошибке, когда полученный код ответа URL >300. Я вошел в режим захвата Wireshark и выяснил, что в сетевых потоках была ошибка:
Затем мне нужно проверить соединение между образом Docker/модулем K8s и Prism Central.
Команда
openssl s_client -connect fqdn_prism_central:9440
показывает сообщение об ошибке
«Проверьте код возврата: 20 (не удалось получить сертификат локального эмитента)»
Наконец, я просто обновил цепочку сертификатов в моем образе Docker (через мой Dockerfile), и теперь в AWX все в порядке.
В моем случае, поскольку образ AWX EE основан на официальном awx-ee (https://quay.io/repository/ansible/awx-ee?tab=tags&tag=latest), я добавляю следующие шаги в свой dockerfile (примечание: путь и команда могут отличаться, если вы используете что-то другое, а не образ CentOS):
COPY ./certificate_chain.pem /etc/pki/ca-trust/source/anchors/certificate_chain.pem
RUN chmod 644 /etc/pki/ca-trust/source/anchors/certificate_chain.pem && update-ca-trust extract
Довольно сложно, но работает отлично! :)