knife soloをパスワードなしに利用するためには以下の条件を満たすユーザーが必要になる
- sshで公開鍵でログインできる
- 秘密鍵にはパスフレーズがついていない
- sudoがパスワードなしでできる
最初に鍵を作るところは自分でやるとして、その後は鍵をchef経由でサーバーに設定して、sudoも編集できるようにしておけばchefを利用してその後は簡単にサーバーセットアップができる。
この辺の処理をしてれくれるレシピを探してみた。
公開鍵の設定についてはopscodeでuserというクックブックが提供されているようだ。
berks経由でのこのクックブックを読み込む。まずはBerksfileを編集する。
source "https://supermarket.getchef.com" cookbook 'yum-epel' cookbook 'apache2' cookbook 'mysql' cookbook 'user'
クックブックをダウンロードする
berks install
このcookbookでは新しい属性のみ利用できるようになっている。使い方としては以下の手順になる。
- クックブック作成
- 新しい属性を設定したrecipeを作成
- run_listにuserと新しいクックブックを設定する
ではクックブックを作成する
knife cookbook create ssh_user -o site-cookbooks
recipeを編集する
user_account 'yamada' do action :create ssh_keys ['ssh-rsa AAAA '] end
ポイントは user_accountリソースでssh_keys属性を設定する。chefのオリジナルのuserリソースではuser_accountリソースは利用できない。しかしuserクックブックを利用することで、このリソースが利用できるようになり、追加の属性が設定できる。そのうちの一つが ssh_keysになる。
このssh_keysにはあらかじめ作成しておいた公開鍵を設定する。上のレシピではユーザーyamadaが作成され、公開鍵とリンクする。
次にノードを編集する
{ "run_list": [ "recipe[user]", "recipe[ssh_user]" ], "automatic": { "ipaddress": "192.168.1.1" } }
ノードではuserレシピ、ssh_userレシピの順番に実行する。
kinife soloを実行する。以下のようなメッセージがでる。
Starting Chef Client, version 11.16.2 Compiling Cookbooks... Converging 1 resources Recipe: ssh_user::default * user_account[yamada] action create * user[yamada] action create - create user yamada * directory[/home/yamada/.ssh] action create - create new directory /home/yamada/.ssh - change mode from '' to '0700' - change owner from '' to 'yamada' - change group from '' to '502' - restore selinux security context * directory[/home/yamada] action create - change mode from '0700' to '02755' - restore selinux security context * template[/home/yamada/.ssh/authorized_keys] action create - create new file /home/yamada/.ssh/authorized_keys - update content in file /home/yamada/.ssh/authorized_keys from none to 5fbc78 --- /home/yamada/.ssh/authorized_keys 2014-09-25 10:05:59.707530608 +0 | | |
.sshフォルダの作成、authorized_keysの作成、パーミッションの設定などすべて実行してくれる。
公開鍵でログインできるか確認する。
$ ssh yamada@192.168.1.1 -i .\.ssh\id_rsa cygwin warning: MS-DOS style path detected: .\.ssh\id_rsa [yamada@localhost ~]$