Puppetのssh_authorized_keyリソースを試してみる

#puppet

~/.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リソースでまるごと管理するよりは柔軟になったと思う。 あと、serverspec2have_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に空白スペースが使えない等の細かな違いがある)。