Puppet在任何类之前运行生成函数?

时间:2014-07-30 22:33:05

标签: puppet

这是我用来设置Vagrant盒子的一个清单。

class company::setup {
  notice("Running initial base setup steps")

  package {
    ["ruby-dev","libxslt-dev","libxml2-dev","libpq-dev","imagemagick","software-properties-common","python-software-properties","python","g++","make"]: ensure => present
  }

  Class['company::setup::user'] -> Class['company::setup::keygen'] -> Class['company::setup::keyuse']

  class { 'company::setup::user': }
  class { 'company::setup::keygen': }
  class { 'company::setup::keyuse': }
}

class company::setup::user {
  file { 'username-home':
    path => '/home/username',
    ensure => 'directory',
  }

  file { 'username-home-ssh':
    path => '/home/username/.ssh',
    ensure => 'directory',
    require => File['/home/username'],
  }

  user { 'username':
    name => 'username',
    ensure => present,
    password => sha1('shopshop'),
    require => File['/home/username/.ssh'],
  }
}

class company::setup::keygen {
  exec { "ssh_keygen_username":
    path => "/bin:/usr/bin",
    command => "ssh-keygen -t dsa -b 1024 -f /home/username/.ssh/id_dsa -N ''",
  }
}

class company::setup::keyuse {
  ssh_authorized_key { "username-access-key":
    name => 'Username Access Key',
    ensure => present,
    key => generate( "/bin/cat", "/home/username/.ssh/id_dsa.pub"),
  }
}

我尝试了几种不同的设置,例如使用阶段,使用' - >'将不同的文件,用户和其他类链接在一起,但结果始终相同:

Error: Failed to execute generator /bin/cat: Execution of '/bin/cat
 /home/username/.ssh/id_dsa.pub' returned 1: /bin/cat: /home/username/
.ssh/id_dsa.pub: No such file or directory at /tmp/vagrant-puppet-3/
manifests/manifests/06-setup.pp:47 on node localhost.vn.vagrantbox.net

经过一整天的努力才能让它发挥作用,我将继续前进到我所在的清单的另一部分,希望有人可以帮助我解决这个问题。< / p>

任何想法如何延迟“生成”#39;从运行开始直到创建了id_dsa.pub文件?

1 个答案:

答案 0 :(得分:3)

基本上你不能使用这种方法从这里到达那里。

Puppet正在编译并在实际执行任何操作之前将所有资源放在一起。由于id_rsa.pub文件在puppet实际执行之前不会存在,所以你被困在鸡蛋和鸡蛋洞里。

解决方法是不使用ssh_authorized_key并使用exec或文件资源。

exec {'username-access-key':
  command => 'cat /home/username/.ssh/id_dsa.pub > /home/username.ssh/authorized_keys',
  creates => '/home/username/.ssh/authorized_keys',
  require => Exec["ssh_keygen_username"],
}

或(更好,因为你可以在文件上设置烫发)

file {'/home/username/.ssh/authorized_keys':
  ensure  => file,
  source  => '/home/username/.ssh/id_rsa.pub',
  owner   => 'username'
  group   => 'username',
  mode    => '0600',
  require => Exec["ssh_keygen_username"],
}