Условно внутри определить в марионетке

Бегущая кукла 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 атрибуты не имеют никакого значения, назначенного первоначально.

Другие вопросы по тегам