[英]Editing JSON with PowerShell for Packer
我需要一些幫助或建議。
我正在嘗試構建一個 PowerShell 腳本來更新具有一些 JSON 值的模板打包程序文件,但我失敗了。
希望有人可以建議?
中間部分是模板 JSON,我試圖在其中插入 object。 它應該在“builders”數組中(?),但它最終被添加在“builders”之后......
如果需要,我會發布
最初在模板中的構建器.json:
"builders": [
{
"type": "vsphere-iso",
"vcenter_server": "{{user `vsphere-server`}}",
"insecure_connection": "true",
"username": "{{user `vsphere-user`}}",
"password": "{{user `vsphere-password`}}",
"cluster": "{{user `vsphere-cluster`}}",
"datacenter": "{{user `vsphere-datacenter`}}",
"folder": "{{user `vsphere-folder`}}",
"communicator": "winrm",
"winrm_username": "Administrator",
"winrm_password": "{{user `winadmin-password`}}",
"convert_to_template": "true",
"CPUs": "{{user `vm-cpu-num`}}",
"RAM": "{{user `vm-mem-size`}}",
"network": "{{user `vm-network`}}",
"network_card": "vmxnet3",
"datastore": "{{user `vsphere-datastore`}}",
"disk_controller_type": "pvscsi",
"guest_os_type": "windows9Server64Guest",
"disk_thin_provisioned": true,
"disk_size": "{{user `vm-disk-size`}}",
"floppy_img_path": "[BN001-Local-DataStore01] contentlib-a036a42c-4504-44db-9d1a-3e9550954bf7/2b074347-88e4-408e-b228-d890308fa96d/pvscsi_88204189-95a8-4dbc-8fdb-8b4249c07c6f.flp",
"floppy_files": [
"../tmp/"
]
}
]
PS代碼編輯這個:
$JSON = Get-Content -Path "$CurrentPath\template.json" -Raw | ConvertFrom-Json
$jsonContent = [PSCustomObject]@{
'vm_name' = $buildName
'iso_paths' = @($vm_tools_iso , $os_iso)
}
$JSON.builders += $jsonContent
$JSON | ConvertTo-Json -Depth 4 | Out-File $buildFile -Encoding Ascii -Force
預期結果
"builders": [
{
"type": "vsphere-iso",
"vcenter_server": "{{user `vsphere-server`}}",
"insecure_connection": "true",
"username": "{{user `vsphere-user`}}",
"password": "{{user `vsphere-password`}}",
"cluster": "{{user `vsphere-cluster`}}",
"datacenter": "{{user `vsphere-datacenter`}}",
"folder": "{{user `vsphere-folder`}}",
"communicator": "winrm",
"winrm_username": "Administrator",
"winrm_password": "{{user `winadmin-password`}}",
"convert_to_template": "true",
"CPUs": "{{user `vm-cpu-num`}}",
"RAM": "{{user `vm-mem-size`}}",
"network": "{{user `vm-network`}}",
"network_card": "vmxnet3",
"datastore": "{{user `vsphere-datastore`}}",
"disk_controller_type": "pvscsi",
"guest_os_type": "windows9Server64Guest",
"disk_thin_provisioned": true,
"disk_size": "{{user `vm-disk-size`}}",
"floppy_img_path": "[BN001-Local-DataStore01] contentlib-a036a42c-4504-44db-9d1a-3e9550954bf7/2b074347-88e4-408e-b228-d890308fa96d/pvscsi_88204189-95a8-4dbc-8fdb-8b4249c07c6f.flp",
"floppy_files": [
"../tmp/"
],
"vm_name": "server_2019_core",
"iso_paths": [
"[BN001-Local-DataStore01] contentlib-a036a42c-4504-44db-9d1a-3e9550954bf7/5bd0d88d-9817-4c54-ae04-95be5e9212b9/VMware-Tools-Windows-11_0_1-14773994_a816dc3a-6df1-42ff-9332-e7fcd8829d88.iso",
"[BN001-Local-DataStore01] contentlib-a036a42c-4504-44db-9d1a-3e9550954bf7/2baac3c5-97b0-439c-aece-3b053e82b149/SW_DVD9_Win_Server_STD_CORE_2019_1809.11_64Bit_English_DC_STD_MLF_X22-51041_6afb1d25-5be2-4774-b071-77c349beb238.ISO"
]
}
]
實際結果
"builders": [
{
"type": "vsphere-iso",
"vcenter_server": "{{user `vsphere-server`}}",
"insecure_connection": "true",
"username": "{{user `vsphere-user`}}",
"password": "{{user `vsphere-password`}}",
"cluster": "{{user `vsphere-cluster`}}",
"datacenter": "{{user `vsphere-datacenter`}}",
"folder": "{{user `vsphere-folder`}}",
"communicator": "winrm",
"winrm_username": "Administrator",
"winrm_password": "{{user `winadmin-password`}}",
"convert_to_template": "true",
"CPUs": "{{user `vm-cpu-num`}}",
"RAM": "{{user `vm-mem-size`}}",
"network": "{{user `vm-network`}}",
"network_card": "vmxnet3",
"datastore": "{{user `vsphere-datastore`}}",
"disk_controller_type": "pvscsi",
"guest_os_type": "windows9Server64Guest",
"disk_thin_provisioned": true,
"disk_size": "{{user `vm-disk-size`}}",
"floppy_img_path": "[BN001-Local-DataStore01] contentlib-a036a42c-4504-44db-9d1a-3e9550954bf7/2b074347-88e4-408e-b228-d890308fa96d/pvscsi_88204189-95a8-4dbc-8fdb-8b4249c07c6f.flp",
"floppy_files": [
"../tmp/"
]
},
{
"vm_name": "server_2019_core",
"iso_paths": [
"[BN001-Local-DataStore01] contentlib-a036a42c-4504-44db-9d1a-3e9550954bf7/5bd0d88d-9817-4c54-ae04-95be5e9212b9/VMware-Tools-Windows-11_0_1-14773994_a816dc3a-6df1-42ff-9332-e7fcd8829d88.iso",
"[BN001-Local-DataStore01] contentlib-a036a42c-4504-44db-9d1a-3e9550954bf7/2baac3c5-97b0-439c-aece-3b053e82b149/SW_DVD9_Win_Server_STD_CORE_2019_1809.11_64Bit_English_DC_STD_MLF_X22-51041_6afb1d25-5be2-4774-b071-77c349beb238.ISO"
]
}
]
從PowerShell 版本 6.0開始,使用ConvertFrom-Json
開關-AsHashTable
使任務變得稍微容易一些。 向下滾動以獲取 PS 5 解決方案。
這將輸出一個hashtable
而不是默認的PSCustomObject
。 哈希表的一個優點是可以直接修改它,只使用基本的 PowerShell 語法。
# Read the JSON file into a hashtable variable
$JSON = Get-Content -Path "$CurrentPath\template.json" -Raw | ConvertFrom-Json -AsHashTable
# Assign new properties to the first element of array <builders>
$JSON.builders[0].vm_name = $buildName
$JSON.builders[0].iso_paths = $vm_tools_iso, $os_iso
# Write the JSON to a file
$JSON | ConvertTo-Json -Depth 4 | Out-File $buildFile -Encoding Ascii -Force
ConvertTo-Json
知道如何處理哈希表,因此不需要特殊的開關。
請注意,新屬性可能出現在序列化 JSON object 內的任何 position 中,因為哈希表沒有定義的順序。 但這不是問題,因為 JSON object 中的屬性順序不相關。
PS 5的替代解決方案,使用Add-Member
:
# Read the JSON file into a PSCustomObject
$JSON = Get-Content -Path "$CurrentPath\template.json" -Raw | ConvertFrom-Json
# Assign new properties to the first element of array <builders>
$JSON.builders[0] | Add-Member @{
vm_name = $buildName
iso_paths = $vm_tools_iso, $os_iso
}
# Write the JSON to a file
$JSON | ConvertTo-Json -Depth 4 | Out-File $buildFile -Encoding Ascii -Force
在剛剛了解了Add-Member <Hashtable>
語法(它是Add-Member -NotePropertyMembers <Hashtable>
的縮寫形式)之后,我認為與 PS 6+ 解決方案相比,PS 5 變體並沒有那么糟糕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.