Por que meu recurso definido se recusa a copiar arquivos de origem listados em uma matriz?

1

Eu estou tentando preencher alguns arquivos de configuração de modules/apt_config/files usando um recurso definido e uma matriz de arquivos para instalar.

define aptfile($file) {
    file { $file: source => "puppet:///modules/${module_name}/etc/apt/${file}", }
}
aptfile{ [ 'apt.conf', 'sources.list', ]: }

De acordo com este relatório de bug , $ module_name deve estar disponível. Essa parte não está me causando dor. O que parece estar quebrado é que o $ file não está sendo preenchido quando eu chamo o recurso; Em vez disso, recebo o seguinte erro:

Must pass file to Apt_config::Aptfile[apt.conf] at /tmp/vagrant-puppet/modules-0/apt_config/manifests/init.pp:10 on node vagrant.home

Observe que a linha 10 é a linha que contém a definição define aptfile .

A sintaxe é um pouco misteriosa. Então, apenas no caso de eu estar especificando o caminho do arquivo para trás, eu também tentei isto:

define aptfile($file) {
    file { "/etc/apt/${file}":
        source => "puppet:///modules/${module_name}/${file}",
    }
}
aptfile{ [ 'apt.conf', 'sources.list', ]: }

com resultados idênticos. Eu sei que eu poderia especificar cada arquivo individualmente, mas o que eu preciso fazer para fazer este loop funcionar corretamente?

    
por CodeGnome 09.08.2012 / 17:54

1 resposta

2

$ file é um atributo. Se você quiser usar o nome de uma instância da definição (um dos itens da matriz que você está usando ao declarar o aptfile), você usaria $ name.

Então, se você mantiver as coisas como elas são, você faria algo assim:

aptfile {'somename':
  file => ['apt.conf', 'sources.list'],
}

No entanto, o que você provavelmente está procurando é algo assim:

define aptfile(
  $base_path = '/etc/apt',
) {
  file {"${base_path}/${name}":
    source => "puppet:///modules/${module_name}/files/${name}",
  }
}

Observe que $ name vem do título / nome do recurso (define é essencialmente um recurso personalizado de tipos) quando você o declara. O aplica-se a todos os recursos. Quando você usa uma matriz ao declarar um arquivo de recursos {['f1.txt', 'f2.txt']:} você está simplesmente condensando a declaração de múltiplos recursos de arquivo ... arquivo {'f1.txt':}, arquivo {'f2.txt':}. $ name dentro do corpo é o nome da declaração de recursos em jogo enquanto está sendo analisado / processado.

Em seguida, chame como você:

aptfile {['apt.conf', 'sources.list']: }

Eu me vejo usando apenas modelos com conteúdo = > template ('modulename / somefile.erb') mesmo se eu não precisar da funcionalidade do template apenas porque o caminho é mais são (com o mínimo de overhead adicional eu imagino). Ansioso para source = > adotando o mesmo uso de caminho mais razoável.

Marcar

    
por 10.08.2012 / 19:38