puppet propaga variável do nó para erb template?

2

É possível declarar a variável no node e então propagar para o template erb?

Exemplo:

node basenode {
  $myvar = "bar" # default
  include myclass
}

node mynode extends basenode {
  $myvar = "foo"
}

class myclass {
  file { "/root/myfile":
    content => template("myclass/mytemplate.erb")
    ensure  => present,
  }
}

Fonte de mytemplate.erb :

myvar has value: <%= myvar %>

Eu sei que meu exemplo pode ser complicado. Mas estou tentando propagar o arquivo em (quase) todos os meus nós e quero que seu conteúdo seja alterado dependendo do que solicita o arquivo. A declaração $myvar = "bar" deve ser padrão quando o nó não sobrepor seu valor.

Existe uma solução para o meu problema? Estou usando o fantoche 0.24.5

Edit: O problema aqui é provavelmente a ordem de herança variável. Esta variável $ myvar não terá o valor foo no nó mynode . A solução aqui seria incluir myclass diretamente em mynode . Mas eu realmente não quero fazer isso. Existe uma opção para substituir o valor da variável de classe após a classe ter sido incluída?

    
por Michal Bryxí 10.01.2011 / 17:13

3 respostas

3

A herança do nó Puppet é não igual à herança na maioria das outras linguagens de programação. As classes incluídas são avaliadas imediatamente quando a criança é avaliada. E o nó pai é avaliado depois disso . Portanto, meu exemplo nunca funcionará. Se você quiser saber a solução recomendada para isso, leia fantoche - equívocos comuns . Eu fiz assim e funciona.

Embora eu tenha que admitir que estou bastante desapontado agora, porque a complexa sintaxe de marionetes pode ser confusa para os iniciantes.

    
por 12.01.2011 / 20:32
2

Outras respostas já apontaram o problema de escopo. O que você provavelmente quer fazer é usar o nó base somente para definições de variáveis e separar a lógica real (incluindo suas definições de classe base) em uma classe separada incluída por todos os seus nós. Isso preserva o escopo da maneira que você quer e apenas adiciona uma única linha extra a todas as definições de nó.

node basenode {
  $myvar = "bar" # default
}

node mynode extends basenode {
  $myvar = "foo"
  include baseclass
}

class baseclass {
  include myclass
}

class myclass {
  file { "/root/myfile":
    content => template("myclass/mytemplate.erb"),
    ensure  => present
  }
}
    
por 20.01.2011 / 04:41
0

Em vez de declarar o valor padrão no basenode, eu declararia o padrão dentro do próprio modelo. Desde o ERB é em grande parte baseado em ruby, você pode se safar com uma lógica bastante extensa. Aqui está um exemplo do modelo que eu uso para gerenciar o arquivo de configuração do snort.

var DNS_SERVERS <% if has_variable?("dns_servers") then %>[<%= dns_servers.flatten.join(',') %>]<% else %>$HOME_NET<% end %>

Neste caso, estou usando uma matriz que, se existir, é transformada em uma lista separada por vírgula para inclusão. Caso contrário, o padrão $ HOME_NET se acostuma. Se simplificarmos para o seu exemplo, poderíamos usar:

myvar has value <% if has_variable?("myvar") %><% then %><%= myvar %><% else %>bar<% end %>

Novamente, se a variável myvar tiver sido definida, ela será expandida, caso contrário, a string "bar" será impressa. Dessa forma, a variável myvar pode ser definida ou não nas definições do nó com impunidade.

    
por 10.01.2011 / 17:44

Tags