我正在尝试为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
。
如何使用条件语句,而不会出现重复声明错误?
答案 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);
}
。