Мне нужно отправить URL-запрос и вернуть результат JSON, затем прочитать IP, имя пользователя, пароль и использовать его в качестве хоста.
И первый шаг моей проблемы заключается в том, что когда я отправляю URL-запрос, существует несколько страниц, и я сохраняю информацию о сервере на всех этих страницах в качестве хоста, затем сохраняю информацию с этих страниц в качестве хоста, получаю доступ к этим серверам и обновить их.
URL - http://apilink/virtual-machines
результаты страницы JSON
"meta": {
"pagination": {
"count": 16,
"current_page": 1,
"links": {
"next": "http://apilink/virtual-machines?page=2"
},
"per_page": 16,
"total": 169,
"total_pages": 11
}
}
Я продолжу запрос со следующим URL-адресом, и я должен записать результаты на всех возвращенных страницах в качестве хостов.
"json": {
"data": [
{
"actual_mhz": 0,
"connectionParameters": {
"data": [
{
"description": "Secure Shell",
"ip_addr": "192.168.1.1",
"port": 22,
"protocol": "SSH"
}
]
},
"hostname": "hostnameserver1",
"name": "server1",
"os": null,
"password": "xXxXxXxXX",
"status": "running",
"username": "root",
[
},
Исходя из результата, возвращенного таким образом, я буду использовать IP, имя пользователя, пароль в качестве хоста, получить доступ к этим хостам с помощью следующей задачи и запустить команду обновления системы.
Я уже получаю первый результат с URL get. Я обеспокоен, я не могу двигаться дальше после этого. Я не мог настроить цикл. :(
В этом случае я бы сделал первый вызов API, просто чтобы получить meta.pagination.total_pages
, затем, основываясь на этом значении, я бы использовал пару loop
и диапазон , , который является заменой with_sequence.
Тогда вам нужно знать, что когда вы регистрируете результат команды, вы уже можете получить доступ к результату предыдущих элементов из переменной.
Остается только кое-что понять, это то, что Ansible очень своеобразно создает результаты:
results
создается в словаре, а затем заполняется из всех результатов.Что-то вроде:
- hosts: localhost
gather_facts: no
tasks:
- uri:
url: https://example.org/virtual-machines
register: number_of_pages
- uri:
url: >-
{{
api_call.json.meta.pagination.links.next
if api_call is defined else 'https://example.org/virtual-machines'
}}
loop: "{{ range(number_of_pages.json.meta.pagination.total_pages) }}"
register: api_call
- debug:
msg: "{{ api_call }}"
Спасибо за цикл ответа сработал. но я не могу прочитать данные на потом.
Это хорошее письменное требование. Где код, написанный как попытка его выполнить, и какую ошибку он генерирует или проблема у вас с ним? Пожалуйста, отредактируйте свой вопрос, чтобы добавить больше деталей. Если вы совсем запутались, вот несколько деталей, которые могут вам помочь (не исчерпывающие): вам придется использовать модули
uri
и/илиget_url
для вызова первой страницы, затем зациклитьtotal_pages
время для повторного вызова каждого uri, зарегистрируйте результат и используйте этот регистр через модульadd_host
. С нетерпением ждем примеров кода.