kakakakakku blog

Weekly Tech Blog: Keep on Learning!

knife-solo を実行すると Bad configuration option: ControlPersist と出る

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 をバージョンアップする必要がある.

d.hatena.ne.jp

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

github.com

.chef/knife.rb

よって knife.rb で設定を上書きして実行することでエラーは出なくなった.ワークアラウンドとしては良いかと思う.

knife[:ssh_control_master] = 'no'