プログラマ行進曲第二章

主にソフトウェア関連の技術をネタにした記事を執筆するためのブログ

PuppetのVSCode拡張の古いバージョンとPDKの古いバージョンを入れて組み合わせて使う方法

仕事でPuppetを使っていて、Puppetのファイルを編集するときのエディタをVSCodeにするときに色々詰まったことがあるので、それの振り返りをしたいと思います。

書きたいことはタイトルにも書いたとおり、PuppetのVSCode拡張とPuppet Development Kit(以下PDK)を使う時、それぞれ古いバージョンを入れて組み合わせるにはどうしたらいいかという話です。

何で古いバージョンでないと問題になるかというと、何も考えずにインストールするとVSCode拡張もPDKも最新のバージョンを入れることになり、Puppetのバージョンが最新になっていればいいのですが、そうでない場合はPuppetのVSCode拡張を使っているときに期待と違う動作をする恐れがあるからです。

どうやって古いバージョンを入れればいいかというと、以下の手順を踏むことで可能になります。

  • 使用しているPuppetのバージョンに対応しているPDKのバージョンをchangelogから探す
  • 対応したバージョンのPDKのダウンロードURLを指定してダウンロード、インストールする
  • インストールしたPDKに合うバージョンのPuppet用VSCode拡張をchangelogを参考にして入れて設定する
    • VSIXパッケージから拡張をインストールする
    • VSCodeの拡張の自動アップデートの設定は切っておく

以下、順を追って説明します。

使用しているPuppetのバージョンに対応しているPDKのバージョンをchangelogから探す

これはほぼそのままですが、PDKのchangelogから、自分が使いたいPuppetのバージョンに対応していると思われるPDKのバージョンを調べます。

サポートしているPuppetのバージョンが書いてあるとは限らないので、実際は次に説明する方法で古いバージョンのPDKをダウンロードしてから、使いたいPuppetのバージョンに対応しているか一つ一つ調べる必要があります。

対応したバージョンのPDKのダウンロードURLを指定してダウンロード、インストールする

PDKのダウンロードページを素直に見ると、最新版のバージョンしかダウンロードURLが書いてありません。

例えば、macOS(High Sierra)だと https://pm.puppet.com/cgi-bin/pdk_download.cgi?dist=osx&rel=10.13&arch=x86_64&ver=latest というURLしか書いてないです。

URL末尾を見るとversion指定と思われるクエリがあるので、「その値を指定のバージョンにすれば古いバージョンが取れるんだろ」と思われるでしょう。

それは間違いではないのですが、単純にPDKのchangelogに書いてあったバージョンを差し替えてもうまくダウンロードできません。

例えば、 https://pm.puppet.com/cgi-bin/pdk_download.cgi?dist=osx&rel=10.13&arch=x86_64&ver=1.7.1 とブラウザにいれても1.7.1のPDKはダウンロードできません。

ここが罠なのですが、バージョン番号の桁を a から順にアルファベットで表現した場合、 a.b.c ではなく a.b.c.dd まで書かないと有効なURLにならないのです。

macOS (High Sierra)のPDK 1.7.1を入れたい場合は https://pm.puppet.com/cgi-bin/pdk_download.cgi?dist=osx&rel=10.13&arch=x86_64&ver=1.7.1.0 としないといけません。

d にあたる数値が何の値なのかを知るにはChocolatey GalleryのPDKのダウンロードページの下部に書いてあるバージョンを見るといいと思います。

たまたまこのChocolateyのページに書いてあるバージョンと対応してそうだと気づいたからいいものの、そうでなかったらこのバージョン番号をどうやって知ればいいんでしょうね?

PDKをインストールした後の設定

macOSの場合、PDKをインストールしたらデフォルトの設定では /opt/puppetlabs/pdk にPDKのファイルが以下のように入ります。

$ ls -1 /opt/puppetlabs/pdk
PDK_VERSION
bin
include
lib
private
share
ssl

そして肝心のPuppetですが、どうやら /opt/puppetlabs/pdk/private/puppet/ruby/<version>/gems にあるようです。基本的に /opt/puppetlabs/pdk/private/puppet/ruby にある最新のバージョンのrubyが使われるようで、PDK 1.7.1.0だと最新は2.5.0のようです。

$ ls -1 /opt/puppetlabs/pdk/private/puppet/ruby
2.1.0
2.4.0
2.5.0
$ ls -1 /opt/puppetlabs/pdk/private/puppet/ruby/2.5.0/gems
facter-2.5.1
fast_gettext-1.1.2
hiera-3.4.5.13
hocon-1.2.5
httpclient-2.8.3
locale-2.1.2
multi_json-1.13.1
puppet-6.0.2
puppet-resource_api-1.6.0
semantic_puppet-1.0.2

上記のように、PDK 1.7.1.0だとpuppet-6.0.2が使われてしまうので、それを回避するためにsymlinkを設定して以下のようにすると、別のバージョンのrubyのgemにあるpuppetを使うようになり、Puppet 5をVSCode拡張で使用する下準備ができます。

$ ls -l /opt/puppetlabs/pdk/private/puppet/ruby
total 0
drwxr-xr-x  9 root  wheel  288 10  9 03:45 2.1.0
drwxr-xr-x  9 root  wheel  288  1 21 22:15 2.4.0
lrwxr-xr-x  1 root  wheel    5  1 21 22:15 2.5.0 -> 2.4.0
drwxr-xr-x  9 root  wheel  288 10  9 03:47 2.5.0.bak
$ ls -1 /opt/puppetlabs/pdk/private/puppet/ruby/2.4.0/gems
facter-2.5.1
fast_gettext-1.1.2
gettext-3.2.9
gettext-setup-0.30
hiera-3.4.5.13
locale-2.1.2
multi_json-1.13.1
puppet-5.0.1
puppet-5.1.0
puppet-5.2.0
puppet-5.3.7
puppet-5.4.0
puppet-5.5.6
text-1.3.1

少々面倒ですが、古いバージョンを使いたい場合はこういうワークアラウンドで一応使用可能みたいです。

インストールしたPDKに合うバージョンのPuppet用VSCode拡張をchangelogを参考にして入れて設定する

古いバージョンのVSCode拡張の入れ方については以下の記事を参考にしてください。

tpodolak.com

こちらの記事では以下のような記述があります。

In the next step we have to download proper extension’s version using vsassets api. The url pattern looks as follows https://${publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${publisher}/extension/${extension_name}/${version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage

In my case, the variables looks as follow

  • ${publisher} – ms-vscode
  • ${extension_name} – csharp
  • ${version} – 1.7.0 and entire url can be rewritten as

https://ms-vscode.gallery.vsassets.io/_apis/public/gallery/publisher/ms-vscode/extension/csharp/1.7.0/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage

ここに書いてある法則に則って、自分がダウンロードしたいバージョンのVSCode拡張のURLを調べれば良いわけです。

例としてPuppet用VSCode拡張の0.14.0を入れたい場合は、 https://jpogran.gallery.vsassets.io/_apis/public/gallery/publisher/jpogran/extension/puppet-vscode/0.14.0/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage をURLとしてブラウザに値を入れればダウンロードが始まります。

VSIXパッケージから拡張をインストールする

Once the file is downloaded, run VSCode, hit CTRL+SHIFT+P, type vsix in command line and choose

引用した上記記事にも書いてありますが、ダウンロードした Microsoft.VisualStudio.Services.VSIXPackage をVSCodeに入れるためには以下の作業をすればいいです。

  • VSCodeで CTRL+SHIFT+P を押して Extensions: Install from VSIX... を呼び出し、 Microsoft.VisualStudio.Services.VSIXPackage を選択する。
  • この時、選択できない状態だったら、ファイルの拡張子を .vsix に変更してもう一度選択できるか試す

これをやればインストール出来るはずです。

VSCodeの拡張の自動アップデートの設定は切っておく

重要な点としては、VSCodeの拡張の自動アップデートを切っておかないと、いつの間にか最新のPuppet用VSCode拡張を使ってしまうことになります。

VSCodeの設定の Extensions: Auto Update で検索して、該当の設定のチェックをオフにする必要があります。

あとはpuppet-vscodeの設定をgithubで書いてあるように設定すれば、基本的な機能は使えるようになっています。

私の場合は、puppet-vscodeの設定から Puppet: Install Type のセレクトボックスで pdk を選択すればいいだけでした。

私の場合、Hover Supportの機能を使おうとするとエラーが出て動かなくなりますが、それ以外の基本的な機能なら何となく使えるようでした。

誰かVSCodeでPuppetのファイルを編集する人の参考になれば幸いです。