Como garantir que a instrução «if» seja analisada _antes_ de um determinado recurso / classe?

3

Às vezes, há interações complicadas entre os pacotes. Para evitar a interface de classe com inúmeros parâmetros aparentemente não relacionados, pensei em usar tags, defined(<resource>) function para permitir que os recursos alterassem um pouco seu comportamento com base no restante da configuração (não em fatos).

Infelizmente eu não consigo descobrir uma maneira de permitir que o Puppet analise primeiro a classe que pode gerar condições, e só então analise a classe que comportamento implicitamente (por meio de tags, por exemplo) depende do modo como a primeira classe foi executada.

Suponha que aqui exista uma classe que gere um local onde um usuário específico armazena seus dados pessoais confidenciais. A turma pode, por exemplo crie a partição (possivelmente criptografada) ou apenas mantenha uma pasta externa (por exemplo, / mnt / user). Ou pode manter as pastas onde estão por padrão, ou seja, em / home / user (spurcetype = > 'none')

class userdocs ( $sourcetype) {
  case $sourcetype {
    'cryptpartition' : {
      tag 'dedicated_user_docs_partition'
      ...
    }
    'partition' : {
      tag 'dedicated_user_docs_partition'
      ...
    }
    'none' : {
      ...
    }
  }
  ...
}

Além do conjunto padrão de pastas, que um usuário pode querer encaminhar para sua partição, existem pastas cuja existência depende do software em execução, como thunderbird ou virtualbox. Criação do link (em vez de pasta) por exemplo O VirtualBox deve ser feito apenas se duas condições forem satisfeitas: a) usuário gerencia partição separada ( tagged('dedicated_user_docs_partition') ) e usuário instala o VirtualBox.

Deve haver um lugar onde eu possa colocar esse código extra, que verifica essas duas condições. Eu posso colocá-lo na classe, que gerencia a caixa virtual:

class vbox {
  if tagged('dedicated_user_docs_partition') {
    file { "${userhome}/.VirtualBox": ensure=>link, require=>Class['userdocs'] ...
    }
  } else {
    file { "${userhome}/.VirtualBox": ensure=>directory, require=>Class['userdocs'] ...
    }
  }
  ...
}

O problema é que, embora eu exija explicitamente que o recurso file seja executado antes da classe userdocs , o recurso file é avaliado após e o fantoche erroneamente assume que o usuário não tem o dedicated_user_docs_partition e executa a ramificação errada da instrução if .

Existe alguma maneira de resolver este problema?

Eu fiz uma postagem cruzada desta questão em ask.puppetlabs.com .

    
por Adam Ryczkowski 23.04.2014 / 12:36

2 respostas

1

É uma resposta usando recursos virtuais, que lavaman sugeriu.

Eu não gosto do fato, que me força a colocar código com o "VirtualBox" para a classe, que eu acho que deveria ser logicamente independente para ele. Mas eu acho que pode ser trabalhado em torno de classes delegadas (como userdocs :: virtualbox, definido completamente em outro lugar).

class userdocs ( $sourcetype) {
  case $sourcetype {
    'cryptpartition' : {
      @file { "${userhome}/.VirtualBox": ensure=>link, ...
      }
      ...
    }
    'partition' : {
      @file { "${userhome}/.VirtualBox": ensure=>link, ...
      }
      ...
    }
    'none' : {
      @file { "${userhome}/.VirtualBox": ensure=>directory, ...
      }
      ...
    }
  }
  ...
}

e

class vbox {
  realize File["${userhome}/.VirtualBox"]
  ...

}

    
por 24.04.2014 / 14:23
0

Para esta resposta, o crédito vai para o usuário lavaman em ask.puppetlabs.com:

Assuming you are managing the software with puppet as well (which appears to be the case from your sample code), I would use virtual resources in the software modules that get collected by the module handling the mounts.

http://docs.puppetlabs.com/puppet/latest/reference/lang_virtual.html

    
por 24.04.2014 / 14:01

Tags