「knifeec2servercreate」を使用してAmazonEC2インスタンスを作成しようとしていますが、JSONを渡して、-jオプションを使用してデフォルト設定をオーバーライドします。$ jsonは適切に形成されたJSONテキストであり、変数を引用すると同じエラーが発生しますか否か:
PS C:\Users\chef> knife ec2 server create --region ... -j $json
このエラーで失敗します:
C:/opscode/chefdk/embedded/lib/Ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `initialize': A JSON text must
at least contain two octets! (JSON::ParserError)
from C:/opscode/chefdk/embedded/lib/Ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `new'
from C:/opscode/chefdk/embedded/lib/Ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse'
from C:/Users/chef/AppData/Local/chefdk/gem/Ruby/2.1.0/gems/knife-ec2-0.12.0/lib/chef/knife/ec2_server_create.rb
:218:in `block in <class:Ec2ServerCreate>'
JSONをコマンドラインに配置しようとすると、別のエラーが発生します。
C:/opscode/chefdk/embedded/lib/Ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse': 757: unexpected token
at '{fusion_**** : *** }' (JSON::ParserError)
from C:/opscode/chefdk/embedded/lib/Ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse'
from C:/Users/chef/AppData/Local/chefdk/gem/Ruby/2.1.0/gems/knife-ec2-0.12.0/lib/chef/knife/ec2_server_create.rb
:218:in `block in <class:Ec2ServerCreate>'
from C:/opscode/chefdk/embedded/lib/Ruby/gems/2.1.0/gems/mixlib-cli-1.5.0/lib/mixlib/cli.rb:235:in `call'
ナイフとPowerShellに関する既知の問題を見つけることができず、「{}」の最小JSONで機能しますが、他のものでは機能しないようです。
誰かがこれを自分で働いていますか?
両方のエラーメッセージが引用符がないことを示しているため、シェルが引用符を食べている可能性があります。
{fusion_**** : *** }
は有効なJSONではないため、キーと値の両方を引用符で囲んだ{"fusion_****" : "***"}
である必要があります(値が文字列であると仮定します。リテラルはtrue
、false
、およびnull
...および数値はもちろん引用符で囲まれていません)。
このように設定する必要があると思います...
$json = '{"fusion_****" : "***"}'
...一重引用符により二重引用符がリテラルとして解釈される場合。またはこれ:
...しかし、私は文字通りPowerShellについて何も知りません。一般的には、シェルだけです。変数を割り当てている場所にコードを投稿しても解決しない場合は、おそらく役立つでしょう。
私が見つけたのは、Rubyのバックスラッシュを使用してJSONの引用符をエスケープする必要があるということでした。
PowerShell文字列で置換を使用したため、PowerShellの場合は文字列内の引用符もaccent Graveでエスケープしました。
たとえば、これをJSONで取得するには:
{ "fusion": "****" }
powerShellは、一重引用符(置換なし)を使用して、次のようにコーディングできます。
$json = '{ \"fusion_****\" : \"***\" }'
または、このように、二重引用符を使用します(置換は有効ですが、この例では使用されていません)。
$json = "{ \`"fusion_****\`" : \`"***\`" }"