这是我用来设置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文件?
答案 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"],
}