~/.ssh/authorized_keys
をpuppetのssh_authorized_keyリソース1で管理できるらしい。
ssh_authorized_key resource
manifests
以下のように、利用者と鍵、そして鍵の種類を用意したリソースを用意する。
(user
の代わりにtarget
という属性で指定箇所への設定も可能なようである)
ssh_authorized_key { 'vagrant insecure public key':
user => 'root',
key => 'AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ==',
type => 'ssh-rsa',
}
result
上記のマニフェストを反映させると、rootユーザのssh_authorized_keyに指定の鍵が登録される。
[vagrant@localhost ~]$ sudo ls -l /root/.ssh
ls: cannot access /root/.ssh: No such file or directory
[vagrant@localhost ~]$ sudo puppet apply ssh.pp
Notice: Compiled catalog for localhost in environment production in 0.06 seconds
Notice: /Stage[main]/Main/Ssh_authorized_key[vagrant insecure public key]/ensure: created
Notice: Finished catalog run in 0.06 seconds
[vagrant@localhost ~]$ sudo ls -l /root/.ssh
total 4
-rw------- 1 root root 587 Jul 25 02:27 authorized_keys
puppetで管理されたauthorized_keysは以下のようになる。
# HEADER: This file was autogenerated at Fri Jul 25 02:27:26 +0900 2014
# HEADER: by puppet. While it can still be managed manually, it
# HEADER: is definitely not recommended.
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key
最低でも3つの属性に分けて書かなければいけないのが多少面倒だが、fileリソースでまるごと管理するよりは柔軟になったと思う。
あと、serverspec2のhave_authorized_key
テストをする際にも、manifestsとの対応が分かりやすくなるメリットもある。
注意事項
ssh_authorized_key
は、~/.ssh
ディレクトリが存在しなければ、パーミッション 700 でディレクトリを作成する。
しかし、 ~/.ssh
のパーミッション自体を管理するわけではないので、別途以下のような file リソースも用意すべきだろう。
file { '/root/.ssh':
ensure => directory,
mode => '0700',
owner => 'root',
group => 'root',
}
sshkey
似たようなリソースにsshkey
があるが、こちらは/etc/ssh/ssh_known_host
への登録が可能なようである(title
に空白スペースが使えない等の細かな違いがある)。