On Thursday, July 18, 2013 3:38:25 PM UTC-5, Alon Nisser wrote:
>
> Using ```puppetlabs/apt``` in a puppet provisioner for vagrant. the
> module is installed in puppet/modules and I'm getting a strange Dependency
> cycle error.
> the code in the manifest file:
>
> # Run apt-get update when anything beneath /etc/apt/ changes
> #taken from
> https://blog.kumina.nl/2010/11/puppet-tipstricks-running-apt-get-update-only-when-needed/
> exec { "apt-get update":
> command => "/usr/bin/apt-get update",
> onlyif => "/bin/sh -c '[ ! -f /var/cache/apt/pkgcache.bin ] ||
> /usr/bin/find /etc/apt/* -cnewer /var/cache/apt/pkgcache.bin | /bin/grep .
> > /dev/null'",
> }
>
> package {
>
> ["build-essential","apache2","git","python","python-dev","python-setuptools",
> "python-pip"]:
> ensure => present,
> require => Exec["apt-get update"],
> }
>
> class { 'apt':
>
> }
> include apt
>
> apt::builddep { ["python-imaging","python-lxml"]:
> require => Class['apt']
> }
>
> class {'nodejs':
>
> }
> include nodejs
>
> package {"less":
> ensure => present,
> provider => 'npm',
> require => Package['npm'],
>
> }
>
> I actually noticed similiar questions [here](
> http://stackoverflow.com/questions/13568748/dependency-cycle-with-apt-source)
> and [here](
> http://stackoverflow.com/questions/15384733/puppet-issue-with-aptsource-and-stages),
>
> but not with a satisfying answer.
> The error message:
>
> [...]
> (Anchor[apt::update] => Class[Apt] => Apt::Builddep[python-lxml] =>
> Exec[apt-bui
> lddep-python-lxml] => Exec[apt_update] => Class[Apt::Update] =>
> Anchor[apt::upda
> te])
> Try the '--graph' option and opening the resulting '.dot' file in
> OmniGraffle or
> GraphViz←[0m
>
> any known workaound? solution?
>
You are trying too hard. This module goes to considerable effort to avoid
making you declare relationships among its classes and resources. The
relationships you are manually declaring run afoul of the ones declared by
the module itself. In particular, it is incorrect for an apt::builddep to
'require' Class['apt'].
Also, the module has its own provision for running "apt-get update" when
needed, so your Exec for that purpose may be superfluous. However, the Apt
module will only run "apt-get update" when it modifies an Apt resource
itself, so if you contemplate managing some sources via Puppet but not
others (not recommended), then perhaps you do need something like that.
And as a trivial matter, it is redundant to declare class 'apt' via both
the 'include' function and a parameterized-style declaration.
I think your code should instead look like this:
----
include 'apt'
package {
['build-essential','apache2','git','python','python-dev','python-setuptools','python-pip']:
ensure => present,
require => Class['apt'],
}
apt::builddep { ['python-imaging','python-lxml']: }
----
(omitting the irrelevant 'nodejs' and 'less' stuff).
If you were to claim that it is unintuitive that apt::builddep instances
must avoid 'require'ing class 'apt' then you would not get an argument from
me. Or if you complained that these details were not well documented, then
I would not object.
John
--
You received this message because you are subscribed to the Google Groups
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-users.
For more options, visit https://groups.google.com/groups/opt_out.