Как заставить 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
ХТХ