Edited at

Chefのプロキシ設定

More than 5 years have passed since last update.

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