speg03の雑記帳

主に未来の自分のために試したことなどを記録しています

Chefのプロキシ設定

Chef 10.16.2時点の話。

Chefのプロキシ設定は複数箇所あってそれぞれ利用される場面が異なる。知っている範囲で以下の3種類。

  • package
  • remote_file
  • knife cookbook upload

package

packageリソースで実際に実行されるパッケージマネージャ(yumとか)が使うプロキシ設定はTarget Node上のOSで定義されたhttp_proxy環境変数になる。

これはChefに関係なく以下のような感じ。

export http_proxy=http://USER:PASSWORD@HOST:PORT
export https_proxy=$http_proxy

remote_file

remote_fileリソースは特定のコマンドを経由するのではなくてRubyのコードとして実装されている? Chefで実行される部分なのでChefのプロキシ設定が見られる。client.rbとかsolo.rbに書く。

http_proxy http://HOST:PORT
http_proxy_user USER
http_proxy_pass PASSWORD

https_proxy http://HOST:PORT
https_proxy_user USER
https_proxy_pass PASSWORD

no_proxy "192.168.*"

参考: http://wiki.opscode.com/display/chef/Chef+Configuration+Settings#ChefConfigurationSettings-httpproxy%2Chttpsproxy%2Cnoproxy

knife cookbook upload

CookbookをアップロードするChef Serverにアクセスするときにプロキシが必要な場合。Hosted Chefとか使っていると必要だったりする。これはknife.rbに書く。

require 'rest-client'
RestClient.proxy = "http://USER:PASSWORD@HOST:PORT"

参考: http://tickets.opscode.com/browse/CHEF-2232

まとめ

http_proxy環境変数さえ定義されていれば他の設定に伝搬するようにした。knife.rbとかclient.rbとかsolo.rbとかに書いたら良いと思う。

if ENV["http_proxy"]
  require 'rest-client'
  RestClient.proxy = ENV["http_proxy"]

  require 'uri'
  proxy_env = URI.parse(ENV["http_proxy"])
  proxy_user, proxy_pass = proxy_env.userinfo.split(":")

  http_proxy "http://#{proxy_env.host}:#{proxy_env.port}"
  https_proxy "http://#{proxy_env.host}:#{proxy_env.port}"
  http_proxy_user proxy_user
  http_proxy_pass proxy_pass
  https_proxy_user proxy_user
  https_proxy_pass proxy_pass
  no_proxy "192.168.*"
end