0

在课堂上,我想这样做:

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"]
    }
}

我收到了这个错误:

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

4

2 回答 2

1

不幸的是,它似乎不像你想的那么简单。这里简单解释一下Puppet用户组的问题。

这句话总结了这篇文章:

Puppet 不是脚本引擎,它的语言也不是脚本语言。您可以在 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"]
  }
}
于 2013-02-06T18:59:09.580 回答
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
}

希望这可以帮助....

于 2013-02-06T22:05:33.863 回答