ошибка при попытке ansible с использованием become machinectl

Вопрос или проблема

Я пытался сделать автоматизацию с помощью ansible внутри контейнера systemd-nspawn с командами machinectl.

Я нашел плагин ansible под названием become machinectl, который, похоже, подходит, но что-то я делаю не так, потому что это не работает (или, по крайней мере, не работает так, как я ожидаю).

Я запускаю плейбук:

ansible-playbook playbooks/machinectl_test.yml -i inventory/imagecreators --user ansibleuser

Инвентарный файл содержит всего одну машину:

[Fedora]
fedoraimagecreator

Плейбук machinectl_test.yml:

- name: создать пользователя machinectl
  hosts: "*"
  become: yes
  tasks:
    - name: создать пользователя machinectl
      ansible.builtin.user:
        name: test
      become: yes
      become_method: machinectl
      become_flags: "--machine fedora36custom"

Пользователь ansibleuser находится в sudoers со всеми повышениями:

ansibleuser ALL=(ALL) NOPASSWD:ALL

Также он находится в группе wheel:

root@fedoraimagecreator:~ # groups ansibleuser
ansibleuser : ansibleuser wheel

Я добавил набор правил polkit, который является частью документации ansible (и именно поэтому пользователь ansible является частью группы wheel, в противном случае это не требуется, я думаю):

# Правило polkit, необходимое для использования модуля с пользователем, не являющимся root.
# См. раздел Заметки для получения подробной информации.
60-machinectl-fast-user-auth.rules: |
    polkit.addRule(function(action, subject) {
        if(action.id == "org.freedesktop.machine1.host-shell" && subject.isInGroup("wheel")) {
            return polkit.Result.AUTH_SELF_KEEP;
        }
    });

С учетом всего этого. Когда я запускаю плейбук, это результат:

root@ansible:~/ansible # ansible-playbook playbooks/machinectl_test.yml -i inventory/imagecreators --user ansibleuser

PLAY [создать пользователя machinectl] ******************************************************************************************

TASK [Сбор фактов] *************************************************************************************************
ok: [fedoraimagecreator]

TASK [создать пользователя machinectl] ******************************************************************************************
fatal: [fedoraimagecreator]: FAILED! => {"changed": false, "module_stderr": "Соединение с fedoraimagecreator закрыто.\r\n", "module_stdout": "\u001b[0;1;31mНе удалось подключиться к шине: El `host' no está operativo\u001b[0m\r\r\n", "msg": "MODULE FAILURE\nСм. stdout/stderr для точной ошибки", "rc": 1}

PLAY RECAP *************************************************************************************************************
fedoraimagecreator         : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

Кто-нибудь знает, что я делаю не так?

С уважением.

Мне также не повезло с правилом polkit из документации. То, что сработало для меня, было:

polkit.addRule(function(action, subject) {
    if ((action.id == "org.freedesktop.machine1.host-shell" ||
         action.id == "org.freedesktop.machine1.manage-machines" ||
         action.id == "org.freedesktop.machine1.manage-images" ||
         action.id == "org.freedesktop.machine1.login") &&
    subject.isInGroup("wheel")) {
    return polkit.Result.YES;
    }
});

Ответ или решение

Проблема с использованием Ansible и machinectl: Ошибка и решения

Ваша ситуация с автоматизацией с использованием Ansible в контейнере systemd-nspawn через команды machinectl интересна и обширна. Давайте разберем вашу проблему подробнее и найдем решение.

Описание проблемы

Вы пытаетесь запустить playbook Ansible для создания пользователя внутри контейнера, используя machinectl в качестве метода повышения привилегий. Однако, при выполнении playbook вы сталкиваетесь с ошибкой подключения к bus, которая указывает на то, что хост машины не активен. Ошибка выглядит следующим образом:

Failed to connect to bus: El `host' no está operativo

Эта проблема может быть вызвана несколькими факторами, среди которых настройки вашего Polkit, пользовательские права и конфигурация самого Ansible. Давайте рассмотрим основные моменты.

1. Настройки Polkit

Вы прописали политику доступа в 60-machinectl-fast-user-auth.rules, чтобы обеспечить выполнение команд через machinectl пользователем ansibleuser. Вы обнаружили, что изначальная версия правила не сработала. Уверенный и правильный подход, который вы нашли позже, включает дополнительные действия:

polkit.addRule(function(action, subject) {
    if ((action.id == "org.freedesktop.machine1.host-shell" ||
         action.id == "org.freedesktop.machine1.manage-machines" ||
         action.id == "org.freedesktop.machine1.manage-images" ||
         action.id == "org.freedesktop.machine1.login") &&
    subject.isInGroup("wheel")) {
        return polkit.Result.YES;
    }
});

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

2. Проверьте настройки вашего окружения

Обратите внимание на следующие аспекты:

  • Контейнерная среда: Убедитесь, что контейнер находится в рабочем состоянии. Попробуйте выполнить команду machinectl вручную, чтобы проверить, что контейнер запущен и доступен.

  • Сетевые настройки: Убедитесь, что сетевые настройки контейнера позволяют вашему системному уровню взаимодействовать с его внутренностями.

3. Проверка Ansible и Playbook

Ваш playbook выглядит корректным, но есть несколько моментов для проверки:

  • Пользователь ansibleuser: Это учитывается правильно, однако убедитесь, что ansibleuser действительно имеет все необходимые права.

  • Контролируйте вывод и ошибки: Включите более детализированный логгинг для Ansible, используя ключ -vvvv, чтобы получить больше информации о точной причине проблемы.

4. Альтернативные методы решения проблемы

Если проблема продолжает возникать, вы можете попробовать следующие подходы:

  • Проверка прав доступа для других групп: Попробуйте добавить ansibleuser в другие группы, которые могут быть связаны с machinectl, чтобы выяснить, не может ли это помочь решить проблему.

  • Использование других методов повышения привилегий: Если machinectl продолжает создавать проблемы, возможно, стоит рассмотреть другие методы или плагины, совместимые с Ansible, которые могут предоставить необходимую функциональность.

Заключение

Проблемы с доступом и правами в Ansible часто имеют несколько слоев. Ваш случай с machinectl демонстрирует, как важна точная настройка политик управления и доступа. Продолжая исследовать и пробовать различные подходы, вы сможете наладить необходимую работу автоматизации в вашем окружении. Если после всех проверок проблема будет возникать снова, рассмотрите возможность создания тикета в сообществе Ansible для получения специализированной поддержки.

Оцените материал
Добавить комментарий

Капча загружается...