Как заставить Ansible фактически скомпилировать файл конфигурации, изменив мои настройки debconf для приложения?

Я использую Ansible, чтобы попытаться настроить все рабочие станции, связанные с конкретным проектом, чтобы иметь возможность использовать синхронизацию BitTorrent со стандартной конфигурацией (на самом деле это просто пример того, что я хочу сделать).

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

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

Я использую последнюю версию Ansible (из PyPi) на 64-битных хостах Ubuntu 14.10.

- hosts: btsync
  sudo: True
  tasks:
    - apt_repository: repo='ppa:tuxpoldo/btsync' update_cache=yes state=present
    - apt: name=btsync state=present
    - apt: name=debconf-utils state=present
    - apt: name=btsync-gui state=present
    - file: name='create a directory for BT Sync' path=/home/sal/bittorrent_sync state=directory owner=sal group=users mode=0755
    - debconf: name='btsync' question='btsync/runas' value='sal' vtype='string'
    - debconf: name='btsync' question='btsync/directory_root' value='/home/sal/bittorrent_sync' vtype='string'
    - debconf: name='btsync' question='btsync/webgui-bindaddr' value='0.0.0.0' vtype='string'
    - debconf: name='btsync' question='btsync/folder_defaults-use_lan_broadcast' value='true' vtype='boolean'
    - debconf: name='btsync' question='btsync/log_size' value='1' vtype='string'
    - debconf: name='btsync' question='btsync/folder_defaults-use_dht' value='true' vtype='boolean'
    - service: name='btsync' state=restarted

Я могу принудительно переконфигурировать файл конфигурации из debconf следующим образом:

sudo dpkg-reconfigure -f noninteractive btsync

Я полагаю, что мог бы заставить Ansible удаленно выполнить это утверждение, но, несомненно, есть лучший, более гибкий способ сделать это?

2 ответа

Решение

Вот как работает debconf, вы не ожидаете, что пакеты будут перенастроены автоматически, если вы просто отредактируете файл.

Вам нужен обработчик уведомлений, который выполняет dpkg один раз в конце игры.

- debconf: name: 'btsync' question: 'btsync/folder_defaults-use_dht' value: 'true' vtype: 'boolean' notify: reconfigure btsync

и в вашем файле обработчиков:

- name: reconfigure btsync command: sudo dpkg-reconfigure -f noninteractive btsync

Теперь, если debconf действительно что-то изменил (и только если - idempotent), btsync будет перенастроен один раз, когда все ваши задачи будут выполнены.

ТЛ;ДР; Используйте Ansible debconf, но затем отложите его в сторону при переконфигурировании с помощью

Остальное — для тех, кто ищет информацию о debconf и модуле debconf Ansible.

Я потратил некоторое время на изучение этого вопроса и отправил несколько документов в модуль debconf Ansible, которые я немного отредактировал для этого ответа.

Переконфигурировать пакеты в Debian с помощью Debian непросто!

Модуль Ansible debconf не перенастраивает пакеты, а просто обновляет базу данных debconf. Требуется дополнительный шаг playbook (обычно через уведомление, если debconf вносит изменения), чтобы переконфигурировать пакет и применить изменения.

Now в основном используется для предварительной настройки перед установкой.

Таким образом, хотя данные debconf и используются, они не всегда достоверны, и вам может потребоваться проверить, как обрабатывается ваш пакет.

представляет собой 3-фазный процесс. Он вызывает сценарии управления из/var/lib/dpkg/infoкаталог со следующими аргументами:

        <package>.prerm  reconfigure <version>
  <package>.config reconfigure <version>
  <package>.postinst control <version>

Основная проблема заключается в том, что шаг перенастройки для многих пакетов сначала сбрасывает базу данных debconf (переопределяя изменения, внесенные модулем Ansible) путем проверки конфигурации на диске. Если это относится к вашему пакету, то он будет фактически игнорировать изменения, внесенные этим пакетом.debconfмодуль.

Однако, хотя наконец вызывает:

      /var/lib/dpkg/info/<package>.postinst configure <version>

для фактической настройки пакета; использовать это оказывается не так просто. Ожидается, что сценарий будет запускаться из «интерфейса debconf» и будет использовать IPC для ответа на запросы._db_cmdвысказывания в сценарии.

Чтобы увидеть это подробнее

      export DPKG_MAINTSCRIPT_PACKAGE=<package>
export DPKG_MAINTSCRIPT_NAME=<script path>
export DEBIAN_HAS_FRONTEND=1

и запустите скрипт. Я пытался настроить автоматические обновления, поэтому запустил:

      sh -x /var/lib/dpkg/info/unattended-upgrades.postinst configure 1.11.2

Затем это останавливается в ожидании ответа от внешнего интерфейса.

Бег

      /usr/share/debconf/frontend /var/lib/dpkg/info/unattended-upgrades.postinst configure 1.11.2

работает... но имеет ту же проблему - сбрасывает базу данных debconf :(

Это потому, что бег

       /var/lib/dpkg/info/unattended-upgrades.postinst configure 1.11.2

sourceс/usr/share/debconf/confmoduleкакие exec()/usr/share/debconf/frontendчто заставляет<package>.configнастроить этап, чтобы он состоялся.

Это делается на основании существования (т. е. с использованием оболочки [-e]) файла .config, и этого нельзя избежать.

Решение состоит в том, чтобыmv /var/lib/dpkg/info/<package>.configв стороне, покаdpkg-reconfigure(или другой связанный код debconf).

Обратите внимание, что в руководстве программиста Debian говорится, что единственной целью сценария конфигурации является заполнение debconf, и он не должен влиять на другие файлы; поэтому выполнение этого в сборнике пьес (насколько я понимаю) соответствует политике Debian: http://www.fifi.org/doc/debconf-doc/tutorial.html#AEN113

ХТХ

Другие вопросы по тегам