Условно внутри определить в марионетке
Бегущая кукла 3.8
У меня есть два определения:
define desktop::vinstall () {
package { $title:
ensure => installed,
allow_virtual => true,
configfiles => keep,
}
}
а также
define desktop::vinstallwseeds () {
package { $title:
ensure => installed,
allow_virtual => true,
configfiles => keep,
require => File["/var/cache/debconf/pkg-${title}.seeds"],
responsefile => "/var/cache/debconf/pkg-${title}.seeds",
}
file { "/var/cache/debconf/pkg-${title}.seeds":
source => "puppet:///modules/desktop/pkg-${title}.seeds",
ensure => present,
}
}
Хотелось бы превратить их в один оператор определения с необязательным логическим аргументом, что-то вроде:
define desktop::vinstallopt ( $queryresponse = 'false', ) {
package { $title:
ensure => installed,
allow_virtual => true,
configfiles => keep,
if $queryresponse == 'true' {
require => File["/var/cache/debconf/pkg-${title}.seeds"],
responsefile => "/var/cache/debconf/pkg-${title}.seeds",
}
}
file { "/var/cache/debconf/pkg-${title}.seeds":
source => "puppet:///modules/desktop/pkg-${title}.seeds",
ensure => present,
}
}
а затем создать его с помощью таких утверждений в init.pp:
@desktop::vinstallopt { 'gdebi': queryresponse => 'false', }
Но это дает ошибку:
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Puppet::Parser::AST::Resource failed with argument error ArgumentError: Invalid resource type desktop::vinstallopt at /etc/puppet/modules/desktop/manifests/init.pp:40 on node machine.prvt.net
где строка 40 имеет синтаксис выше. Я новичок с марионеткой, поэтому мои извинения, если это окажется простой вопрос синтаксиса. Я попытался найти способ сделать это из документации PuppetLabs и других пользователей марионеток, но пока безуспешно.
1 ответ
Вы пытаетесь вставить if
блок внутри объявления ресурса. Увы, это невозможно. Блок должен быть глобальным или регулярным (например, тело класса, тело определения, тело лямбды).
В этом случае вы хотите "изменить" package
ресурс, так сказать. Мне нравится использовать следующую конструкцию для этой цели:
package { $title:
ensure => installed,
allow_virtual => true,
configfiles => keep,
}
if $queryresponse {
Package[$title] {
require => File["/var/cache/debconf/pkg-${title}.seeds"],
responsefile => "/var/cache/debconf/pkg-${title}.seeds",
}
}
Обратите внимание, что этот синтаксис переопределения разрешен только в этой области, потому что require
а также responsefile
атрибуты не имеют никакого значения, назначенного первоначально.