knife-vsphere 3.0.1 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/chef/knife/base_vsphere_command.rb +35 -32
- data/lib/chef/knife/search_helper.rb +3 -3
- data/lib/chef/knife/vsphere_customization_list.rb +1 -1
- data/lib/chef/knife/vsphere_datastore_file.rb +12 -12
- data/lib/chef/knife/vsphere_datastore_list.rb +6 -6
- data/lib/chef/knife/vsphere_datastore_maxfree.rb +8 -8
- data/lib/chef/knife/vsphere_datastorecluster_list.rb +2 -1
- data/lib/chef/knife/vsphere_datastorecluster_maxfree.rb +4 -4
- data/lib/chef/knife/vsphere_folder_list.rb +1 -1
- data/lib/chef/knife/vsphere_hosts_list.rb +3 -3
- data/lib/chef/knife/vsphere_pool_list.rb +1 -1
- data/lib/chef/knife/vsphere_vlan_create.rb +2 -2
- data/lib/chef/knife/vsphere_vlan_list.rb +1 -1
- data/lib/chef/knife/vsphere_vm_cdrom.rb +18 -18
- data/lib/chef/knife/vsphere_vm_clone.rb +168 -333
- data/lib/chef/knife/vsphere_vm_delete.rb +7 -7
- data/lib/chef/knife/vsphere_vm_disk_extend.rb +4 -3
- data/lib/chef/knife/vsphere_vm_execute.rb +8 -8
- data/lib/chef/knife/vsphere_vm_find.rb +50 -49
- data/lib/chef/knife/vsphere_vm_list.rb +13 -12
- data/lib/chef/knife/vsphere_vm_migrate.rb +8 -8
- data/lib/chef/knife/vsphere_vm_move.rb +13 -13
- data/lib/chef/knife/vsphere_vm_net.rb +1 -1
- data/lib/chef/knife/vsphere_vm_network_add.rb +7 -8
- data/lib/chef/knife/vsphere_vm_network_delete.rb +1 -1
- data/lib/chef/knife/vsphere_vm_property_set.rb +3 -3
- data/lib/chef/knife/vsphere_vm_snapshot.rb +32 -30
- data/lib/chef/knife/vsphere_vm_state.rb +12 -12
- data/lib/chef/knife/vsphere_vm_toolsconfig.rb +3 -3
- data/lib/chef/knife/vsphere_vm_vmdk_add.rb +15 -13
- data/lib/chef/knife/vsphere_vm_vnc_set.rb +7 -7
- data/lib/chef/knife/vsphere_vm_wait_sysprep.rb +6 -6
- data/lib/knife-vsphere/version.rb +1 -1
- metadata +31 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8f368d4573e232a6f85d7b21aa08ebfe1402874def28c7ef02dbd424d2b925e
|
4
|
+
data.tar.gz: 6431989292639804374815f7b3b3f232e708901f8e51b02ac24c18d88edef8e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2bbd470a6557c299d64459d8d9d557280851bff0093d37c9dad63c30625b412ec3edc863c695860b84fafffebd9312711b343afa07d3dfdf735f3cbf4a36ef96
|
7
|
+
data.tar.gz: 51e6cdedd5efd0bdf9dcf74ffc8570e81beb69b3d3d7967ca31daa239626b1bf5b35681c423e53a2b96ade0e1ea0ba266340ca0f133f9a01520781168bacfae3
|
@@ -8,6 +8,7 @@ require "chef/knife"
|
|
8
8
|
require "rbvmomi"
|
9
9
|
require "base64"
|
10
10
|
require "filesize"
|
11
|
+
require "chef/knife/bootstrap"
|
11
12
|
|
12
13
|
# Power state on
|
13
14
|
PS_ON ||= "poweredOn".freeze
|
@@ -21,9 +22,8 @@ class Chef
|
|
21
22
|
# Base class for knife
|
22
23
|
class Knife
|
23
24
|
# Main knife vsphere that more or less everything in this gem is built off of
|
24
|
-
class BaseVsphereCommand < Knife
|
25
|
+
class BaseVsphereCommand < Chef::Knife::Bootstrap
|
25
26
|
deps do
|
26
|
-
require "chef/knife/bootstrap"
|
27
27
|
Chef::Knife::Bootstrap.load_deps
|
28
28
|
require "socket"
|
29
29
|
require "net/ssh/multi"
|
@@ -33,55 +33,55 @@ class Chef
|
|
33
33
|
|
34
34
|
def self.common_options
|
35
35
|
option :vsphere_user,
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
short: "-u USERNAME",
|
37
|
+
long: "--vsuser USERNAME",
|
38
|
+
description: "The username for vsphere"
|
39
39
|
|
40
40
|
option :vsphere_pass,
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
short: "-p PASSWORD",
|
42
|
+
long: "--vspass PASSWORD",
|
43
|
+
description: "The password for vsphere"
|
44
44
|
|
45
45
|
option :vsphere_host,
|
46
|
-
|
47
|
-
|
46
|
+
long: "--vshost HOST",
|
47
|
+
description: "The vsphere host"
|
48
48
|
|
49
49
|
option :vsphere_dc,
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
short: "-D DATACENTER",
|
51
|
+
long: "--vsdc DATACENTER",
|
52
|
+
description: "The Datacenter for vsphere"
|
53
53
|
|
54
54
|
option :vsphere_path,
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
long: "--vspath SOAP_PATH",
|
56
|
+
description: "The vsphere SOAP endpoint path",
|
57
|
+
default: "/sdk"
|
58
58
|
|
59
59
|
option :vsphere_port,
|
60
|
-
|
61
|
-
|
62
|
-
|
60
|
+
long: "--vsport PORT",
|
61
|
+
description: "The VI SDK port number to use",
|
62
|
+
default: "443"
|
63
63
|
|
64
64
|
option :vsphere_nossl,
|
65
|
-
|
66
|
-
|
65
|
+
long: "--vsnossl",
|
66
|
+
description: "Disable SSL connectivity"
|
67
67
|
|
68
68
|
option :vsphere_insecure,
|
69
|
-
|
70
|
-
|
69
|
+
long: "--vsinsecure",
|
70
|
+
description: "Disable SSL certificate verification"
|
71
71
|
|
72
72
|
option :folder,
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
73
|
+
short: "-f FOLDER",
|
74
|
+
long: "--folder FOLDER",
|
75
|
+
description: "The folder to get VMs from",
|
76
|
+
default: ""
|
77
77
|
|
78
78
|
option :proxy_host,
|
79
|
-
|
80
|
-
|
79
|
+
long: "--proxyhost PROXY_HOSTNAME",
|
80
|
+
description: "Proxy hostname"
|
81
81
|
|
82
82
|
option :proxy_port,
|
83
|
-
|
84
|
-
|
83
|
+
long: "--proxyport PROXY_PORT",
|
84
|
+
description: "Proxy port"
|
85
85
|
end
|
86
86
|
|
87
87
|
def get_config(key)
|
@@ -199,6 +199,7 @@ class Chef
|
|
199
199
|
if dvswitch && dvswitch != "auto"
|
200
200
|
return networks.find do |f|
|
201
201
|
next unless f.respond_to?(:config)
|
202
|
+
|
202
203
|
sw = f.config.distributedVirtualSwitch
|
203
204
|
sw.uuid == dvswitch || sw.name == dvswitch
|
204
205
|
end
|
@@ -226,6 +227,7 @@ class Chef
|
|
226
227
|
entity_array = poolName.split("/")
|
227
228
|
entity_array.each do |entityArrItem|
|
228
229
|
next if entityArrItem == ""
|
230
|
+
|
229
231
|
if base_entity.is_a? RbVmomi::VIM::Folder
|
230
232
|
base_entity = base_entity.childEntity.find { |f| f.name == entityArrItem } ||
|
231
233
|
abort("no such pool #{poolName} while looking for #{entityArrItem}")
|
@@ -251,13 +253,14 @@ class Chef
|
|
251
253
|
dstores.each do |store|
|
252
254
|
avail = number_to_human_size(store.summary[:freeSpace])
|
253
255
|
cap = number_to_human_size(store.summary[:capacity])
|
254
|
-
puts "#{ui.color(
|
256
|
+
puts "#{ui.color("Datastore", :cyan)}: #{store.name} (#{avail}(#{store.summary[:freeSpace]}) / #{cap})"
|
255
257
|
|
256
258
|
# vm's can span multiple datastores, so instead of grabbing the first one
|
257
259
|
# let's find the first datastore with the available space on a LUN the vm
|
258
260
|
# is already using, or use a specified LUN (if given)
|
259
261
|
|
260
262
|
next unless (store.summary[:freeSpace] - vmdk_size_b) > 0
|
263
|
+
|
261
264
|
# also let's not use more than 90% of total space to save room for snapshots.
|
262
265
|
cap_remains = 100 * ((store.summary[:freeSpace].to_f - vmdk_size_b.to_f) / store.summary[:capacity].to_f)
|
263
266
|
candidates.push(store) if cap_remains.to_i > 10
|
@@ -34,11 +34,11 @@ module SearchHelper
|
|
34
34
|
type: "ContainerView",
|
35
35
|
path: "view",
|
36
36
|
skip: false
|
37
|
-
)
|
38
|
-
]
|
37
|
+
),
|
38
|
+
],
|
39
39
|
],
|
40
40
|
propSet: [
|
41
|
-
{ type: opts[:type], pathSet: opts[:properties] }
|
41
|
+
{ type: opts[:type], pathSet: opts[:properties] },
|
42
42
|
]
|
43
43
|
)
|
44
44
|
pc.RetrieveProperties(specSet: [filter_spec])
|
@@ -21,7 +21,7 @@ class Chef::Knife::VsphereCustomizationList < Chef::Knife::BaseVsphereCommand
|
|
21
21
|
|
22
22
|
csm = vim.serviceContent.customizationSpecManager
|
23
23
|
csm.info.each do |c|
|
24
|
-
puts "#{ui.color(
|
24
|
+
puts "#{ui.color("Customization Name", :cyan)}: #{c.name}"
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -10,24 +10,24 @@ class Chef::Knife::VsphereDatastoreFile < Chef::Knife::BaseVsphereCommand
|
|
10
10
|
common_options
|
11
11
|
|
12
12
|
option :local_file,
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
long: "--local-file FILE",
|
14
|
+
short: "-f",
|
15
|
+
description: "Local file and path"
|
16
16
|
|
17
17
|
option :remote_file,
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
long: "--remote-file FILE",
|
19
|
+
short: "-r",
|
20
|
+
description: "Remote file and path"
|
21
21
|
|
22
22
|
option :upload,
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
long: "--upload-file",
|
24
|
+
short: "-u",
|
25
|
+
description: "Upload local file to remote"
|
26
26
|
|
27
27
|
option :download,
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
long: "--download-file",
|
29
|
+
short: "-D",
|
30
|
+
description: "Download remote file to local"
|
31
31
|
|
32
32
|
# Main run method for datastore_file
|
33
33
|
#
|
@@ -26,13 +26,13 @@ class Chef::Knife::VsphereDatastoreList < Chef::Knife::BaseVsphereCommand
|
|
26
26
|
common_options
|
27
27
|
|
28
28
|
option :list,
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
long: "--list",
|
30
|
+
short: "-L",
|
31
|
+
description: "Indicates whether to list VM's in datastore",
|
32
|
+
boolean: true
|
33
33
|
option :pool,
|
34
|
-
|
35
|
-
|
34
|
+
long: "--pool pool",
|
35
|
+
description: "Target pool"
|
36
36
|
|
37
37
|
# The main run method for datastore_list
|
38
38
|
#
|
@@ -24,18 +24,18 @@ class Chef::Knife::VsphereDatastoreMaxfree < Chef::Knife::BaseVsphereCommand
|
|
24
24
|
banner "knife vsphere datastore maxfree"
|
25
25
|
|
26
26
|
option :regex,
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
short: "-r REGEX",
|
28
|
+
long: "--regex REGEX",
|
29
|
+
description: "Regex to match the datastore name",
|
30
|
+
default: ""
|
31
31
|
|
32
32
|
option :vlan,
|
33
|
-
|
34
|
-
|
33
|
+
long: "--vlan VLAN",
|
34
|
+
description: "Require listed vlan available to datastore's parent"
|
35
35
|
|
36
36
|
option :pool,
|
37
|
-
|
38
|
-
|
37
|
+
long: "--pool pool",
|
38
|
+
description: "Pool or Cluster to search for datastores in"
|
39
39
|
|
40
40
|
common_options
|
41
41
|
|
@@ -45,9 +45,10 @@ end
|
|
45
45
|
def print_dsclusters_in_folder(folder)
|
46
46
|
folder.childEntity.each do |child|
|
47
47
|
next unless child.class.to_s == "StoragePod"
|
48
|
+
|
48
49
|
avail = number_to_human_size(child.summary[:freeSpace])
|
49
50
|
cap = number_to_human_size(child.summary[:capacity])
|
50
|
-
puts "#{ui.color(
|
51
|
+
puts "#{ui.color("DatastoreCluster", :cyan)}: #{child.name} (#{avail} / #{cap})"
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
@@ -48,10 +48,10 @@ class Chef::Knife::VsphereDatastoreclusterMaxfree < Chef::Knife::BaseVsphereComm
|
|
48
48
|
banner "knife vsphere datastorecluster maxfree"
|
49
49
|
|
50
50
|
option :regex,
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
short: "-r REGEX",
|
52
|
+
long: "--regex REGEX",
|
53
|
+
description: "Regex to match the datastore cluster name",
|
54
|
+
default: ""
|
55
55
|
common_options
|
56
56
|
|
57
57
|
def run
|
@@ -17,7 +17,7 @@ class Chef::Knife::VsphereFolderList < Chef::Knife::BaseVsphereCommand
|
|
17
17
|
# param [String] folder that you should go through
|
18
18
|
# param [String] indent_level for the output to indent
|
19
19
|
def traverse_folders(folder, indent_level)
|
20
|
-
puts "#{
|
20
|
+
puts "#{" " * indent_level} #{ui.color("Folder", :cyan)}: " + folder.name
|
21
21
|
|
22
22
|
folders = find_all_in_folder(folder, RbVmomi::VIM::Folder)
|
23
23
|
folders.each do |child|
|
@@ -10,9 +10,9 @@ class Chef::Knife::VsphereHostsList < Chef::Knife::BaseVsphereCommand
|
|
10
10
|
|
11
11
|
common_options
|
12
12
|
option :pool,
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
long: "--pool pool",
|
14
|
+
short: "-h",
|
15
|
+
description: "Target pool"
|
16
16
|
|
17
17
|
# The main run method for hosts_list
|
18
18
|
#
|
@@ -16,7 +16,7 @@ class Chef::Knife::VspherePoolList < Chef::Knife::BaseVsphereCommand
|
|
16
16
|
|
17
17
|
if folder.is_a? RbVmomi::VIM::ResourcePool
|
18
18
|
pools = folder.path[3..-1].reject { |p| p.last == "Resources" }
|
19
|
-
puts "#{ui.color(
|
19
|
+
puts "#{ui.color("Pool", :cyan)}: " + pools.map(&:last).join("/")
|
20
20
|
end
|
21
21
|
|
22
22
|
folders = find_all_in_folder(folder, RbVmomi::VIM::ManagedObject) || []
|
@@ -9,8 +9,8 @@ class Chef::Knife::VsphereVlanCreate < Chef::Knife::BaseVsphereCommand
|
|
9
9
|
common_options
|
10
10
|
|
11
11
|
option :switch,
|
12
|
-
|
13
|
-
|
12
|
+
long: "--switch DVSNAME",
|
13
|
+
description: "The DVSwitch that will hold this VLAN"
|
14
14
|
|
15
15
|
# The main run method for vlan_create
|
16
16
|
#
|
@@ -32,7 +32,7 @@ class Chef::Knife::VsphereVlanList < Chef::Knife::BaseVsphereCommand
|
|
32
32
|
vim_connection
|
33
33
|
dc = datacenter
|
34
34
|
dc.network.each do |network|
|
35
|
-
puts "#{ui.color(
|
35
|
+
puts "#{ui.color("VLAN", :cyan)}: #{network.name}"
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -15,36 +15,36 @@ class Chef::Knife::VsphereVmCdrom < Chef::Knife::BaseVsphereCommand
|
|
15
15
|
common_options
|
16
16
|
|
17
17
|
option :datastore,
|
18
|
-
|
19
|
-
|
18
|
+
long: "--datastore STORE",
|
19
|
+
description: "The datastore for an iso source"
|
20
20
|
|
21
21
|
option :iso,
|
22
|
-
|
23
|
-
|
22
|
+
long: "--iso ISO",
|
23
|
+
description: "The name and path of the ISO to attach"
|
24
24
|
|
25
25
|
option :attach,
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
short: "-a",
|
27
|
+
long: "--attach",
|
28
|
+
description: "Attach the virtual cdrom to the VM",
|
29
|
+
boolean: true
|
30
30
|
|
31
31
|
option :disconnect,
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
long: "--disconnect",
|
33
|
+
description: "Disconnect the virtual cdrom from the VM",
|
34
|
+
boolean: true
|
35
35
|
|
36
36
|
option :on_boot,
|
37
|
-
|
38
|
-
|
37
|
+
long: "--on_boot ONBOOT",
|
38
|
+
description: "False for Detached on boot or True for Attached on boot"
|
39
39
|
|
40
40
|
option :client_device,
|
41
|
-
|
42
|
-
|
41
|
+
long: "--client_device",
|
42
|
+
description: "Set the backing store to client-device"
|
43
43
|
|
44
44
|
option :recursive,
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
short: "-r",
|
46
|
+
long: "--recursive",
|
47
|
+
description: "Search all folders"
|
48
48
|
|
49
49
|
# The main run method for vm_cdrom
|
50
50
|
#
|
@@ -10,7 +10,6 @@ require "chef/knife"
|
|
10
10
|
require "chef/knife/base_vsphere_command"
|
11
11
|
require "chef/knife/customization_helper"
|
12
12
|
require "chef/knife/search_helper"
|
13
|
-
require "chef/knife/winrm_base"
|
14
13
|
require "ipaddr"
|
15
14
|
require "netaddr"
|
16
15
|
require "securerandom"
|
@@ -26,327 +25,226 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
26
25
|
# a linklayer origin is an actual nic
|
27
26
|
ORIGIN_IS_REAL_NIC ||= "linklayer".freeze
|
28
27
|
|
29
|
-
include Chef::Knife::WinrmBase
|
28
|
+
# include Chef::Knife::WinrmBase
|
30
29
|
include CustomizationHelper
|
31
30
|
include SearchHelper
|
32
31
|
deps do
|
33
32
|
require "chef/json_compat"
|
34
|
-
require "chef/knife/bootstrap"
|
35
33
|
Chef::Knife::Bootstrap.load_deps
|
36
34
|
end
|
37
35
|
|
38
36
|
common_options
|
39
37
|
|
40
38
|
option :dest_folder,
|
41
|
-
|
42
|
-
|
39
|
+
long: "--dest-folder FOLDER",
|
40
|
+
description: "The folder into which to put the cloned VM"
|
43
41
|
|
44
42
|
option :datastore,
|
45
|
-
|
46
|
-
|
43
|
+
long: "--datastore STORE",
|
44
|
+
description: "The datastore into which to put the cloned VM"
|
47
45
|
|
48
46
|
option :datastorecluster,
|
49
|
-
|
50
|
-
|
47
|
+
long: "--datastorecluster STORE",
|
48
|
+
description: "The datastorecluster into which to put the cloned VM"
|
51
49
|
|
52
50
|
option :host,
|
53
|
-
|
54
|
-
|
51
|
+
long: "--host HOST",
|
52
|
+
description: "The host into which to put the cloned VM"
|
55
53
|
|
56
54
|
option :resource_pool,
|
57
|
-
|
58
|
-
|
55
|
+
long: "--resource-pool POOL",
|
56
|
+
description: "The resource pool or cluster into which to put the cloned VM"
|
59
57
|
|
60
58
|
option :source_vm,
|
61
|
-
|
62
|
-
|
59
|
+
long: "--template TEMPLATE",
|
60
|
+
description: "The source VM / Template to clone from"
|
63
61
|
|
64
62
|
option :linked_clone,
|
65
|
-
|
66
|
-
|
67
|
-
|
63
|
+
long: "--linked-clone",
|
64
|
+
description: "Indicates whether to use linked clones.",
|
65
|
+
boolean: false
|
68
66
|
|
69
67
|
option :thin_provision,
|
70
|
-
|
71
|
-
|
72
|
-
|
68
|
+
long: "--thin-provision",
|
69
|
+
description: "Indicates whether disk should be thin provisioned.",
|
70
|
+
boolean: true
|
73
71
|
|
74
72
|
option :annotation,
|
75
|
-
|
76
|
-
|
73
|
+
long: "--annotation TEXT",
|
74
|
+
description: "Add TEXT in Notes field from annotation"
|
77
75
|
|
78
76
|
option :customization_spec,
|
79
|
-
|
80
|
-
|
77
|
+
long: "--cspec CUST_SPEC",
|
78
|
+
description: "The name of any customization specification to apply"
|
81
79
|
|
82
80
|
option :customization_plugin,
|
83
|
-
|
84
|
-
|
81
|
+
long: "--cplugin CUST_PLUGIN_PATH",
|
82
|
+
description: "Path to plugin that implements KnifeVspherePlugin.customize_clone_spec and/or KnifeVspherePlugin.reconfig_vm"
|
85
83
|
|
86
84
|
option :customization_plugin_data,
|
87
|
-
|
88
|
-
|
85
|
+
long: "--cplugin-data CUST_PLUGIN_DATA",
|
86
|
+
description: "String of data to pass to the plugin. Use any format you wish."
|
89
87
|
|
90
88
|
option :customization_vlan,
|
91
|
-
|
92
|
-
|
89
|
+
long: "--cvlan CUST_VLANS",
|
90
|
+
description: "Comma-delimited list of VLAN names for network adapters to join"
|
93
91
|
|
94
92
|
option :customization_sw_uuid,
|
95
|
-
|
96
|
-
|
93
|
+
long: "--sw-uuid SWITCH_UUIDS",
|
94
|
+
description: "Comma-delimited list of distributed virtual switch UUIDs for network adapter to connect, use 'auto' to automatically assign"
|
97
95
|
|
98
96
|
option :customization_macs,
|
99
|
-
|
100
|
-
|
101
|
-
|
97
|
+
long: "--cmacs CUST_MACS",
|
98
|
+
description: "Comma-delimited list of MAC addresses for network adapters",
|
99
|
+
default: AUTO_MAC
|
102
100
|
|
103
101
|
option :customization_ips,
|
104
|
-
|
105
|
-
|
106
|
-
|
102
|
+
long: "--cips CUST_IPS",
|
103
|
+
description: "Comma-delimited list of CIDR IPs for customization",
|
104
|
+
default: NO_IPS
|
107
105
|
|
108
106
|
option :customization_dns_ips,
|
109
|
-
|
110
|
-
|
107
|
+
long: "--cdnsips CUST_DNS_IPS",
|
108
|
+
description: "Comma-delimited list of DNS IP addresses"
|
111
109
|
|
112
110
|
option :customization_dns_suffixes,
|
113
|
-
|
114
|
-
|
111
|
+
long: "--cdnssuffix CUST_DNS_SUFFIXES",
|
112
|
+
description: "Comma-delimited list of DNS search suffixes"
|
115
113
|
|
116
114
|
option :customization_gw,
|
117
|
-
|
118
|
-
|
115
|
+
long: "--cgw CUST_GW",
|
116
|
+
description: "CIDR IP of gateway for customization"
|
119
117
|
|
120
118
|
option :customization_hostname,
|
121
|
-
|
122
|
-
|
119
|
+
long: "--chostname CUST_HOSTNAME",
|
120
|
+
description: "Unqualified hostname for customization"
|
123
121
|
|
124
122
|
option :customization_domain,
|
125
|
-
|
126
|
-
|
123
|
+
long: "--cdomain CUST_DOMAIN",
|
124
|
+
description: "Domain name for customization"
|
127
125
|
|
128
126
|
option :customization_tz,
|
129
|
-
|
130
|
-
|
127
|
+
long: "--ctz CUST_TIMEZONE",
|
128
|
+
description: "Timezone invalid 'Area/Location' format"
|
131
129
|
|
132
130
|
option :customization_cpucount,
|
133
|
-
|
134
|
-
|
131
|
+
long: "--ccpu CUST_CPU_COUNT",
|
132
|
+
description: "Number of CPUs"
|
135
133
|
|
136
134
|
option :customization_corespersocket,
|
137
|
-
|
138
|
-
|
135
|
+
long: "--ccorespersocket CUST_CPU_CORES_PER_SOCKET",
|
136
|
+
description: "Number of CPU Cores per Socket"
|
139
137
|
|
140
138
|
option :customization_memory,
|
141
|
-
|
142
|
-
|
139
|
+
long: "--cram CUST_MEMORY_GB",
|
140
|
+
description: "Gigabytes of RAM"
|
143
141
|
|
144
142
|
option :customization_memory_reservation,
|
145
|
-
|
146
|
-
|
143
|
+
long: "--cram_reservation CUST_MEMORY_RESERVATION_GB",
|
144
|
+
description: "Gigabytes of RAM"
|
147
145
|
|
148
146
|
option :power,
|
149
|
-
|
150
|
-
|
151
|
-
|
147
|
+
long: "--start",
|
148
|
+
description: "Indicates whether to start the VM after a successful clone",
|
149
|
+
boolean: false
|
152
150
|
|
153
151
|
option :bootstrap,
|
154
|
-
|
155
|
-
|
156
|
-
|
152
|
+
long: "--bootstrap",
|
153
|
+
description: "Indicates whether to bootstrap the VM",
|
154
|
+
boolean: false
|
157
155
|
|
158
156
|
option :environment,
|
159
|
-
|
160
|
-
|
157
|
+
long: "--environment ENVIRONMENT",
|
158
|
+
description: "Environment to add the node to for bootstrapping"
|
161
159
|
|
162
160
|
option :fqdn,
|
163
|
-
|
164
|
-
|
161
|
+
long: "--fqdn SERVER_FQDN",
|
162
|
+
description: "Fully qualified hostname for bootstrapping"
|
165
163
|
|
166
164
|
option :bootstrap_msi_url,
|
167
|
-
|
168
|
-
|
165
|
+
long: "--bootstrap-msi-url URL",
|
166
|
+
description: "Location of the Chef Client MSI. The default templates will prefer to download from this location."
|
169
167
|
|
170
168
|
option :bootstrap_protocol,
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
option :ssh_user,
|
177
|
-
short: "-x USERNAME",
|
178
|
-
long: "--ssh-user USERNAME",
|
179
|
-
description: "The ssh username",
|
180
|
-
default: "root"
|
181
|
-
|
182
|
-
option :ssh_password,
|
183
|
-
short: "-P PASSWORD",
|
184
|
-
long: "--ssh-password PASSWORD",
|
185
|
-
description: "The ssh password"
|
186
|
-
|
187
|
-
option :ssh_port,
|
188
|
-
short: "-p PORT",
|
189
|
-
long: "--ssh-port PORT",
|
190
|
-
description: "The ssh port",
|
191
|
-
default: "22"
|
192
|
-
|
193
|
-
option :identity_file,
|
194
|
-
short: "-i IDENTITY_FILE",
|
195
|
-
long: "--identity-file IDENTITY_FILE",
|
196
|
-
description: "The SSH identity file used for authentication"
|
197
|
-
|
198
|
-
option :chef_node_name,
|
199
|
-
short: "-N NAME",
|
200
|
-
long: "--node-name NAME",
|
201
|
-
description: "The Chef node name for your new node"
|
202
|
-
|
203
|
-
option :prerelease,
|
204
|
-
long: "--prerelease",
|
205
|
-
description: "Install the pre-release chef gems",
|
206
|
-
boolean: false
|
207
|
-
|
208
|
-
option :bootstrap_version,
|
209
|
-
long: "--bootstrap-version VERSION",
|
210
|
-
description: "The version of Chef to install",
|
211
|
-
proc: proc { |v| Chef::Config[:knife][:bootstrap_version] = v }
|
212
|
-
|
213
|
-
option :bootstrap_proxy,
|
214
|
-
long: "--bootstrap-proxy PROXY_URL",
|
215
|
-
description: "The proxy server for the node being bootstrapped",
|
216
|
-
proc: proc { |p| Chef::Config[:knife][:bootstrap_proxy] = p }
|
217
|
-
|
218
|
-
option :bootstrap_vault_file,
|
219
|
-
long: "--bootstrap-vault-file VAULT_FILE",
|
220
|
-
description: "A JSON file with a list of vault(s) and item(s) to be updated"
|
221
|
-
|
222
|
-
option :bootstrap_vault_json,
|
223
|
-
long: "--bootstrap-vault-json VAULT_JSON",
|
224
|
-
description: "A JSON string with the vault(s) and item(s) to be updated"
|
225
|
-
|
226
|
-
option :bootstrap_vault_item,
|
227
|
-
long: "--bootstrap-vault-item VAULT_ITEM",
|
228
|
-
description: 'A single vault and item to update as "vault:item"',
|
229
|
-
proc: proc { |i|
|
230
|
-
(vault, item) = i.split(/:/)
|
231
|
-
Chef::Config[:knife][:bootstrap_vault_item] ||= {}
|
232
|
-
Chef::Config[:knife][:bootstrap_vault_item][vault] ||= []
|
233
|
-
Chef::Config[:knife][:bootstrap_vault_item][vault].push(item)
|
234
|
-
Chef::Config[:knife][:bootstrap_vault_item]
|
235
|
-
}
|
236
|
-
|
237
|
-
option :distro,
|
238
|
-
short: "-d DISTRO",
|
239
|
-
long: "--distro DISTRO",
|
240
|
-
description: "Bootstrap a distro using a template. [DEPRECATED] Use -t / --bootstrap-template option instead.",
|
241
|
-
proc: Proc.new { |v|
|
242
|
-
Chef::Log.fatal("[DEPRECATED] -d / --distro option is deprecated. Use --bootstrap-template option instead.")
|
243
|
-
v
|
244
|
-
}
|
245
|
-
|
246
|
-
option :tags,
|
247
|
-
long: "--tags TAGS",
|
248
|
-
description: "Comma separated list of tags to apply to the node",
|
249
|
-
proc: ->(tags) { tags.split(/[\s,]+/) },
|
250
|
-
default: []
|
251
|
-
|
252
|
-
option :bootstrap_template,
|
253
|
-
short: "-t TEMPLATE",
|
254
|
-
long: "--bootstrap-template TEMPLATE",
|
255
|
-
description: "Bootstrap Chef using a built-in or custom template. Set to the full path of an erb template or use one of the built-in templates."
|
256
|
-
|
257
|
-
option :template_file,
|
258
|
-
long: "--template-file TEMPLATE",
|
259
|
-
description: "Full path to location of template to use. [DEPRECATED] Use -t / --bootstrap-template option",
|
260
|
-
proc: Proc.new { |v|
|
261
|
-
Chef::Log.fatal("[DEPRECATED] --template-file option is deprecated. Use --bootstrap-template option instead.")
|
262
|
-
v
|
263
|
-
}
|
264
|
-
|
265
|
-
option :run_list,
|
266
|
-
short: "-r RUN_LIST",
|
267
|
-
long: "--run-list RUN_LIST",
|
268
|
-
description: "Comma separated list of roles/recipes to apply",
|
269
|
-
proc: ->(o) { o.split(/[\s,]+/) },
|
270
|
-
default: []
|
271
|
-
|
272
|
-
option :secret_file,
|
273
|
-
long: "--secret-file SECRET_FILE",
|
274
|
-
description: "A file containing the secret key to use to encrypt data bag item values",
|
275
|
-
proc: ->(secret_file) { Chef::Config[:knife][:secret_file] = secret_file }
|
276
|
-
|
277
|
-
# rubocop:disable Style/Blocks
|
278
|
-
option :hint,
|
279
|
-
long: "--hint HINT_NAME[=HINT_FILE]",
|
280
|
-
description: "Specify Ohai Hint to be set on the bootstrap target. Use multiple --hint options to specify multiple hints.",
|
281
|
-
proc: proc { |h|
|
282
|
-
Chef::Config[:knife][:hints] ||= {}
|
283
|
-
name, path = h.split("=")
|
284
|
-
Chef::Config[:knife][:hints][name] = path ? JSON.parse(::File.read(path)) : {}
|
285
|
-
},
|
286
|
-
default: ""
|
287
|
-
# rubocop:enable Style/Blocks
|
288
|
-
|
289
|
-
option :no_host_key_verify,
|
290
|
-
long: "--no-host-key-verify",
|
291
|
-
description: "Disable host key verification",
|
292
|
-
boolean: true
|
293
|
-
|
294
|
-
option :node_ssl_verify_mode,
|
295
|
-
long: "--node-ssl-verify-mode [peer|none]",
|
296
|
-
description: "Whether or not to verify the SSL cert for all HTTPS requests when bootstrapping"
|
297
|
-
|
298
|
-
option :first_boot_attributes,
|
299
|
-
short: "-j JSON_ATTRIBS",
|
300
|
-
long: "--json-attributes",
|
301
|
-
description: "A JSON string to be added to the first run of chef-client",
|
302
|
-
proc: ->(o) { JSON.parse(o) },
|
303
|
-
default: {}
|
169
|
+
long: "--bootstrap-protocol protocol",
|
170
|
+
description: "Protocol to bootstrap windows servers. options: winrm/ssh",
|
171
|
+
proc: proc { |key| Chef::Config[:knife][:bootstrap_protocol] = key },
|
172
|
+
default: nil
|
304
173
|
|
305
174
|
option :disable_customization,
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
175
|
+
long: "--disable-customization",
|
176
|
+
description: "Disable default customization",
|
177
|
+
boolean: true,
|
178
|
+
default: false
|
310
179
|
|
311
180
|
option :log_level,
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
181
|
+
short: "-l LEVEL",
|
182
|
+
long: "--log_level",
|
183
|
+
description: "Set the log level (debug, info, warn, error, fatal) for chef-client",
|
184
|
+
proc: ->(l) { l.to_sym }
|
316
185
|
|
317
186
|
option :mark_as_template,
|
318
|
-
|
319
|
-
|
320
|
-
|
187
|
+
long: "--mark_as_template",
|
188
|
+
description: "Indicates whether to mark the new vm as a template",
|
189
|
+
boolean: false
|
321
190
|
|
322
191
|
option :random_vmname,
|
323
|
-
|
324
|
-
|
325
|
-
|
192
|
+
long: "--random-vmname",
|
193
|
+
description: "Creates a random VMNAME starts with vm-XXXXXXXX",
|
194
|
+
boolean: false
|
326
195
|
|
327
196
|
option :random_vmname_prefix,
|
328
|
-
|
329
|
-
|
330
|
-
|
197
|
+
long: "--random-vmname-prefix PREFIX",
|
198
|
+
description: "Change the VMNAME prefix",
|
199
|
+
default: "vm-"
|
331
200
|
|
332
201
|
option :sysprep_timeout,
|
333
|
-
|
334
|
-
|
335
|
-
|
202
|
+
long: "--sysprep_timeout TIMEOUT",
|
203
|
+
description: "Wait TIMEOUT seconds for sysprep event before continuing with bootstrap",
|
204
|
+
default: 600
|
336
205
|
|
337
206
|
option :bootstrap_nic,
|
338
|
-
|
339
|
-
|
340
|
-
|
207
|
+
long: "--bootstrap-nic INTEGER",
|
208
|
+
description: "Network interface to use when multiple NICs are defined on a template.",
|
209
|
+
default: 0
|
341
210
|
|
342
211
|
option :bootstrap_ipv4,
|
343
|
-
|
344
|
-
|
345
|
-
|
212
|
+
long: "--bootstrap-ipv4",
|
213
|
+
description: "Force using an IPv4 address when a NIC has both IPv4 and IPv6 addresses.",
|
214
|
+
default: false
|
346
215
|
|
347
216
|
def run
|
217
|
+
check_license
|
218
|
+
|
219
|
+
plugin_setup!
|
220
|
+
validate_name_args!
|
221
|
+
validate_protocol!
|
222
|
+
validate_first_boot_attributes!
|
223
|
+
validate_winrm_transport_opts!
|
224
|
+
validate_policy_options!
|
225
|
+
plugin_validate_options!
|
226
|
+
|
227
|
+
winrm_warn_no_ssl_verification
|
228
|
+
warn_on_short_session_timeout
|
229
|
+
|
230
|
+
plugin_create_instance!
|
231
|
+
|
232
|
+
return unless get_config(:bootstrap)
|
233
|
+
|
348
234
|
$stdout.sync = true
|
235
|
+
connect!
|
236
|
+
register_client
|
349
237
|
|
238
|
+
content = render_template
|
239
|
+
bootstrap_path = upload_bootstrap(content)
|
240
|
+
perform_bootstrap(bootstrap_path)
|
241
|
+
plugin_finalize
|
242
|
+
ensure
|
243
|
+
connection.del_file!(bootstrap_path) if connection && bootstrap_path
|
244
|
+
end
|
245
|
+
|
246
|
+
# @return [TrueClass] If options are valid or exits
|
247
|
+
def plugin_validate_options!
|
350
248
|
unless using_supplied_hostname? ^ using_random_hostname?
|
351
249
|
show_usage
|
352
250
|
fatal_exit("You must specify a virtual machine name OR use --random-vmname")
|
@@ -361,7 +259,18 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
361
259
|
if get_config(:customization_macs) != AUTO_MAC && get_config(:customization_ips) == NO_IPS
|
362
260
|
abort('Must specify IP numbers with --cips when specifying MAC addresses with --cmacs, can use "dhcp" as placeholder')
|
363
261
|
end
|
262
|
+
end
|
364
263
|
|
264
|
+
attr_accessor :server_name
|
265
|
+
|
266
|
+
alias host_descriptor server_name
|
267
|
+
|
268
|
+
# Create the server that we will bootstrap, if necessary
|
269
|
+
#
|
270
|
+
# Plugins that subclass bootstrap, e.g. knife-ec2, can use this method to call out to an API to build an instance of the server we wish to bootstrap
|
271
|
+
#
|
272
|
+
# @return [TrueClass] If instance successfully created, or exits
|
273
|
+
def plugin_create_instance!
|
365
274
|
config[:chef_node_name] = vmname unless get_config(:chef_node_name)
|
366
275
|
|
367
276
|
vim = vim_connection
|
@@ -405,6 +314,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
405
314
|
end
|
406
315
|
|
407
316
|
return if get_config(:mark_as_template)
|
317
|
+
|
408
318
|
if get_config(:power) || get_config(:bootstrap)
|
409
319
|
vm = get_vm_by_name(vmname, cust_folder) || fatal_exit("VM #{vmname} not found")
|
410
320
|
begin
|
@@ -414,13 +324,12 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
414
324
|
end
|
415
325
|
puts "Powered on virtual machine #{vmname}"
|
416
326
|
end
|
417
|
-
|
418
327
|
return unless get_config(:bootstrap)
|
419
328
|
|
420
|
-
connect_port = get_config(:ssh_port)
|
421
329
|
protocol = get_config(:bootstrap_protocol)
|
422
330
|
if windows?(src_vm.config)
|
423
331
|
protocol ||= "winrm"
|
332
|
+
connect_port ||= 5985
|
424
333
|
unless config[:disable_customization]
|
425
334
|
# Wait for customization to complete
|
426
335
|
puts "Waiting for customization to complete..."
|
@@ -428,20 +337,35 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
428
337
|
puts "Customization Complete"
|
429
338
|
end
|
430
339
|
connect_host = guest_address(vm)
|
340
|
+
self.server_name = connect_host
|
431
341
|
Chef::Log.debug("Connect Host for winrm Bootstrap: #{connect_host}")
|
432
342
|
wait_for_access(connect_host, connect_port, protocol)
|
433
|
-
ssh_override_winrm
|
434
|
-
bootstrap_for_windows_node.run
|
435
343
|
else
|
436
344
|
connect_host = guest_address(vm)
|
345
|
+
self.server_name = connect_host
|
346
|
+
connect_port ||= 22
|
437
347
|
Chef::Log.debug("Connect Host for SSH Bootstrap: #{connect_host}")
|
438
348
|
protocol ||= "ssh"
|
439
349
|
wait_for_access(connect_host, connect_port, protocol)
|
440
|
-
ssh_override_winrm
|
441
|
-
bootstrap_for_node.run
|
442
350
|
end
|
443
351
|
end
|
444
352
|
|
353
|
+
# Perform any setup necessary by the plugin
|
354
|
+
#
|
355
|
+
# Plugins that subclass bootstrap, e.g. knife-ec2, can use this method to create connection objects
|
356
|
+
#
|
357
|
+
# @return [TrueClass] If instance successfully created, or exits
|
358
|
+
def plugin_setup!; end
|
359
|
+
|
360
|
+
# Perform any teardown or cleanup necessary by the plugin
|
361
|
+
#
|
362
|
+
# Plugins that subclass bootstrap, e.g. knife-ec2, can use this method to display a message or perform any cleanup
|
363
|
+
#
|
364
|
+
# @return [void]
|
365
|
+
def plugin_finalize; end
|
366
|
+
|
367
|
+
def validate_name_args!; end
|
368
|
+
|
445
369
|
def ipv4_address(vm)
|
446
370
|
puts "Waiting for a valid IPv4 address..."
|
447
371
|
# Multiple reboots occur during guest customization in which a link-local
|
@@ -475,12 +399,11 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
475
399
|
end
|
476
400
|
|
477
401
|
def wait_for_access(connect_host, connect_port, protocol)
|
478
|
-
if
|
479
|
-
|
480
|
-
|
481
|
-
config[:winrm_port] = "5986"
|
402
|
+
if winrm?
|
403
|
+
if get_config(:winrm_ssl) && get_config(:connection_port) == "5985"
|
404
|
+
config[:connection_port] = "5986"
|
482
405
|
end
|
483
|
-
connect_port = get_config(:
|
406
|
+
connect_port = get_config(:connection_port)
|
484
407
|
print "\n#{ui.color("Waiting for winrm access to become available on #{connect_host}:#{connect_port}", :magenta)}"
|
485
408
|
print(".") until tcp_test_winrm(connect_host, connect_port) do
|
486
409
|
sleep 10
|
@@ -513,7 +436,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
513
436
|
new_disk.backing.fileName = "[#{disk.backing.datastore.name}]"
|
514
437
|
new_disk.backing.parent = disk.backing
|
515
438
|
end,
|
516
|
-
}
|
439
|
+
},
|
517
440
|
],
|
518
441
|
}
|
519
442
|
src_vm.ReconfigVM_Task(spec: spec).wait_for_completion
|
@@ -565,6 +488,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
565
488
|
def find_host(host_name)
|
566
489
|
host = all_the_hosts.find { |host| host.name == host_name }
|
567
490
|
raise "Can't find #{host_name}. I found #{all_the_hosts.map(&:name)}" unless host
|
491
|
+
|
568
492
|
host
|
569
493
|
end
|
570
494
|
|
@@ -843,89 +767,8 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
843
767
|
adapter_map
|
844
768
|
end
|
845
769
|
|
846
|
-
def
|
847
|
-
|
848
|
-
bootstrap.config[:bootstrap_version] = get_config(:bootstrap_version)
|
849
|
-
bootstrap.config[:environment] = get_config(:environment)
|
850
|
-
bootstrap.config[:prerelease] = get_config(:prerelease)
|
851
|
-
bootstrap.config[:first_boot_attributes] = get_config(:first_boot_attributes)
|
852
|
-
bootstrap.config[:hint] = get_config(:hint)
|
853
|
-
bootstrap.config[:chef_node_name] = get_config(:chef_node_name)
|
854
|
-
bootstrap.config[:bootstrap_vault_file] = get_config(:bootstrap_vault_file)
|
855
|
-
bootstrap.config[:bootstrap_vault_json] = get_config(:bootstrap_vault_json)
|
856
|
-
bootstrap.config[:bootstrap_vault_item] = get_config(:bootstrap_vault_item)
|
857
|
-
# may be needed for vpc mode
|
858
|
-
bootstrap.config[:no_host_key_verify] = get_config(:no_host_key_verify)
|
859
|
-
bootstrap.config[:node_ssl_verify_mode] = get_config(:node_ssl_verify_mode)
|
860
|
-
bootstrap.config[:tags] = get_config(:tags)
|
861
|
-
bootstrap
|
862
|
-
end
|
863
|
-
|
864
|
-
def bootstrap_for_windows_node
|
865
|
-
Chef::Knife::Bootstrap.load_deps
|
866
|
-
if get_config(:bootstrap_protocol) == "winrm" || get_config(:bootstrap_protocol).nil?
|
867
|
-
bootstrap = Chef::Knife::BootstrapWindowsWinrm.new
|
868
|
-
bootstrap.name_args = [config[:fqdn]]
|
869
|
-
bootstrap.config[:winrm_user] = get_config(:winrm_user)
|
870
|
-
bootstrap.config[:winrm_password] = get_config(:winrm_password)
|
871
|
-
bootstrap.config[:winrm_transport] = get_config(:winrm_transport)
|
872
|
-
bootstrap.config[:winrm_port] = get_config(:winrm_port)
|
873
|
-
elsif get_config(:bootstrap_protocol) == "ssh"
|
874
|
-
bootstrap = Chef::Knife::BootstrapWindowsSsh.new
|
875
|
-
bootstrap.config[:ssh_user] = get_config(:ssh_user)
|
876
|
-
bootstrap.config[:ssh_password] = get_config(:ssh_password)
|
877
|
-
bootstrap.config[:ssh_port] = get_config(:ssh_port)
|
878
|
-
else
|
879
|
-
ui.error("Unsupported Bootstrapping Protocol. Supports : winrm, ssh")
|
880
|
-
exit 1
|
881
|
-
end
|
882
|
-
bootstrap.config[:msi_url] = get_config(:bootstrap_msi_url)
|
883
|
-
bootstrap_common_params(bootstrap)
|
884
|
-
end
|
885
|
-
|
886
|
-
def bootstrap_for_node
|
887
|
-
Chef::Knife::Bootstrap.load_deps
|
888
|
-
bootstrap = Chef::Knife::Bootstrap.new
|
889
|
-
bootstrap.name_args = [config[:fqdn]]
|
890
|
-
bootstrap.config[:bootstrap_template] = get_config(:bootstrap_template)
|
891
|
-
bootstrap.config[:secret_file] = get_config(:secret_file)
|
892
|
-
bootstrap.config[:ssh_user] = get_config(:ssh_user)
|
893
|
-
bootstrap.config[:ssh_password] = get_config(:ssh_password)
|
894
|
-
bootstrap.config[:ssh_port] = get_config(:ssh_port)
|
895
|
-
bootstrap.config[:identity_file] = get_config(:identity_file)
|
896
|
-
bootstrap.config[:use_sudo] = true unless get_config(:ssh_user) == "root"
|
897
|
-
bootstrap.config[:use_sudo_password] = true unless get_config(:ssh_user) == "root"
|
898
|
-
bootstrap.config[:log_level] = get_config(:log_level)
|
899
|
-
bootstrap_common_params(bootstrap)
|
900
|
-
end
|
901
|
-
|
902
|
-
def ssh_override_winrm
|
903
|
-
# unchanged ssh_user and changed winrm_user, override ssh_user
|
904
|
-
if get_config(:ssh_user).eql?(options[:ssh_user][:default]) &&
|
905
|
-
!get_config(:winrm_user).eql?(options[:winrm_user][:default])
|
906
|
-
config[:ssh_user] = get_config(:winrm_user)
|
907
|
-
end
|
908
|
-
|
909
|
-
# unchanged ssh_port and changed winrm_port, override ssh_port
|
910
|
-
if get_config(:ssh_port).eql?(options[:ssh_port][:default]) &&
|
911
|
-
!get_config(:winrm_port).eql?(options[:winrm_port][:default])
|
912
|
-
config[:ssh_port] = get_config(:winrm_port)
|
913
|
-
end
|
914
|
-
|
915
|
-
# unset ssh_password and set winrm_password, override ssh_password
|
916
|
-
if get_config(:ssh_password).nil? &&
|
917
|
-
!get_config(:winrm_password).nil?
|
918
|
-
config[:ssh_password] = get_config(:winrm_password)
|
919
|
-
end
|
920
|
-
|
921
|
-
# unset identity_file and set kerberos_keytab_file, override identity_file
|
922
|
-
return unless get_config(:identity_file).nil? && !get_config(:kerberos_keytab_file).nil?
|
923
|
-
|
924
|
-
config[:identity_file] = get_config(:kerberos_keytab_file)
|
925
|
-
end
|
926
|
-
|
927
|
-
def tcp_test_ssh(hostname, ssh_port)
|
928
|
-
tcp_socket = TCPSocket.new(hostname, ssh_port)
|
770
|
+
def tcp_test_ssh(hostname, connection_port)
|
771
|
+
tcp_socket = TCPSocket.new(hostname, connection_port)
|
929
772
|
readable = IO.select([tcp_socket], nil, nil, 5)
|
930
773
|
if readable
|
931
774
|
ssh_banner = tcp_socket.gets
|
@@ -978,14 +821,6 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
978
821
|
tcp_socket && tcp_socket.close
|
979
822
|
end
|
980
823
|
|
981
|
-
def load_winrm_deps
|
982
|
-
require "winrm"
|
983
|
-
require "chef/knife/winrm"
|
984
|
-
require "chef/knife/bootstrap_windows_winrm"
|
985
|
-
require "chef/knife/bootstrap_windows_ssh"
|
986
|
-
require "chef/knife/core/windows_bootstrap_context"
|
987
|
-
end
|
988
|
-
|
989
824
|
private
|
990
825
|
|
991
826
|
def vmname
|