Windows パッケージ管理の手段として Chocolatey を効果的に活用したい場合は、独自の社内リポジトリを設定することは必要な要件になります。
Chocolateyコミュニティ・レポジトリには優良な Windows パッケージがたくさんありますが、社内のクライアント・マシンがパッケージをインストールするたびにインターネットにアクセスするのは望まないでしょう。ネットワークが遅くなることは言うまでもありませんが、安全性も保てません。
ProGet、Teamcity、SCCM、または単純な古いファイル共有など、独自のリポジトリをホストするためのソリューションはたくさんあります。このブログでは、NuGet フレームワークを持つ IIS Webサーバーである Chocolatey Simple Server の設定について説明します。無料でセットアップも簡単なので、特に中小企業にはうってつけです。
Chocolatey で Chocolatey Server をインストール
Chocolatey Serverをインストールするにはいくつかの方法がありますが、Puppet モジュールを使用する方法を推奨します。サーバーを稼働させるために必要なほとんどすべてが自動化されているからです。モジュールに入っていない部分は、Puppet で追加設定できます。それらは、ファイアウォールの設定、アプリケーションプールIDの設定、Chocolatey パッケージを格納するUNC共有を指し示す仮想ディレクトリの設定などです。組織の事情によっては、SSL証明書を使用するなど、そのほかの設定も必要かもしれません。
Puppet を使いたくない場合は、Chocolatey CLI を使用して簡単にインストールすることができます。これもほとんどのセットアップを行います。
PS C:\Users\Administrator> choco install chocolatey.server –y
Chocolatey Server 用の Puppet 設定
まず、Puppet マスターサーバーに、Chocolatey Server モジュールをインストールします。
[vagrant@puppet production]$ puppet module install chocolatey-chocolatey_server
Notice: Preparing to install into /home/vagrant/.puppetlabs/etc/code/modules ...
Notice: Downloading from https://forgeapi.puppet.com ...
Notice: Installing -- do not interrupt ...
/home/vagrant/.puppetlabs/etc/code/modules
└─┬ chocolatey-chocolatey_server (v0.0.5)
├─┬ puppet-iis (v1.4.1)
│ └── puppetlabs-stdlib (v4.24.0)
├── puppet-windowsfeature (v1.1.0)
├── puppetlabs-acl (v1.1.2)
└── puppetlabs-powershell (v1.0.6)
上を見ると、puppet-iis、windowsfeature、powershell などの依存関係もインストールされていることがわかります。Puppet Forge から次のモジュールもインストールします。
[vagrant@puppet production]$ puppet module install chocolatey-chocolatey
[vagrant@puppet production]$ puppet module install puppet-windows_firewall
ここで、サーバーへの追加の設定を行うために puppet module generate を使用して、独自の Puppet モジュールを作成します。
[vagrant@puppet production]$ puppet module generate --skip-interview my-chocoserver
モジュール内の init.pp ファイルを編集して、class(メイン・マニフェスト)を作成します。この class は、以下のことを行います。
- chocolatey_server モジュールを使って Chocolatey Server をインストール
- ポート8080のファイアウォール例外を許可(これを Chocolatey Server に使用)
- ベーシックな認証がインストールされていることを確認
- UNC共有を指し示す仮想ディレクトリの作成
- アプリケーションプールを Network Service で実行するように変更
- Webサーバーの MaxAllowedContentLength を50000000に設定(より大きなパッケージにも対応)
実際の init.pp は次のようになります。
class chocoserver {
class {'chocolatey_server':
port => '8080',
}
windows_firewall::exception { 'Choco server':
ensure => present,
direction => 'in',
action => 'Allow',
enabled => 'yes',
protocol => 'TCP',
local_port => '8080',
remote_port => 'any',
display_name => 'Chocolatey Simple Server',
description => 'Inbound rule for Chocolatey Server. [TCP 8080]',
}
windowsfeature { 'Web-Basic-Auth':
ensure => present,
require => Class["chocolatey_server"]
}
exec { 'VirtualDir':
command => '$(Import-Module WebAdministration;New-Item IIS:\Sites\chocolatey.server\App_Data\Packages -type VirtualDirectory -physicalPath \\\\server\\packages$ -Force)',
provider => powershell,
logoutput => true,
require => Class["chocolatey_server"],
}
exec { 'ChocoAppPoolID':
command => '$(Import-Module WebAdministration;Set-ItemProperty IIS:\AppPools\chocolatey.server -name processModel -value @{identitytype=2})',
provider => powershell,
logoutput => true,
require => Class["chocolatey_server"],
}
exec { 'MaxAllowedContentLength':
command => '$(Import-Module WebAdministration;Set-WebConfigurationProperty -filter /system.webserver/security/requestfiltering/requestLimits -name maxAllowedContentLength -value 50000000)',
provider => powershell,
logoutput => true,
require => Class["chocolatey_server"],
}
}
上のように、"chocoserver" class で最初に行うのは、"chocolatey_server" がポート8080にインストールされ実行されていることを確認することです。また、ファイアウォールがポート 8080 に対してオープンになるよう設定します。
Puppet で PowerShell を使用する方法がわかるよう、PowerShell コードを exec リソースを使って実行しています。最初の exec、’VirtualDir’ は、次を実行します。
Import-Module WebAdministration;New-Item IIS:\Sites\chocolatey.server\App_Data\Packages -type VirtualDirectory -physicalPath \\\\server\\packages$ -Force
Chocolatey サーバーに仮想ディレクトリを作成し、UNC共有 - \\server\packages$ を指し示すようにします。これで、データをサーバーとは別に保管することができます。アプリケーションプールID がアクセス許可を与えられるように、chocolatey.server のアプリケーションプールIDを “Network Service” に変更します。これは、コンピュータオブジェクトにUNC共有へのアクセス許可が必要であることを意味します。Puppet でUNCパスを示すためには、サーバーにスラッシュを2つ追加し、共有名にスラッシュを1つ追加する必要がある点に注意してください。
最後の ’MaxAllowedContentLength’ は大きなパッケージも受け付けられるよう、サイズを大きくしています。ここでは50GBとしています(大き過ぎるのはわかっていますが)。
さて、メイン・マニフェストファイル(ここではsite.pp)に、以下を含めます:
node 'puppetagent-win' {
include chocolatey
include chocoserver
}
これで、Chocolatey クライアントがインストールされ、Chocoloser Server を含む chocoserver モジュールがインストールできるようになります。
次に、puppet ノードでこれを実行して設定を適用し、Chocolatey Serverをインストールします。
PS C:\Users\Administrator> puppet agent –test
PowerShell のノードで Get-WebSite を実行すると、Web サーバーが起動されて実行中になります。
PS C:\Users\Administrator> Get-Website
Name ID State Physical Path Bindings
---- -- ----- ------------- --------
chocolatey.server 1 Started C:\tools\chocolatey.server http *:8080:
前にも述べたように、内部レポートのために追加したい変更があるかもしれません。たとえば、パッケージをプッシュするためにAPIキーを変更する必要があるかもしれません。そのためには、c:\tools\chocolatey.server の web.config を次のように変更します。
Chocolatey パッケージの追加とインストール
新しいパッケージを内部リポジトリに追加するには、choco push コマンドを使います。この例では、"test" という名前のパッケージをプッシュします。パッケージが置かれているディレクトリ、この場合は c:\testpackage を指定する必要があります。
PS C:\Users\Administrator> choco push c:\testpackage --source "'http://choco-server:8080'" -k="'MyOwnApiKey"
内部リポジトリからテストパッケージをインストールするには、次のようにします。
PS C:\Users\Administrator> choco install test –source "'http://choco-server:8080'" -y
Dan Franciscus
Dan Franciscus is a systems engineer and VMware Certified Professional (VCP) specializing in VMware, PowerShell, and other Microsoft-based technologies. You can reach Dan at his blog (http://www.winsysblog.com/) or Twitter at @dan_franciscus.