条件语句的Puppet重复声明错误

时间:2018-05-03 16:23:45

标签: puppet puppet-enterprise

我正在尝试为Puppet postgresql资源配置全局设置。我想有条件地做。我根据变量的内容使用if语句对其进行配置。

define setup_postgresql_globals (
  $datadir,
) {
  if $datadir {
    class { 'postgresql::globals':
      datadir         => "${datadir}",
      needs_initdb    => true,
      version         => '9.3',
    }
  }
  else {
    class { 'postgresql::globals':
      needs_initdb    => true,
      version         => '9.3',
    }
  }
}

我收到此错误。

Error: Duplicate declaration: Class[Postgresql::Globals] is already declared

如果它包含值,我只想将datadir参数传递给postgresql::globals

如何使用条件语句,而不会出现重复声明错误?

2 个答案:

答案 0 :(得分:2)

  

如何使用条件语句,而不会出现重复声明错误?

问题不是条件语句,而是您声明多个setup_postgresql_globals实例的事实。每次声明相同的类,虽然类是幂等的并且可以多次声明,但只有对给定类的声明的第一次评估才能使用resource-like syntax。所有其他人必须使用包含类似语法的变体之一。

部分由于这个原因,将类似资源的类声明放入定义的类型中的形式很差。这样做是在惹麻烦。如果您需要使用类似资源的类声明,则将其放在另一个类中。这可能完全解决了这个问题,但最糟糕的是将其提升到更高的水平。在你的情况下看起来这可能是一种合理的方法,因为setup_postgresql_globals肯定听起来像本身应该是幂等的东西。

还要考虑类 - 但不是定义 - 可以使用自动数据绑定。依赖外部数据自动绑定到类参数通常是用类似include的类替换类似资源的类声明的好方法。当以适当的适度应用时,可以产生更清洁,更简单,更易于使用和维护的清单。

答案 1 :(得分:1)

  

我只想将datadir参数传递给postgresql :: globals,如果它包含一个值。

如果datadir不包含值,则不应该担心不通过postgresql::globals。只需将参数与其他参数一起传递给datadir。如果postgresql::globals有一个值,那么该类将使用它,如果没有,那么datadir => "${datadir}"将处理它并使用它自己的默认值。你需要修改传递参数的方式,这不起作用:datadir => $datadir,,你必须像define setup_postgresql_globals ( $datadir = undef, ) { class { 'postgresql::globals': datadir => $datadir, needs_initdb => true, version => '9.3', } } 那样传递它。你的定义可以这么简单:

Error: Duplicate declaration: Class[Postgresql::Globals] is already declared

您获得datadir的原因是因为您正在实例化您的定义多次数。本质上,一个定义可以实例化多个时间,因此在一个类中包含一个像包含类的类可能会有问题,因为你只能包含一个类这样的类。有两种方法可以解决此问题。

1)评估您对此定义的需求。它就像您创建此定义一样只是为了处理undef参数为datadir值。正如我所表明的那样,您可能不需要这个定义,因为您不需要逻辑。

2)你应该只在一个定义中做基本的类包含。你可以像saftly一样包括这样一个类。您必须通过hiera的自动参数查找系统处理设置define setup_postgresql_globals ( $datadir = undef, ) { include 'postgresql::globals' } 。例如:

postgresql::globals

您可能应该从实例化setup_postgresql_globals的位置删除此定义和句柄,包括const {WebhookClient} = require('dialogflow-fulfillment'); const function = require('firebase-functions'); const agent = new WebhookClient({ request: request, response: response }); const catalogSearch = require("rss-to-json"); exports.libraryChat = functions.https.onRequest(request, response) => { function catalog_search(agent) { var itemSubject = agent.parameters["item-subject"] ? "+" + agent.parameters["item-subject"] : ""; var itemTitle = agent.parameters["item-title"] ? "+" + agent.parameters["item-title"] : ""; var chatResponse = ""; var itemList = new Array(); if (agent.parameters["author-name"]) { var authorName = agent.parameters["author-name"]["name"] ? "+" + agent.parameters["author-name"]["name"] + " " + agent.parameters["author-name"]["last-name"] : "+" + agent.parameters["author-name"]["last-name"]; } var searchString = ""; if (itemSubject.length > 0) { searchString = searchString + itemSubject; } if (itemTitle.length > 0 ) { searchString = searchString + itemTitle; } if (authorName.length > 0) { searchString = searchString + authorName; } var url = "https://gapines.org/opac/extras/opensearch/1.1/-/rss2-full?searchTerms=site(GCHR-CCO)" + searchString + "&searchClass=keyword"; console.log(url); catalogSearch.load(url, (err, jsonResponse) => { if (!err) { itemList = jsonResponse.items; chatResponse = "The first ten items returned for your search are: "; } else { chatResponse = "I'm sorry! I've encountered an error while retrieving that data!"; } }); itemList.forEach( (title, index) => { chatResponse = chatResponse + (index + 1).toString() + title.title; }); agent.add(chatResponse); } let intentMap = new Map(); intentMap.set("Catalog Search", catalog_search); }