Как я могу решить проблему цикла нумерации URL-адресов с помощью Ansible?

Мне нужно отправить 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, имя пользователя, пароль в качестве хоста, получить доступ к этим хостам с помощью следующей задачи и запустить команду обновления системы.

Это хорошее письменное требование. Где код, написанный как попытка его выполнить, и какую ошибку он генерирует или проблема у вас с ним? Пожалуйста, отредактируйте свой вопрос, чтобы добавить больше деталей. Если вы совсем запутались, вот несколько деталей, которые могут вам помочь (не исчерпывающие): вам придется использовать модули uri и/или get_url для вызова первой страницы, затем зациклить total_pages время для повторного вызова каждого uri, зарегистрируйте результат и используйте этот регистр через модуль add_host. С нетерпением ждем примеров кода.

Zeitounator 13.12.2020 10:04

Я уже получаю первый результат с URL get. Я обеспокоен, я не могу двигаться дальше после этого. Я не мог настроить цикл. :(

Sabit 13.12.2020 22:20
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
2
979
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом случае я бы сделал первый вызов API, просто чтобы получить meta.pagination.total_pages, затем, основываясь на этом значении, я бы использовал пару loop и диапазон , , который является заменой with_sequence.

Тогда вам нужно знать, что когда вы регистрируете результат команды, вы уже можете получить доступ к результату предыдущих элементов из переменной.
Остается только кое-что понять, это то, что Ansible очень своеобразно создает результаты:

  1. Элементы регистрируются так, как если бы вы вообще не использовали цикл, и вы можете ссылаться на предыдущий элемент через зарегистрированную переменную.
  2. Когда вы существуете в цикле, ключ 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 }}"

Спасибо за цикл ответа сработал. но я не могу прочитать данные на потом.

Sabit 16.12.2020 22:42

Другие вопросы по теме