Рейтинг:0

rsyslog.service не найден Ansible во время preseed late_command

флаг pt

Я постоянно обнаруживаю, что некоторые вещи «просто не работают», когда предварительная/поздняя_команда в предустановленном файле Ubuntu Bionic. (То же самое относится и к автоматической установке Ubuntu Focal.) В данном конкретном случае я пытаюсь запустить роль Ansible (в частности, Canonical Ubuntu 18.04 LTS для Ansible STIG) против цели как поздняя_команда:

d-i preseed/late_command строка \
    in-target /usr/bin/curl -fsSL -o /opt/stig.zip {{ di_preseed.stig_role_url }}; \
    in-target /usr/bin/unzip -qq /opt/stig.zip -d /opt; \
    in-target /usr/bin/unzip -qq /opt/ubuntu1804STIG-ansible.zip -d /opt; \
    in-target /bin/sh -c -- 'cd /opt && ANSIBLE_LOG_PATH=/var/log/ansible.log /bin/sh force.sh'

Здесь применять.sh это просто обертка вокруг ansible-playbook.

Эта установка из ISO на Virtualbox завершается с ошибкой:

Не удалось выполнить команду preseed... <command> завершилась с кодом выхода 2

Я все еще могу войти в ящик как убунту и стать корень. Вижу, что Ansible успешно установился (изначально указано в pkgsel/включить).

тогда я открываю /var/журнал/установщик/системный журнал на цель и найти, что ansible-playbook потерпел неудачу, когда не смог найти rsyslog.service:

введите описание изображения здесь

Это сбивает с толку, как rsyslog.service наверняка включен и активен после установки, что я могу подтвердить с помощью systemctl (статус|активен) rsyslog.

Итак, что я пытаюсь понять здесь:

  • Почему Ansible не может найти rsyslog.service во время установки, даже если он включен?
  • Какие факторы отличаются в установке, что приводит к тому, что вещи обычно ломаются или недоступны?
  • Было бы лучше запустить это как скрипт при загрузке под init.rc, а затем последнюю строку он удалит после завершения?

Связанный: Некоторые команды (например, modprobe или usermod) не работают как поздние команды в автоустановке Ubuntu.

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

Главное помнить, что в цель команды выполняются в chroot среда. Они не выполняются в полностью загруженной системе, где запущены и доступны основные процессы, такие как systemd.

Тестирование

Я настроил playbook на основе задач STIG на скриншоте и запустил его из preseed. Я видел те же результаты, что и вы.

  • Плейбук
---
- хосты: локальный
  собрать_факты: нет
  подключение: местное

  задачи:
    - имя: проверьте, установлен ли rsyslog.service
      ракушка: ! systemctl list-unit-files | grep "^rsyslog.service[ \t]\+"
      изменено_когда: Ложь
      check_mode: нет
      регистрация: результат
      failed_when: результат.rc > 1

    - имя: стигруле_219160_rsyslog_enable
      оказание услуг:
        имя: rsyslog.service
        включено: "да"
  • Частичный preseed-файл
d-i pkgsel/include строка доступна
d-i preseed/late_command строка \
    wget -P /target/ http://REDACTED/my_playbook.yml ; \
    in-target ansible-playbook -i /dev/null -b -v /my_playbook.yml

Доступные бионические пакеты 2.5.1 и эта версия сервисного модуля кажется, выполняет systemctl показать rsyslog.service. Это не работает в среде chroot. Чтобы продемонстрировать, если я открою терминал в среде установщика и запущу in-target systemctl показать rsyslog.service то файл журнала покажет вывод

in-target: работает в chroot, игнорируя запрос: показать

Возможное исправление

Я нашел патч в Ansible 2.3, который решает проблему что systemctl будет игнорировать команды при работе в среде chroot. Это применялось только к системад модуль хоть и не тот оказание услуг модуль. Я обновил свою пьесу, и она успешно работает.

---
- хосты: локальный
  собрать_факты: нет
  подключение: местное

  задачи:
    - имя: проверьте, установлен ли rsyslog.service
      ракушка: ! systemctl list-unit-files | grep "^rsyslog.service[ \t]\+"
      изменено_когда: Ложь
      check_mode: нет
      регистрация: результат
      failed_when: результат.rc > 1

    - исправлено имя: stigrule_219160_rsyslog_enable
      системный:
        имя: rsyslog.service
        включено: "да"

Таким образом, вы можете продвинуться дальше, изменив задачу (задачи) STIG, не используя оказание услуг модуль для использования системад модуль.

Brad Solomon avatar
флаг pt
Спасибо за этот полезный ответ. У меня был прорыв, когда я обнаружил сегодня, что `ctrl+z` доставит вас в оболочку bash как root в среде установщика с /cdrom и /target, сидящими в файловой системе (первый из них является смонтированным iso). Это значительно упростило отладку, включая обнаружение, как вы здесь упоминаете, что большая часть systemctl недоступна в среде chroot. Так что это не проблема как таковая, и тот факт, что curtin in-target является chroot /target под капотом, кажется основной причиной большинства поведенческих проблем, с которыми я сталкивался.
Brad Solomon avatar
флаг pt
FWIW, мы, вероятно, выберем путь использования ansible с отдельного управляющего узла через ssh (как это и должно быть сделано, я бы сказал) после того, как процесс установки завершен для группы узлов, и они доступны через ssh, где chroot отсутствует.
Brad Solomon avatar
флаг pt
Благодаря возможности войти в оболочку установщика, я теперь смог решить эту проблему: https://askubuntu.com/a/1355980/919528. Вы можете найти это интересным
Andrew Lowther avatar
флаг jp
@BradSolomon Я думаю, что запуск ansible с узла управления будет менее проблематичным. Должна быть возможность открыть оболочку из раскрывающегося списка «Справка» в пользовательском интерфейсе установщика. Я обычно просто использую `Alt-F2`. См. https://askubuntu.com/a/1257186/376778. Вы даже можете войти в среду установщика по SSH, если установите (или перехватите) пароль пользователя «установщика» (YMMV в зависимости от версии subiquity): https://askubuntu.com/a/1322129/376778

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

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