Рейтинг:0

Выполнение задачи с хоста в роли и делегирование другой задачи другому хосту в другой роли

флаг ph
azk


Контекст:

У меня есть проект с двумя ролями.
Я сократил количество задач до проблемных для лучшего понимания.


Проблема:
Я запускаю задачу из роли 1 на сервере 1 и пытаюсь делегировать задачу виртуализатору vmware из условия в первой задаче роли сервера 1. И сбой хоста, потому что он хочет выполнить задачу второй роли (Vmware) на сервере server1.


Ошибка:

фатальный: [testhost]: FAILED! => {"reason": "противоречащие операторы действий: хосты, 
collect_facts\n\nПохоже, ошибка находится в '/home/ancible/proyects/extend_fs-role/roles/vmwaretaks/tasks/addvmwaredisk.yml': строка 2, столбец 3, 
но может быть\nв другом месте файла в зависимости от проблемы с tntax.\n\nСпорная строка выглядит так:\n\n---\n- hosts: localhost\n ^ здесь\n"}


Вот структура:

.
ââ коллекции
âââ требования.yml
✓ README.md
âââ resizefs_hosts.yml
ââ роли
    âââ изменение размеров
    â âââ по умолчанию
    â â  âââ main.yml
    - обработчики
    â â  âââ main.yml
    âââ мета
    â â  âââ main.yml
    🔸задачи
    â  â  âââ main.yml
    â â  âââ findfreedisk.yml
    🔸тесты
    Â â Â â â â инвентарь
    â â  âââ test.yml
    âââ варс
    âââ main.yml
    âââ vmwaretaks
        âââ по умолчанию
        âââ main.yml
        ✓ файлы
        âââ обработчики
        âââ main.yml
        âââ мета
        âââ main.yml
        ✓ README.md
     🔸задачи
       â  âââ main.yml
       â  âââ addvmwaredisk.yml
        ✓ шаблоны
        тесты
        ✓ ✓ инвентарь
        âââ test.yml
        âââ варс
            âââ main.yml


Это порядок выполнения в случае, если на хосте не найдется свободный лун:

resizefs_role_hosts.yml -> roles/resizefs/tasks/main.yml -> roles/resizefs/tasks/findfreedisk.yml -> \
роли/vmwaretaks/задачи/main.yml -> роли/vmwaretaks/задачи/addvmwaredisk.yml


Вот как выглядят сборники игр:

$ cat resizefs_role_hosts.yml
---
- хосты: тестовый хост
  стать: да
  стать_метод: sudo
  роли:
    - роль: 'роли/изменения размеров'
$ cat roles/resizefs/tasks/main.yml
---
# файл задач для create_fs-test
- import_tasks: findfreedisk.yml
$ cat roles/resizefs/tasks/findfreedisk.yml

- название: Поиск диска без разделов
  set_fact:
    диски: "/dev/{{outer_item.key}}"
  когда:
    - не external_item.value.partitions
    - не external_item.value.links.ids
    - external_item.key - это поиск ("sd")
  with_dict: '{{ansible_devices}}'
  loop_control:
    loop_var: внешний_элемент
  уведомлять:
    - Format_free_disk
  изменено_когда: правда

- name: Печатать имя диска, если доступно
  отлаживать:
    сообщение:
      - "{{диски|по умолчанию('НЕ СВОБОДНЫЙ ДИСК') }} доступны"

# Если диск недоступен, добавьте новый лун от Vmware
- include_role:
    имя: vmwaretaks
  когда: диски не определены
$ роли кота/vmwaretaks/tasks/main.yml
---
# файл задач для add-new-vmware-lun
- import_tasks: addvmwaredisk.yml
$ cat roles/vmwaretaks/tasks/addvmwaredisk.yml

---
- хосты: локальный
  собрать_факты: правда

  вары:
    vcenter_hostname: 'vcenter.labo.local'
    vcenter_username: 'labo.local\ansible'
    vcenter_password: "{{vault_pass}}"
    target_host: 'ТЕСТ-ХОСТ'
    vm_uuid: '4217B33E-014D-E056-0719-45AD3AC1861E'
    vm_unit_number: '5'

  задачи:
    - имя: Добавить диски в виртуальную машину, используя UUID
      vmware_guest_disk:
        имя хоста: "{{ vcenter_hostname }}"
        имя пользователя: "{{ vcenter_username }}"
        пароль: "{{ vcenter_password }}"
        центр обработки данных: "{{ vcenter_hostname }}"
        uuid: "{{ vm_uuid | нижний }}"
        валидате_сертс: нет
        диск:
          - размер_гб: 10
            тип: «толстый»
            состояние: «настоящее»
            autoselect_datastore: да
            scsi_controller: '0'
            scsi_type: «паравиртуальный»
            unit_number: '5'
            disk_mode: 'независимый_постоянный'
      делегат_к: локальный

Я пытался найти способ сказать, что вторая роль выполняется не на сервере, а в виртуализаторе vmware, но безуспешно.
Если я запускаю addvmwaredisk.yml в качестве плейбука, он работает идеально.

Надеюсь, вы можете помочь!

заранее спасибо!

Рейтинг:1
флаг th

хозяева и задачи являются игровыми ключевыми словами, их нельзя использовать внутри списка задач. Чтобы выполнять задачи на хосте, отличном от текущего хоста воспроизведения, используйте делегация; чтобы сгруппировать связанные задачи вместе и применить директивы ко всем из них, используйте блокировать.

- delegate_to: локальный хост
  вары:
    vcenter_hostname: 'vcenter.labo.local'
    vcenter_username: 'labo.local\ansible'
    vcenter_password: "{{vault_pass}}"
    target_host: 'ТЕСТ-ХОСТ'
    vm_uuid: '4217B33E-014D-E056-0719-45AD3AC1861E'
    vm_unit_number: '5'
  блокировать:
    - имя: Добавить диски в виртуальную машину, используя UUID
      vmware_guest_disk:
        имя хоста: "{{ vcenter_hostname }}"
        имя пользователя: "{{ vcenter_username }}"
        пароль: "{{ vcenter_password }}"
        центр обработки данных: "{{ vcenter_hostname }}"
        uuid: "{{ vm_uuid | нижний }}"
        валидате_сертс: нет
        диск:
          - размер_гб: 10
            тип: «толстый»
            состояние: «настоящее»
            autoselect_datastore: да
            scsi_controller: '0'
            scsi_type: «паравиртуальный»
            unit_number: '5'
            disk_mode: 'независимый_постоянный'
azk avatar
флаг ph
azk
Я пытался реализовать ваше решение, но выдает ошибку: `ОШИБКА! модуль/действие не обнаружено в задаче. Ошибка, по-видимому, находится в «/ansible/proyects/extend_fs-role/roles/vmwaretaks/tasks/getvmdiskinfo.yml»: строка 1, столбец 3, но может быть в другом месте файла в зависимости от конкретной проблемы синтаксиса. Оскорбительная строка выглядит так: - delegate_to: локальный хост ^ здесь` Ищем модуль: `$ ansible-doc -l|grep -i делегат zfs_delegate_admin Управление делегированным администрированием ZFS (права администратора пользователя)`
azk avatar
флаг ph
azk
$ ansible-playbook --версия ansible-playbook 2.9.19
flowerysong avatar
флаг th
Это означает, что у вас есть проблема с синтаксисом, которой нет в предоставленном фрагменте кода (в нем есть действие во всех его задачах). Не видя вашего обновленного кода, мы не сможем сказать вам, что вы сделали неправильно.
Рейтинг:0
флаг ph
azk

ну, я недавно решил это, просто добавив стать: нет

- delegate_to: локальный хост
  стать: нет
  делегат_факты: да

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.