Puppet Error:重复定义

时间:2013-02-06 18:26:48

标签: ruby puppet

在课堂上,我想这样做:

stop a service
reinstall a package
start the previous service again

这是我的班级:

class MyClass{
    service{"ServiceName-start":
      name => "ServiceName",
      ensure => "stopped",
    }
    package{"PackageName":
        ensure => "installed",
        require => Service["ServiceName-Start"],
    }
    service{"ServiceName-Stop":
      name =>  "ServiceName",
      ensure => "running",
      require => Package["PackageName"]
    }
}

我收到了这个错误:

  

重复定义:服务[ServiceName]已在文件中定义   第2行/puppet/mycsass.pp;无法在/puppet/myclass.pp:9重新定义

2 个答案:

答案 0 :(得分:1)

不幸的是,它似乎并不像你想的那么简单。 Here's a brief explanation of the problem in the Puppet User's group.

这句话总结了帖子:

  

Puppet不是脚本引擎,它的语言不是   脚本语言。你可以在Puppet中编写脚本,但确实如此   繁琐。木偶是关于实现和维持特定的   系统资源状态,故意不再强调机制   从这里到那里。因此,“我如何让Puppet表演   ?“很少是一个有用的问题。

帖子作者还提供了一个替代(虽然不太吸引人的解决方案),我已经适应了你的例子:

class MyClass {
  exec { "ServiceName-Stop":
    command => "/bin/sh -c '/sbin/service ServiceName stop",
  }
  package{"PackageName":
    ensure => "installed",
    require => Service["ServiceName-Stop"],
  }
  service{"ServiceName-Start":
    name =>  "ServiceName",
    ensure => "running",
    require => Package["PackageName"]
  }
}

答案 1 :(得分:0)

可能虚拟资源在这里很有用虽然我不确定...我正在使用的两个.pp文件的当前结构如下:

/etc/puppet/modules/testmodule/manifests/init.pp
/etc/puppet/modules/testmodule/manifests/test.pp

init.pp看起来像这样;我已经使用mysqld进行服务。

class testmodule {

  @service { "mysqld" :
    ensure => stopped,
  }

}

test.pp看起来像这样;

class testmodule::test inherits testmodule {

  realize(Service["mysqld"])

  package { "mysql" :
    ensure => installed,
    notify => Service["mysqld"],
  }

  Service["mysqld"] {
    ensure => running,
  }

  realize(Service["mysqld"])

}

在您的site.pp中,您可以这样做:

node 'my_nodename.com' {
   include testmodule::test
}

希望这会有所帮助......