Como configuro classes parametrizadas com arrays no fantoche?

1

Meu objetivo é definir uma classe que receba, como entrada, uma matriz de pares. Como não sei como definir uma matriz de pares, vou usar um par de matrizes.

class student($username, $full_name){
  notify {"user":  message => "username: ${username}\n"}
  notify {"fullname":  message => "fullname: ${full_name}\n"}
  exec {'finger': command => "/usr/bin/finger ${username}", logoutput => true }
}

$users = ['elion', 'azee', 'root']
$names = ['El Lion', 'Avery Zee', "Rooty Root"]

class { 'student':
  username => $users,
  full_name => $names
}

Ao fazer um 'puppet apply file.pp', espero que a saída faça uma iteração pelos dois arrays, imprima as notificações e dedique os alunos (isso parece horrível) na ordem dada pelos arrays. Eu tentei isso e o que acabou acontecendo, é que o fantoche juntou os arrays em uma string, então o valor $ users acabou sendo: elionazeeroot e o valor $ names acabou sendo El Lion Avery Zee Rooty Root .

Duas perguntas:

  1. Existe uma maneira de definir uma classe para lidar com um grupo de dados, como estou tentando fazer aqui?
  2. Eu suspeito que não estou usando a construção correta para alcançar meu objetivo. O que devo fazer em vez disso?
por Avery Chan 31.05.2013 / 10:08

1 resposta

4

A maneira natural de representar seus dados em uma linguagem de programação seria um hash como este:

$users = {
  elion => 'El Lion',
  azee  => 'Avery Zee',
  root  => 'Rooty Root,
}

Embora seja possível fazer isso no Puppet, descobri que é melhor decidir o que seria uma definição de recurso para uma única entrada e, em seguida, estruturar o hash como algo que você poderia passar para create_resources () . Nesse caso, isso significaria algo assim:

define student ($full_name) {
  notify { "user ${title}":
    message => "username: ${title}\n",
  }
  notify { "fullname ${title}":
    message => "fullname: ${full_name}\n",
  }
  exec { "finger ${title}":
    command   => "/usr/bin/finger ${title}",
    logoutput => true,
  }
}

$users = {
  elion => { full_name => 'El Lion'   },
  azee  => { full_name => 'Avery Zee' },
  root  => { full_name => 'Rooty Root },
}

create_resources(student, $users)

No entanto , como observa Ger, você será o melhor se usar Hiera . Hiera permite que você separe seu código (as definições de manifesto) de seus dados (neste caso, os nomes específicos dos alunos). Na íntegra, eis o que eu faria para sua configuração:

  • Coloque os dados do aluno em um arquivo hiera. Você pode usar JSON ou YAML; Eu gosto do YAML. Seria algo assim:

    classroom::users:
      elion:
        full_name: El Lion
      azee:
        full_name: Avery Zee
      root:
        full_name: Rooty Root
    
  • Defina um tipo de recurso para os alunos e coloque-o em classroom/manifests/student.pp em $modulepath do Puppet. Seria parecido com o tipo de recurso student acima, mas seria nomeado classroom::student .

  • Defina uma classe classroom em classroom/manifests/init.pp com o seguinte conteúdo:

    class classroom (
      $users = hiera('classroom::users', undef),
    ) {
      create_resources(classroom::student, $users)
    }
    

Se você estiver usando o Puppet 3.x, a chamada hiera() nos parâmetros da classe será redundante, mas você precisará dela se ainda estiver no Puppet 2.7.

    
por 31.05.2013 / 15:23

Tags