carrega condicionalmente um snippet de configuração específica do site em um modelo de arquivo de configuração base

2

Meu objetivo final aqui é incluir um snippet de configuração específico do site em um modelo base comum. Meu primeiro pensamento foi chamar a função de modelo a partir do modelo básico, por exemplo:

Manifesto:

...
$domain = "www.example.com"
...

Modelo:

server {
    # Common configuration items here.
    ...

    # Load site-specific configurations here.
    <%= scope.function_template("sites/$domain/config.erb") %>
}

No entanto, não parece que é possível usar uma variável na chamada de função (por favor me corrija se eu estiver errado). Há também o problema de que um modelo específico do site deve existir.

Então, meu próximo pensamento foi usar uma variável no manifesto contendo o conteúdo de configuração específico do site carregado de um modelo.

Manifesto:

...
$domain = "www.example.com"
$site_specific_content = template("sites/$domain/config.erb")
....

Modelo:

server {
    # Common configuration items here.
    ...

    # Load site-specific configurations here.
    <%= site_specific_content %>
}

No entanto, não consegui encontrar uma maneira de renderizar o modelo se ele existir, mas defina a variável como string vazia se o modelo não existir. (Embora um pouco deselegante, eu acho que uma solução aqui poderia ser apenas criar um modelo específico de site vazio para os sites que não precisam de configuração adicional.)

Alguma idéia?

    
por Gary 20.04.2012 / 22:05

1 resposta

0

However, it doesn't seem that it's possible to use a variable in the function call (please correct me if I am wrong). There's also the problem that a site-specific template must exist.

É possível usar uma variável na chamada de função, mas lembre-se de que seu argumento de função é uma sequência de rubis, não um modelo de marionete. Você poderia fazer isso:

<%= scope.function_template("sites/" + domain + "/config.erb") %>

Ou use a substituição de string do Ruby:

<%= scope.function_template("sites/#{domain}/config.erb") %>

... mas isso ainda produzirá um erro caso o modelo definido não exista.

Para evitar o erro, você pode usar o mecanismo de tratamento de exceções do Ruby dentro do seu modelo, assim:

<%=
  begin
    scope.function_template("sites/#{domain}/config.erb")
  rescue
  end
%>

Ta da! Pode haver uma maneira melhor de fazer isso; Não sou nem um especialista Ruby nem um Puppet, e acabei de inventar isso agora.

    
por 20.04.2012 / 23:21

Tags