仕事で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.d
と d
まで書かないと有効な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拡張の入れ方については以下の記事を参考にしてください。
こちらの記事では以下のような記述があります。
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のファイルを編集する人の参考になれば幸いです。