knife-solo を最新 v0.5.1 に更新して knife solo cook
を実行したら rsync でエラーになった.具体的には ControlPersist
の設定でエラーになっていた.
$ knife solo cook xxx (中略) Uploading the kitchen... command-line: line 0: Bad configuration option: ControlPersist rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6] (中略)
ControlPersist
OpenSSH 5.6 で追加された機能で,今回動作確認をしていた環境が古く,OpenSSH 5.3 だった.根本対応としては OpenSSH をバージョンアップする必要がある.
knife-solo/lib/knife-solo/ssh_command.rb
knife-solo のコードを読んでいたら,設定で ControlPersist を OFF にすることができそうだった.
def ssh_args args = [] args << [user, host].compact.join('@') args << "-F #{config[:ssh_config]}" if config[:ssh_config] args << "-i #{config[:identity_file]}" if config[:identity_file] args << "-o ForwardAgent=yes" if config[:forward_agent] args << "-p #{config[:ssh_port]}" if config[:ssh_port] args << "-o UserKnownHostsFile=#{connection_options[:user_known_hosts_file]}" if config[:host_key_verify] == false args << "-o StrictHostKeyChecking=no" if config[:host_key_verify] == false args << "-o ControlMaster=auto -o ControlPath=#{ssh_control_path} -o ControlPersist=3600" unless config[:ssh_control_master] == "no" args.join(' ') end
.chef/knife.rb
よって knife.rb
で設定を上書きして実行することでエラーは出なくなった.ワークアラウンドとしては良いかと思う.
knife[:ssh_control_master] = 'no'