Назад | Перейти на главную страницу

Зависимость ресурсов марионетки

Привет всем,

Когда я применяю марионетку, я получаю сообщение об ошибке:

Warning: Scope(Mod::Cl[title]): Can't load '/tmp/file.yaml' File does not exist!
Error: Evaluation Error: Error while evaluating a Resource Statement, Evaluation Error: Operator '[]' is not applicable to an Undef Value.

Я указываю, что loadyaml - это функция модуля stdlib

Однако я хочу выполнить файловый ресурс перед определением ресурса

Кто-нибудь может мне помочь?

class mod::princ (

    file { '/tmp/file.yaml':
        ensure  => file,
        owner   => 'root',
        group   => 'root',
        mode    => '0644',
        source  => "puppet:///modules/othermod/file.yaml",
        before => Mod::Cl["title"],
    }->
    Mod::Cl{ "title" :
        tmp_file => "/tmp/file.yaml",
    }

}

define mod::cl (
    String $tmp_file,
){

    $tmp = loadyaml("$tmp_file")

    $tmp[var].each |Integer $i, Hash[String,String] $var|
    {
      $mark=$var['Mark']
    }

}

Как упомянул Доминик в своем комментарии, loadyaml функция запускается во время компиляции.

Если вы запускаете Puppet через Puppet Master / Server и puppet agent, это происходит на сервере, прежде чем манифест будет отправлен клиенту, не на самом клиенте.

В дополнение loadyaml функция выполняется в компилироватьне казнь - значит, файл должен существовать перед Кукольный пробег имеет место.

Я бы спросил, почему вы применяете этот подход в своем коде Puppet - вы на самом деле не объясняете, для чего предназначен код или как выглядит ваше предполагаемое конечное состояние.

Вы можете получить те же результаты, используя Hiera.

hieradata / common.yaml

---
mod::princ::data:
  entry:
    foo: bar
  yrtne:
    oof: rab

модули / мод / манифесты / princ.pp

class mod::princ (
  Hash $data
) {

  $data.each |Integer $i, Hash $elem, $var | {
    $mark=$var['Mark']
  }

}