puppet service enable broken on ubuntu vivid with debian provider
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
puppet (Ubuntu) |
Fix Released
|
Medium
|
Unassigned |
Bug Description
Running Puppet on Ubuntu 15.04 Vivid:
$ lsb_release -d
Description: Ubuntu 15.04
$ apt-cache policy puppet-common
puppet-common:
Installed: 3.7.2-1ubuntu2
Using the bird package as an example, which ships both sysvinit and systemd service files:
$ dpkg -L bird | vgrep service unit files
/lib/systemd/
/lib/systemd/
/etc/init.d/bird6
/etc/init.d/bird
/etc/init/
/etc/init/
Puppet appears to choose the debian provider for the bird service, over the systemd provider:
$ sudo puppet resource --debug --param provider --param enable service bird
Debug: Runtime environment: puppet_
...
Debug: /Service[bird]: Provider debian does not support features flaggable; not managing attribute flags
...
Debug: Service bird found in both debian and init; skipping the init version
...
Debug: /Service[
...
Debug: Executing '/etc/init.d/bird status'
service { 'bird':
ensure => 'stopped',
enable => 'true',
provider => 'debian',
}
This means that while `ensure => running/stopped` works:
$ sudo puppet resource --debug --param provider service bird ensure=stopped
Debug: Executing '/etc/init.d/bird status'
Debug: Executing '/etc/init.d/bird stop'
Notice: /Service[
Debug: Finishing transaction 3255100
Debug: Storing state
Debug: Stored state in 0.13 seconds
Debug: Executing '/etc/init.d/bird status'
service { 'bird':
ensure => 'stopped',
provider => 'debian',
}
The service `enabled => true/false` state does not:
$ sudo puppet resource --debug --param provider service bird enable=false
Debug: Executing '/etc/init.d/bird status'
Debug: Executing '/usr/sbin/
Notice: /Service[
Debug: Finishing transaction 23676980
Debug: Storing state
Debug: Stored state in 0.12 seconds
Debug: Executing '/etc/init.d/bird status'
service { 'bird':
ensure => 'stopped',
enable => 'false',
provider => 'debian',
}
$ sudo puppet resource --debug --param provider service bird enable=true
Debug: Executing '/etc/init.d/bird status'
Debug: Executing '/usr/sbin/
Debug: Executing '/usr/sbin/
Notice: /Service[
Debug: Finishing transaction 12984740
Debug: Storing state
Debug: Stored state in 0.14 seconds
Debug: Executing '/etc/init.d/bird status'
service { 'bird':
ensure => 'stopped',
enable => 'true',
provider => 'debian',
}
$ ls /etc/rc?.d/*bird*
/etc/rc0.d/K01bird /etc/rc1.d/K01bird6 /etc/rc3.d/K01bird6 /etc/rc4.d/S02bird /etc/rc6.d/K01bird
/etc/rc0.
/etc/rc1.d/K01bird /etc/rc2.d/S02bird /etc/rc4.d/K01bird6 /etc/rc5.d/S02bird
$ sudo systemctl is-enabled bird
disabled
I presume that systemd ignores any sysvinit configuration (/etc/rc?.d/*) for services that have a native systemd unit, and is thus blind to any state inspected/changed by puppet's debian service provider.
Workaround is to explcitly use the systemd provider for the service shipping a native systemd service unit:
$ sudo puppet resource --debug --param provider --param enable service bird provider=systemd enable=true
Warning: Setting manifest is deprecated in puppet.conf. See http://
Debug: Executing '/bin/systemctl is-active bird'
Debug: Executing '/bin/systemctl is-enabled bird'
Debug: Executing '/bin/systemctl enable bird'
Notice: /Service[
Debug: Finishing transaction 14759420
Debug: Storing state
Debug: Stored state in 0.20 seconds
Debug: Executing '/bin/systemctl is-active bird'
Debug: Executing '/bin/systemctl is-enabled bird'
service { 'bird':
ensure => 'stopped',
enable => 'true',
provider => 'systemd',
}
$ sudo systemctl is-enabled bird
enabled
summary: |
- puppet service enable broken on ubuntu vivid for services shipping - sysvinit and systemd support + puppet service enable broken on ubuntu vivid with debian provider |
description: | updated |
Note that the same scenario behaves correctly under Debian jessie, with the patched debian service provider in version 3.7.2-3:
https:/ /bugs.debian. org/775795
Similar example on a Debian jessie system:
$ sudo lsb_release -d apt/debian/ jessie/main amd64 Packages dpkg/status bird.conf bird6.conf system/ bird.service system/ bird6.service
Description: Debian GNU/Linux 8.2 (jessie)
$ apt-cache policy puppet
puppet:
Installed: 3.7.2-4
Candidate: 3.7.2-4
Version table:
*** 3.7.2-4 0
500 http://
100 /var/lib/
$ dpkg -L bird | vgrep ...
/etc/init/
/etc/init/
/etc/init.d/bird
/etc/init.d/bird6
/lib/systemd/
/lib/systemd/
$ sudo puppet resource --debug --param provider --param enable service bird bird]/enable: enable changed 'true' to 'false' bird]/enable: enable changed 'false' to 'true'
Debug: Executing '/usr/sbin/service bird status'
Debug: Executing '/bin/systemctl show -pSourcePath bird'
Debug: Executing '/bin/systemctl is-enabled bird'
service { 'bird':
ensure => 'running',
enable => 'true',
provider => 'debian',
}
$ sudo puppet resource --debug --param provider --param enable service bird enable=false
Debug: Executing '/usr/sbin/service bird status'
Debug: Executing '/bin/systemctl show -pSourcePath bird'
Debug: Executing '/bin/systemctl is-enabled bird'
Debug: Executing '/bin/systemctl disable bird'
Notice: /Service[
Debug: Finishing transaction 16554200
Debug: Storing state
Debug: Stored state in 0.29 seconds
Debug: Executing '/usr/sbin/service bird status'
Debug: Executing '/bin/systemctl show -pSourcePath bird'
Debug: Executing '/bin/systemctl is-enabled bird'
service { 'bird':
ensure => 'running',
enable => 'false',
provider => 'debian',
}
$ sudo puppet resource --debug --param provider --param enable service bird enable=true
Debug: Executing '/usr/sbin/service bird status'
Debug: Executing '/bin/systemctl show -pSourcePath bird'
Debug: Executing '/bin/systemctl is-enabled bird'
Debug: Executing '/bin/systemctl enable bird'
Notice: /Service[
Debug: Finishing transaction 18953360
Debug: Storing state
Debug: Stored state in 0.21 seconds
Debug: Executing '/usr/sbin/service bird status'
Debug: Executing '/bin/systemctl show -pSourcePath bird'
Debug: Executing '/bin/systemctl is-enabled bird'
service { 'bird':
ensure => 'running',
enable => 'true',
provider => 'debian',
}