Как я могу сохранить настраиваемые факты об удаленных узлах в совокупности, прежде чем продолжить работу с остальной частью модуля Runbook?

Я пишу книгу для подготовки кластера в Ansible, которая требует, чтобы каждый узел был настроен с общедоступными сертификатами других узлов во время установки. Я не могу придумать простой способ сказать ansible:

  1. Получите удаленные сертификаты
  2. Поместите их в список
  3. Сделайте эти сводки сертификатов доступными для каждого удаленного узла для создания авторизованного списка узлов.

На данный момент, учитывая небольшое количество узлов-кластеров, я собираюсь сделать это вручную (скопировать вывод первого playbook в переменные второго), но было бы очень полезно, если бы был способ сделать это в одной пьесе.


person NJL    schedule 02.11.2019    source источник


Ответы (1)


Мой ответ будет как можно более общим: сохранить факт на конкретной машине в группе и прочитать этот факт для всех машин в группе с другой машины.

  1. Я считаю само собой разумеющимся, что ваша книга на самом деле нацелена на группу my_node_group, содержащую все ваши узлы кластера.
  2. Храните информацию с удаленного узла в его собственных фактах (или получите ее прямо из своего инвентаря ...).

    # This one should be replaced with getting certs in your context
    # with whatever solution is best suited for you.
    - name: Get an info from current machine
      shell: echo "I'm a dummy task running on {{ inventory_hostname }}" 
      register: my_info_cmd
    
    - name: Push info in a fact for current node
      set_fact:
        my_info: "{{ my_info_cmd.stdout }}"
    
  3. Это действительно полезная часть: используйте сохраненную информацию в другом месте
    - name: example loop to access 'my_info` on each machines of group `my_node_group`
      debug:
        var: item
      loop: >-
        {{
          groups['my_node_group']
          | map('extract', hostvars, 'my_info')
          | list 
        }}
    

Объяснение последнего шага

  • Получить машины в группе my_node_group
  • Используйте это имя, чтобы сопоставить _ 5_ filter на hostvars и получите список соответствующих хэшей фактов, где вы сохраняете только атрибут my_info
  • Преобразуйте возвращенный объект карты в список, зацикленный над ним.
person Zeitounator    schedule 02.11.2019
comment
спасибо - это действительно помогает прояснить общую стратегию. Меня беспокоит параллелизм для списка больших хостов: есть ли что-нибудь, что заставит ansible приостановить работу, чтобы убедиться, что этап сбора завершен? - person NJL; 02.11.2019
comment
существует также мета-проблема определения группы, против которой я сейчас работаю. Я так понимаю, что хост может быть во многих группах, но активна должна быть только одна группа? - person NJL; 02.11.2019