Puppet Enterprise 2017.2

Windowsモジュールパック

Puppet Forgeは、Puppetとコミュニティメンバーによるオンラインコミュニティで、さまざまなPuppetモジュールが提供されています。 Forgeを利用すると、Puppetをさらに容易に管理できるようになります。また、あらかじめ記述されたモジュールを使うことができるため、自分でモジュールを記述する時間を節約できます。 Forgeのモジュールは、コミュニティで評価済みであることに加えて、Puppetにより承認 (Puppet Approved)または、Puppetによりサポート (Puppet Supported)されています。 大きな違いは、ApprovedモジュールはPuppet Enterpriseサポートサービスには利用できませんが、テスト済みでスタイルや品質の基準に従っているという点です。

Windows Module Pack

Windowsモジュールパックには、よくある具体的なタスクの実行に役立つ複数のWindows対応モジュールが含まれています。 Forgeを検索すると、さらに多くのWindowsモジュールを見つけることができます。 このモジュールパック自体はサポートされていませんが、パックに含まれるPuppet提供モジュールは、それぞれ個別にPuppet Enterpriseでサポートされています。 それ以外のモジュールは、Puppetにより検証および承認されていますが、商用サポートの対象ではありません。

Windowsモジュールパックによって、以下のことが可能になります。

  • registryによってレジストリキーを読み取り、作成、記述する
  • powershellによってPuppet DSLでPowerShellと通信する
  • dscを使ってWindows PowerShell DSC(Desired State Configuration)リソースを管理する
  • 管理の一環として、rebootを使って必要に応じてWindowsをリブートする
  • aclを使って詳細なアクセスコントロール許可を適用する
  • クライアントノードwsus_clientのWindowsサーバーアップデートサービス設定を管理する
  • windowsfeatureでWindowsの機能をインストールまたは削除する
  • download_fileを使って管理に使用するファイルをダウンロードする
  • iisによってIISサイトとバーチャルアプリケーションを構築する
  • chocolateyでパッケージをインストールする
  • windows_envで環境変数を管理する

このガイドでは、ACLを使用した管理されたパーミッションの作成、registryを使用した管理されたレジストリキーと値の作成、chocolateyを使用した独自のパッケージのインストールと作成について説明します。

必要条件

Windowsモジュールパックをインストールして作業を開始する前に、Puppet Enterpriseをインストールする必要があります。

Windowsモジュールパックのインストール

このステップでは、モジュールパックをローカルにインストールする方法を説明しますが、Puppet master上にインストールし、pluginsync(プラグイン同期)によりすべてのノードに当該モジュールパックを適用することも可能です。

  1. Puppetのコマンドプロンプトを開きます。 コマンドラインインターフェイスを開いたことがない場合、 [Start Menu]で「Command Prompt Puppet」と入力し、[Start Command Prompt with Puppet]をクリックします。

  2. すでにインストール済みのモジュールをリスト表示するには、[Command Prompt]ウィンドウでpuppet module listと入力します。 使い始めたばかりの場合は、インストール済みモジュールが1つもないこともあります。

    puppet module list empty output

  3. 次に、puppetlabs/windowsモジュールパックをインストールするために、puppet module install puppetlabs/windowsと入力します。 インストール済みのものがすべて表示されるはずです。

    C:\>puppet module install puppetlabs/windows
    Notice: Preparing to install into
    C:/ProgramData/PuppetLabs/code/environments/production/modules ...
    Notice: Downloading from https://forgeapi.puppetlabs.com ...
    Notice: Installing -- do not interrupt ...
    C:/ProgramData/PuppetLabs/code/environments/production/modules
    └─┬ puppetlabs-windows (v2.1.0)
    ├─┬ chocolatey-chocolatey (v1.2.0)
    │ └── badgerious-windows_env (v2.2.2)
    ├── puppet-download_file (v1.2.1)
    ├── puppet-iis (v1.4.1)
    ├── puppet-windowsfeature (v1.1.0)
    ├── puppetlabs-acl (v1.1.1)
    ├── puppetlabs-powershell (v1.0.5)
    ├── puppetlabs-reboot (v1.2.0)
    ├─┬ puppetlabs-registry (v1.1.2)
    │ └── puppetlabs-stdlib (v4.9.0)
    └── puppetlabs-wsus_client (v1.0.0)
    

タスク1:aclによるパーミッション管理

Forge puppetlabs-acl

puppetlabs-aclモジュールは、Windowsファイルシステムのパーミッション設定に関するアクセスコントロールリスト(ACL)の管理に役立ちます。 このモジュールを使うと、アクセスマスク、インヘリタンス、プロパゲーションといった方法で、SID(Security Identifier)を使って基本的なパーミッションからきわめて高度なパーミッションまで設定することができます。 まずは、既存のパーミッションを調べるところから始めます。

はじめに

ACLはカスタムのタイプおよび プロバイダです。そのため、puppet resourceを使って、既存のファイルとフォルダのパーミッションを調べることができます。 一部のタイプについては、puppet resource <TYPE NAME>コマンドを使って、そのタイプのすべてのインスタンスを調べることができます。 しかし、1つのWindowsシステム上には、何千ものACLが存在することもあります。そのため、タイプを調べる対象フォルダを指定するのが最善の策となります。 ここでは、c:\Usersをチェックして、そこに含まれるパーミッションを確認します。

コマンドプロンプトでpuppet resource acl c:\Usersと入力します。

puppet resource acl c:\users output

アウトプットを少し整理すると以下のようになります。

acl { 'c:\Users':
  inherit_parent_permissions => 'false',
  permissions                => [
   {identity => 'SYSTEM', rights=> ['full']},
   {identity => 'Administrators', rights => ['full']},
   {identity => 'Users', rights => ['read', 'execute'], affects => 'self_only'},
   {identity => 'Users', rights => ['read', 'execute'], affects => 'children_only'},
   {identity => 'Everyone', rights => ['read', 'execute'], affects => 'self_only'},
   {identity => 'Everyone', rights => ['read', 'execute'], affects => 'children_only'}
  ],
}

この特定のフォルダは、親フォルダからパーミッションを継承していません。その代わりに、独自のパーミッションを設定し、子ファイルと子フォルダがここで設定されたパーミッションをどのように継承するかを決定しています。

  • {'identity' => 'SYSTEM', 'rights'=> ['full']}は、「SYSTEM」ユーザにこのフォルダのフルアクセス権があることを記述するものです。デフォルトでは、すべての子/孫ファイルとフォルダのフルアクセス権も有します(これらは、Windowsでパーミッションを作成する際に同じデフォルトが設定されるため)。
  • {'identity' => 'Users', 'rights' => ['read', 'execute'], 'affects' => 'self_only'}は、現在のディレクトリでのみ、User(ユーザ)に読み取りおよび実行のパーミッションを与えます。
  • {'identity' => 'Everyone', 'rights' => ['read', 'execute'], 'affects' => 'children_only'}は、サブフォルダおよびファイルでのみ、Everyone(すべての人)に読み取りおよび実行のパーミッションを与えます。

注意:1つのユーザ/グループに対して、同じパーミッションが2回与えられているように見えるかもしれませんが(上述の「Users」と「Everyone」)、一方はそのフォルダ自体にのみ影響するもので、他方は子フォルダのみに関するものです。 この2つは実際には異なるパーミッションです。

Puppetで管理されたパーミッションの作成

  1. 以下のコードを実行し、Puppetで管理された最初のパーミッションを作成します。 その後、perms.ppとして保存します。

    file{'c:/tempperms':
     ensure => directory,
    }
    
    # By default, the acl will create an implicit relationship to any
    # file resources it finds that match the location.
    acl {'c:/tempperms':
     permissions => [
       {identity => 'Administrators', rights => ['full']},
       {identity => 'Users', rights => ['read','execute']}
     ],
    }
    

    perms.pp file

  2. マニフェストを検証するために、コマンドプロンプトでpuppet parser validate c:\path\to\perms.ppと入力します。 パーサーが何も返さなければ、検証に合格したことになります。

    puppet parser validate no issues

  3. マニフェストを適用するには、puppet apply c:\path\to\perms.ppと入力します。 おおむね以下のようなアウトプットになるはずです。

    Notice: Compiled catalog for win2012r2x64 in environment production in 0.12 seconds
    Notice: /Stage[main]/Main/File[c:/tempperms]/ensure: created
    Notice: /Stage[main]/Main/Acl[c:/tempperms]/permissions: permissions changed [
    ] to [
     { identity => 'BUILTIN\Administrators', rights => ["full"] },
     { identity => 'BUILTIN\Users', rights => ["read", "execute"] }
    ]
    Notice: Applied catalog in 0.05 seconds
    
  4. Windows UIでパーミッションを確認します。 [Windows Explorer]で[tempperms]を右クリックし、[Properties]をクリックします。 その後、[Security]タブをクリックします。おおむね以下のイメージのようになるはずです。

    Security properties of c:\tempperms

  5. オプション:この段階では、想定よりもパーミッションの範囲が多くなっている場合があります。 これは、Windowsではデフォルトで親のパーミッションが継承されるためです。 このケースでは継承しないことが望ましいため、 inherit_parent_permissions => falseを追加してperms.ppファイルを以下のように変更し、親のパーミッションを継承しないようにaclリソースを調整します。

    acl {'c:/tempperms':
      inherit_parent_permissions => false,
      permissions                => [
        {identity => 'Administrators', rights => ['full']},
        {identity => 'Users', rights => ['read','execute']}
      ],
    }
    
  6. ファイルを保存し、コマンドプロンプトに戻ってpuppet parser validate c:\path\to\perms.ppを再度実行します。

  7. 検証の際には、puppet apply c:\path\to\perms.ppを実行します。

    おおむね以下のようなアウトプットになるはずです。

    C:\>puppet apply c:\puppet_code\perms.pp
    Notice: Compiled catalog for win2012r2x64 in environment production in 0.08 seconds
    Notice: /Stage[main]/Main/Acl[c:/tempperms]/inherit_parent_permissions: inherit_
    parent_permissions changed 'true' to 'false'
    Notice: Applied catalog in 0.02 seconds
    
  8. パーミッションを再度チェックするには、icacls c:\temppermsと入力します。 icaclsは、ACLの表示と修正を指定するためのコマンドです。アウトプットはおおむね以下のようになるはずです。

    C:\>icacls c:\tempperms
    c:\tempperms BUILTIN\Administrators:(OI)(CI)(F)
                 BUILTIN\Users:(OI)(CI)(RX)
                 NT AUTHORITY\SYSTEM:(OI)(CI)(F)
                 BUILTIN\Users:(CI)(AD)
                 CREATOR OWNER:(OI)(CI)(IO)(F)
    Successfully processed 1 files; Failed processing 0 files
    

    アウトプットでは、各パーミッションが示され、それに続く括弧内に具体的な権限が表示されています。 このアウトプットからは、パーミッションがperms.ppで指定したものよりも多くなっていることがわかります。 Puppetでは、管理されていないパーミッションや既存のパーミッションと並行してパーミッションを管理することができます。 継承したパーミッションを削除する場合、デフォルトではWindowsが既存の継承パーミッション(またはAccess Control Entries、ACE)を既存のACLの上にコピーするため、望ましい範囲よりもパーミッションが多くなっていることがあります。

  9. 余分なパーミッションを削除し、指定したパーミッションのみがフォルダに残るようにします。 これを行うには、perms.ppで、以下のようにpurge => trueと設定します。

    acl {'c:/tempperms':
      inherit_parent_permissions => false,
      purge                      => true,
      permissions                => [
        {identity => 'Administrators', rights => ['full']},
        {identity => 'Users', rights => ['read','execute']}
      ],
    }
    
  10. 先ほどと同じようにパーサーコマンドを実行します。 エラーがなければ、変更を適用できます。

  11. 変更を適用するには、puppet apply c:\path\to\perms.ppと入力します。 アウトプットはおおむね以下のようになるはずです。

    C:\>puppet apply c:\puppet_code\perms.pp
    Notice: Compiled catalog for win2012r2x64 in environment production in 0.08 seco
    nds
    Notice: /Stage[main]/Main/Acl[c:/tempperms]/permissions: permissions changed [
    { identity => 'BUILTIN\Administrators', rights => ["full"] },
    { identity => 'BUILTIN\Users', rights => ["read", "execute"] },
    { identity => 'NT AUTHORITY\SYSTEM', rights => ["full"] },
    { identity => 'BUILTIN\Users', rights => ["mask_specific"], mask => '4', child_types => 'containers' },
    { identity => 'CREATOR OWNER', rights => ["full"], affects => 'children_only' }
    ] to [
    { identity => 'BUILTIN\Administrators', rights => ["full"] },
    { identity => 'BUILTIN\Users', rights => ["read", "execute"] }
    ]
    Notice: Applied catalog in 0.05 seconds
    

    各パーミッションを削除する際には、Puppetによりnotice(注意)が表示されます。

  12. もう一度icaclsのアウトプットを調べます。 icacls c:\temppermsと入力します。

    c:\>icacls c:\tempperms
    c:\tempperms BUILTIN\Administrators:(OI)(CI)(F)
                BUILTIN\Users:(OI)(CI)(RX)
    Successfully processed 1 files; Failed processing 0 files
    

    これで、このディレクトリのパーミッションが設定されました。 Puppet Forgeにあるこのモジュールの使用シナリオでは、さらに高度なパーミッションのシナリオを詳しく参照できます。 また、Puppetブログでは、ACLに関する詳細な記事を読むこともできます。

タスク2:registryを使用したPuppet管理レジストリキーの作成

Forge puppetlabs-registry

将来的に、可用性の高い設定を利用したり設定したりするなどの目的で、レジストリを使う必要性が生じる可能性もあります。 Puppet Supportedモジュールpuppetlabs-registryモジュールを使えば、レジストリのキーと値の両方を設定することができます。

はじめに

puppetlabs-registryはカスタムのタイプおよびプロバイダです。そのため、puppet resourceを使って、既存のレジストリ設定を調べることができます。 また、制限付きのモジュールであり、aclモジュールと同じように、指定した対象にのみ適用されます。 HKLM\Software\Microsoft\Windowsを指定して、どうなるか確認してみましょう。

puppet resource registry_key 'HKLM\Software\Microsoft\Windows'と入力します。

Output of puppet resource registry_key 'HKLM\Software\Microsoft\Windows'

それほど興味深い結果ではありません。次に、レジストリ値を見てみましょう。

puppet resource registry_value 'HKLM\SYSTEM\CurrentControlSet\Services\BITS\DisplayName'と入力します。

registry_value { 'HKLM\SYSTEM\CurrentControlSet\Services\BITS\DisplayName':
  ensure => 'present',
  data   => ['Background Intelligent Transfer Service'],
  type   => 'string',
}

こちらは、レジストリキーよりはやや興味深い結果です。 キーはファイルパス(ディレクトリ)のようなものです。一方、値はファイルのようなもので、データを有し、さまざまなタイプになりえます。

演習

  1. Puppetで管理されたレジストリキーおよび値を作成します。

    registry_key { 'HKLM\Software\zTemporaryPuppet':
         ensure => present,
    }
    
    # By default the registry creates an implicit relationship to any file
    # resources it finds that match the location.
    registry_value {'HKLM\Software\zTemporaryPuppet\StringValue':
      ensure => 'present',
      data   => 'This is a custom value.',
      type   => 'string',
    }
    
    #forcing a 32-bit registry view; watch where this is created:
    registry_key { '32:HKLM\Software\zTemporaryPuppet':
      ensure => present,
    }
    
    registry_value {'32:HKLM\Software\zTemporaryPuppet\StringValue':
      ensure => 'present',
      data   => 'This is a custom 32-bit value.',
      type   => 'expand',
    }
    
  2. ファイルをregistry.ppとして保存します。

  3. マニフェストを検証します。 コマンドプロンプトでpuppet parser validate c:\path\to\registry.ppと入力します。 パーサーが何も返さなければ、検証に合格したことになります。

  4. 次に、puppet apply c:\path\to\registry.ppと入力して、マニフェストを適用します。 アウトプットはおおむね以下のようになるはずです。

    Notice: Compiled catalog for win2012r2x64 in environment production in 0.11 seco
    nds
    Notice: /Stage[main]/Main/Registry_key[HKLM\Software\zTemporaryPuppet]/ensure: c
    reated
    Notice: /Stage[main]/Main/Registry_value[HKLM\Software\zTemporaryPuppet\StringVa
    lue]/ensure: created
    Notice: /Stage[main]/Main/Registry_key[32:HKLM\Software\zTemporaryPuppet]/ensure
    : created
    Notice: /Stage[main]/Main/Registry_value[32:HKLM\Software\zTemporaryPuppet\Strin
    gValue]/ensure: created
    Notice: Applied catalog in 0.03 seconds
    
  5. 次にレジストリを調べ、結果を確認します。 [Start + R]を押し、regeditと入力して[Enter]を押します。 レジストリエディタが開いたら、HKEY_LOCAL_MACHINEでキーを探します。

    Registry Editor display of keys

    ソフトウェアのWow6432Nodeの32ビットセクションに、32ビットキーが作成されたことがわかります。

  6. puppet apply c:\path\to\registry.ppと入力し、マニフェストを再度適用します。

    Notice: Compiled catalog for win2012r2x64 in environment production in 0.11 seconds
    Notice: Applied catalog in 0.02 seconds
    
  7. 何も変更していないため、Puppetでは何も実行されません。 レジストリエディタでデータを変更します。 HKLM\Sofware\zTemporaryPuppetを選択し、右のボックスの[StringValue]をダブルクリックします。 値のデータを編集し、[OK]をクリックします。

    Edit StringValue of HKLM\Sofware\zTemporaryPuppet

    今回は変更が加えられました。したがって、puppet apply c:\path\to\registry.ppと入力すると、アウトプットは異なるものになります。

    Notice: Compiled catalog for win2012r2x64 in environment production
    in 0.11 seconds
    Notice: /Stage[main]/Main/Registry_value[HKLM\Software\zTemporaryPuppet\StringValue]/data:
    data changed 'This is a custom value. Edited' to 'This is a custom value.'
    Notice: Applied catalog in 0.03 seconds
    

    Puppetが自動的に設定のずれを修正します。

  8. 次に、キーと値をクリーンアップおよび削除します。 registry.ppファイルを以下のようにします。

    registry_key { 'HKLM\Software\zTemporaryPuppet':
      ensure => absent,
    }
    
    #forcing a 32 bit registry view, watch where this is created
    registry_key { '32:HKLM\Software\zTemporaryPuppet':
      ensure => absent,
    }
    
  9. puppet parser validate c:\path\to\registry.ppで検証し、puppet apply c:\path\to\registry.ppで再度適用します。

    Notice: Compiled catalog for win2012r2x64 in environment production in 0.06 seconds
    Notice: /Stage[main]/Main/Registry_key[HKLM\Software\zTemporaryPuppet]/ensure: removed
    Notice: /Stage[main]/Main/Registry_key[32:HKLM\Software\zTemporaryPuppet]/ensure
    : removed
    Notice: Applied catalog in 0.02 seconds
    

    レジストリエディタの画面を更新します。 該当する値が消えているはずです。

    Removed items verification in Registry Editor

実際の使用例

ここでは、エラーレポート作成を無効にする実際の使用例を紹介します。

class puppetconf::disable_error_reporting {
  registry_value { 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\ForceQueue':
    type => dword,
    data => '1',
  }

  registry_value { 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\DontShowUI':
    type => dword,
    data => '1',
  }

  registry_value { 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\DontSendAdditionalData':
    type => dword,
    data => '1',
  }

  registry_key { 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\Consent':
    ensure       => present,
  }

  registry_value { 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\Consent\DefaultConsent':
   type => dword,
   data => '2',
  }
}

レジストリモジュールに関する詳細

レジストリモジュールの再導入に関するブログ記事、「Puppet works on Windows?」の記事を参照してください。Josh CooperによるPuppetConf 2014の「Getting Started with Puppet on Windows」プレゼンテーション、およびEthan BrownによるPuppetConf 2014の「Workshop: Puppet for Windows Users」も参照してください。 また、Forgeのこのモジュールに関する文書では、リファレンスと例を紹介しています。

タスク3:chocolateyを使用したパッケージの作成、インストール、再パッケージ

Forge chocolatey-chocolatey

ChocolateyはWindows用のパッケージマネージャで、設計や実行という面ではWindows以外のシステムのパッケージマネージャと同様です。 chocolateyモジュールPuppet Approvedモジュールであるため、Puppet Enterpriseのサポートサービスの対象ではありません。 このモジュールを使うと、Chocolateyそのものをインストール・設定し、Chocolateyパッケージを使ってWindow上でソフトウェアを管理することができます。

はじめに

Chocolateyは、パッケージリソースタイプのカスタムプロバイダです。そのため、 puppet resourceを使って既存のパッケージを表示することができます。

puppet resource package --param provider | moreと入力します。 このコマンドに追加されているプロバイダパラメータは、複数のプロバイダにより検出されたあらゆるタイプのインストール済みパッケージをアウトプットするものです。

Chocolateyのインストール

Chocolatey(choco.exe)をインストールします。 Chocolateyのホームページの指示に従い、インストールします。またはこのモジュールを使ってChocolateyがインストールされていることを確認できます。

  1. chocolateyモジュールで、 chocolatey.ppという新しいマニフェストを作成し、以下のようなコンテンツにします。

    include chocolatey
    
  2. コマンドプロンプトでpuppet parser validate c:\path\to\chocolatey.ppと入力し、マニフェストを検証します。 パーサーが何も返さなければ、検証に合格したことになります。

  3. 次に、puppet apply c:\path\to\chocolatey.ppによりマニフェストを適用します。アウトプットはおおむね以下のようになるはずです。

    Notice: Compiled catalog for win2012r2x64 in environment production in 0.58 seconds
    Notice: /Stage[main]/Chocolatey::Install/Windows_env[chocolatey_PATH_env]/ensure
    : created
    Notice: /Stage[main]/Chocolatey::Install/Windows_env[chocolatey_ChocolateyInstal
    l_env]/ensure: created
    Notice: /Stage[main]/Chocolatey::Install/Exec[install_chocolatey_official]/retur
    ns: executed successfully
    Notice: /Stage[main]/Chocolatey::Install/Exec[install_chocolatey_official]: Trig
    gered 'refresh' from 2 events
    Notice: Finished catalog run in 13.22 seconds
    

    商用ノードシナリオでは、Chocolatey.nupkgファイルが内部のどこかに存在する可能性もあります。 その場合、内部にあるChocolateyのインストール用のnupkgを使用できます。

    class {'chocolatey':
      chocolatey_download_url => 'https://internalurl/to/chocolatey.nupkg',
      use_7zip                => false,
      log_output              => true,
    }
    

パッケージのインストール

通常、パッケージをインストールするには、まずローカルでパッケージをコピーし、ダウンロードしたすべてのものを内部のロケーションに導入するために必要な変更を実行し、編集を加えてパッケージを再パッケージし、独自のパッケージを構築して内部のパッケージリポジトリ(フィード)でホストします。 しかし、この演習では、ChocolateyのコミュニティフィードからポータブルNotepad++を直接インストールします。 Notepad++ Commandlineパッケージはポータブルパッケージで、既存のシステムに大きな影響を与えることはないはずです。

  1. マニフェスト(chocolatey.pp)を以下のコンテンツで更新します。

    package {'notepadplusplus.commandline':
      ensure   => installed,
      provider => chocolatey,
    }
    
  2. コマンドプロンプトでpuppet parser validate c:\path\to\chocolatey.ppと入力し、マニフェストを検証します。 パーサーが何も返さなければ、検証に合格したことになります。

  3. 次に、puppet apply c:\path\to\chocolatey.ppによりマニフェストを適用します。アウトプットはおおむね以下のようになるはずです。

    Notice: Compiled catalog for win2012r2x64 in environment production in 0.75 seconds
    Notice: /Stage[main]/Main/Package[notepadplusplus.commandline]/ensure: created
    Notice: Applied catalog in 15.51 seconds
    

    商用ノードシナリオでこのパッケージを使用するには、内部のカスタムフィードが必要です。 これはchocolatey_serverモジュールを使って簡単に設定できます。 また、Windows以外のオプションでパッケージをホストする場合は、Sonatype Nexus、Artifactory、CIFSシェアも使用可能です。または、Windows上でNuGet ODataフィードを公開するものなら何でも使用できます(NugetはChocolateyが使用するパッケージインフラです)。 詳細については、chocolatey wikiのHow To Host Feedページを参照してください。 また、Puppet master上にパッケージを保存し、ファイルリソースを使って特定のローカルディレクトリに存在することを確認してから、パッケージを確定することもできます。

既存のパッケージをコピーして内部化する (パッケージの再パッケージ)

Chocolateyのコミュニティフィードにはかなりの数のパッケージがありますが、これらはコミュニティに合わせて調整されており、公式配信サイトからのダウンロードにはインターネットが使われます。 とはいえ、これらのパッケージは、ソフトウェアをマシン上にインストールするために必要なあらゆるものが備わった魅力的なパッケージでもあります。 再パッケージプロセスにより、コミュニティパッケージの内容を内部化したり、パッケージに埋め込んだりしてパッケージを完全に内部化し、内部Chocolatey/NuGetリポジトリ上でホストすることが可能です。これにより、パッケージを完全にコントロールし、前述した商用ノードの信頼性および制御上の問題を回避することができます。

既存のパッケージをローカルに適用するには、以下の手順を実施します。

  1. パッケージページでダウンロードリンクをクリックし、Chocolateyのコミュニティフィードからパッケージをダウンロードします。

    Download Link

  2. ダウンロードしたファイルの名前を変更して末尾に.zipを付け、通常のアーカイブとしてファイルを展開します。

    Rename to append .zip suffix

  3. _relsフォルダとpackageフォルダ、[Content_Types].xmlファイルを削除します。 これらはchoco packの際に再度作成されるため (また、存在すると問題が生じるため)、 含める必要はありません。

    Remove _rels, package, and the xml file

  4. 次に、tools\chocolateyInstall.ps1を開きます。

    Install-ChocolateyZipPackage 'notepadplusplus.commandline' 'https://notepad-plus-plus.org/repository/6.x/6.8.7/npp.6.8.7.bin.zip' "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
    
  5. zipファイルをダウンロードし、パッケージのツールフォルダに保存します。

    Zip file embedding in package

  6. 次に、chocolateyInstall.ps1を編集し、インターネットに接続する代わりにこの埋め込みファイルを指定するようにします(ファイルサイズが50MBを超える場合は、パフォーマンスを向上させるため共有環境にファイルを置いておくこともできます)。

    $toolsDir   = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
    Install-ChocolateyZipPackage 'notepadplusplus.commandline' "$toolsDir\npp.6.8.7.bin.zip" "$toolsDir"
    

    ダブルクォーテーションを使うと、文字列を補間できます (つまり、変数を文字どおり受けとるのではなく、解釈して受けとります)。

  7. 次に、*.nuspecファイルを開いて内容を確認し、必要があれば変更します。

    <?xml version="1.0"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
      <metadata>
        <id>notepadplusplus.commandline</id>
        <version>6.8.7</version>
        <title>Notepad++ (Portable, CommandLine)</title>
        <authors>Don Ho</authors>
        <owners>Rob Reynolds</owners>
        <projectUrl>https://notepad-plus-plus.org/</projectUrl>
        <iconUrl>https://cdn.rawgit.com/ferventcoder/chocolatey-packages/02c21bebe5abb495a56747cbb9b4b5415c933fc0/icons/notepadplusplus.png</iconUrl>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Notepad++ is a ... </description>
        <summary>Notepad++ is a free (as in "free speech" and also as in "free beer") source code editor and Notepad replacement that supports several languages. </summary>
        <tags>notepad notepadplusplus notepad-plus-plus</tags>
      </metadata>
    </package>
    

    組織によっては、内部パッケージが編集済みであることを示すためにバージョンフィールドを変更することもあります。その場合はたとえば、6.8.76.8.7.20151202のように変更します。 今回はこの必要はありません。

    これで、コマンドラインから.nuspecファイルを含むフォルダにアクセスし(Windowsマシンで。ただし、Monoをインストールし、ソースからchoco.exeを構築している場合は除く )、choco packを使用できるようになりました。 さらに具体的に、choco pack path\to\notepadplusplus.commandline.nuspecと入力することもできます。 アウトプットはおおむね以下のようになるはずです。

    Attempting to build package from 'notepadplusplus.commandline.nuspec'.
    Successfully created package 'notepadplusplus.commandline.6.8.7.nupkg'
    

    通常は、パッケージ(*.nupkgのみ)を内部リポジトリに配備する前に、システムをテストして、構築したばかりのパッケージに問題がないかどうかを確認します。これを実施するには、テストシステムでchoco.exeを用いて、インストール(choco install notepadplusplus.commandline -source %cd% - PowerShell.exeでは%cd%$pwdに変更)とアンインストール (choco uninstall notepadplusplus.commandline)を実行してみます。 別の方法として、ローカルソースフォルダを指定するマニフェストを実行する方法もあります。ここではその方法でテストします。

  8. c:\packagesを作成し、先ほど構築したパッケージファイル (notepadplusplus.commandline.6.8.7.nupkg)をコピーします。

    package in folder

    先ほど同じバージョンをChocolateyのコミュニティフィードからインストールしているので、この手順では、実際にはシステムにインストールされません。 そのため、まず既存のパッケージを削除する必要があります。 削除するには、chocolatey.ppを編集し、パッケージをabsentに設定します。

    package {'notepadplusplus.commandline':
      ensure   => absent,
      provider => chocolatey,
    }
    
  9. puppet parser validate path\to\chocolatey.ppでマニフェストを検証します。 マニフェストを適用し、puppet apply c:\path\to\chocolatey.ppの変更を確定します。

    Notice: Compiled catalog for win2012r2x64 in environment production in 1.03 seconds
    Notice: /Stage[main]/Main/Package[notepadplusplus.commandline]/ensure: removed
    Notice: Applied catalog in 12.20 seconds
    

    パッケージのインストール場所をチェックするか、choco list -loを使ってパッケージが削除されたことを確認します。

    Package is uninstalled

  10. カスタムパッケージを使用するようにマニフェスト(chocolatey.pp)を更新します。

    package {'notepadplusplus.commandline':
      ensure   => latest,
     provider => chocolatey,
     source   => 'c:\packages',
    }
    
  11. パーサによりマニフェストを検証し、再度適用します。 Puppetのアウトプットで、新しいインストールが作成されていることがわかります。

    Notice: Compiled catalog for win2012r2x64 in environment production in 0.79 seconds
    Notice: /Stage[main]/Main/Package[notepadplusplus.commandline]/ensure: created
    Notice: Applied catalog in 14.78 seconds
    
  12. 先ほどのステップでパッケージに追加した*.zipファイルを調べると、カスタムパッケージがインストールされたかどうかを確認できます。 C:\ProgramData\chocolatey\lib\notepadplusplus.commandline\tools(Chocolatey用のデフォルトのインストール場所がある場合)に*.zipファイルがあるかどうかを確認します。

Package is installed

chocolateyInstall.ps1を開き、このファイルが変更されたカスタムファイルかどうかを確認して検証することもできます。

パッケージの作成

独自のパッケージの作成は、一部のシステム管理者にとっては、他のパッケージ作成と比べると驚くほど簡単です。

以降のパートでは、Chocolatey CLI(choco.exe)バージョン0.9.9.11以上が必要です。

  1. コマンドプロンプトでchoco new -hと入力し、ヘルプメニューで利用可能なオプションを確認します。

  2. 次に、choco new vagrantを使って、「vagrant」という名前のパッケージを作成します。 アウトプットはおおむね以下のようになるはずです。

    Creating a new package specification at C:\temppackages\vagrant
    Generating template to a file
     at 'C:\temppackages\vagrant\vagrant.nuspec'
    Generating template to a file
     at 'C:\temppackages\vagrant\tools\chocolateyinstall.ps1'
    Generating template to a file
     at 'C:\temppackages\vagrant\tools\chocolateyuninstall.ps1'
    Generating template to a file
     at 'C:\temppackages\vagrant\tools\ReadMe.md'
    Successfully generated vagrant package specification files
     at 'C:\temppackages\vagrant'
    

    一部のファイルには、記述可能なテンプレートがすでに用意されています(独自のカスタムテンプレートを作成し、後で使用することもできます)。

  3. vagrant.nuspecを開き、以下のように編集します。

    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
      <metadata>
        <id>vagrant</id>
        <title>Vagrant (Install)</title>
        <version>1.8.4</version>
        <authors>HashiCorp</authors>
        <owners>my company</owners>
        <description>Vagrant - Development environments made easy.</description>
      </metadata>
      <files>
        <file src="tools\**" target="tools" />
      </files>
    </package>
    

    全世界と共有するのでなければ、nuspecテンプレートファイル内にあるもののほとんどは必要ありません。そのため、上の例には必要な項目のみが含まれています。 重要な注意点として、パッケージの作成時には、nuspecファイルのパッケージのバージョンと、ベースとなるソフトウェアのバージョンをできるだけ一致させる必要があります。 ここで作成したパッケージには最新バージョンのVagrantをパッケージするため、nuspecファイルのパッケージのバージョンは一致するはずです。 この例では、Vagrant 1.8.4をパッケージします。 バージョンについて詳しくはこちらを確認してください

  4. chocolateyInstall.ps1を開き、以下のように編集します。

    $ErrorActionPreference = 'Stop';
    
    $packageName= 'vagrant'
    $toolsDir   = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
    $fileLocation = Join-Path $toolsDir 'vagrant_1.8.4.msi'
    
    $packageArgs = @{
      packageName   = $packageName
      fileType      = 'msi'
      file         = $fileLocation
    
      silentArgs    = "/qn /norestart"
      validExitCodes= @(0, 3010, 1641)
    }
    
    Install-ChocolateyInstallPackage @packageArgs
    

    注意:上の例はInstall-ChocolateyINSTALLPackageです。Install-ChocolateyPackageと混同しないでください。 名前はよく似ていますが、後者はURI(URL、ftp、ファイル)からもソフトウェアをダウンロードします。この例ではそれは必要ありません。

  5. ReadMe.mdファイルとchocolateyUninstall.ps1ファイルを削除します。 Vagrantをダウンロードし、パッケージのツールフォルダに移動します。

    注意:一般に、パッケージが100MBを超える場合は、ソフトウェアインストーラ/アーカイブを共有ドライブに移動し、代わりにそれを指定することが推奨されます。 この例では、そのままバンドルします。

  6. 次に、choco packを使ってパッケージ化します。 新しいvagrant.1.8.4.nupkgファイルをc:\packagesにコピーします。

  7. マニフェストを開き、作成したばかりの新しいパッケージを追加します。 chocolatey.ppファイルは以下のようになります。

    package {'vagrant':
      ensure   => installed,
      provider => chocolatey,
      source   => 'c:\packages',
    }
    
  8. ファイルを保存し、Puppetパーサで検証します。

  9. その後、puppet apply path\to\chocolatey.ppを使ってマニフェストを実行します。

    Notice: Compiled catalog for win2012r2x64 in environment production in 0.70 seconds
    Notice: /Stage[main]/Main/Package[vagrant]/ensure: created
    Notice: Applied catalog in 31.51 seconds
    
  10. コントロールパネルで[Programs and Features]を開き、確認します。Vagrantがインストールされています!

Vagrant is installed!</p> <p class=">

アンインストール

chocoのautoUninstaller機能が有効になっているかどうかを確認するには、choco featureを使って機能と現在の状況を表示します。 include chocolateyまたはclass chocolateyを使ってChocolateyをインストールしている場合は、設定は自動的に有効になっています(明示的に無効化した場合を除く)。 また、Chocolateyバージョン0.9.10からは、デフォルトで有効になります。

  1. autoUninstaller - [Disabled]と表示された場合は、有効にする必要があります。 有効にするには、コマンドプロンプトでchoco feature enable -n autoUninstallerと入力します。 以下のような成功のメッセージが表示されるはずです。

    Enabled autoUninstaller
    
  2. Vagrantを削除するには、chocolatey.ppマニフェストを編集し、ensure => absentとします。 その後、ファイルを保存して検証します。

    package {'vagrant':
      ensure   => absent,
      provider => chocolatey,
      source   => 'c:\packages',
    }
    
  3. 次に、puppet apply path\to\chocolatey.ppを実行してマニフェストを適用します。

    Notice: Compiled catalog for win2012r2x64 in environment production in 0.75 seconds
    Notice: /Stage[main]/Main/Package[vagrant]/ensure: removed
    Notice: Applied catalog in 40.85 seconds
    

    Vagrant is no longer installed

    これでアンインストールされました!

実際の使用例

以下の例では、Chocolatey、Chocolatey Simple Server(内部Chocolateyパッケージのリポジトリ)、いくつかのパッケージをインストールしています。 これには、chocolatey/chocolatey_serverモジュールが別途必要となります。

c:\packagesに、ChocolateyChocolatey.ServerRoundhousELaunchyGitのパッケージが存在する必要があります。それぞれのパッケージに従属するものがある場合は、それも必要です。

case $operatingsystem {
  'windows':    {
    Package {
      provider => chocolatey,
      source   => 'C:\packages',
    }
  }
}

# include chocolatey
class {'chocolatey':
  chocolatey_download_url => 'file:///C:/packages/chocolatey.0.9.9.11.nupkg',
  use_7zip                => false,
  log_output              => true,
}

# This contains the bits to install the custom server.
# include chocolatey_server
class {'chocolatey_server':
  server_package_source => 'C:/packages',
}

package {'roundhouse':
  ensure   => '0.8.5.0',
}


package {'launchy':
  ensure          => installed,
  install_options => ['-override', '-installArgs','"', '/VERYSILENT','/NORESTART','"'],
}

package {'git':
  ensure => latest,
}

Chocolateyの詳細

Chocolateyの詳細については、 Chocolatey.orgGitHubに関する文書を参照してください。また、Rob ReynoldsによるPuppetConf 2015の「Chocolatey and Puppet - Managing Your Windows Software Since 2011」も視聴できます。 Chocolateyが提供しているものと、利用可能なリファレンスの詳細については、Puppet Forgeのモジュールおよび文書を参照してください。

Back to top