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