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.


Reply via email to