Merge "Sync httpd vhost settings in between pcmk and non-pcmk scenarios"
[apex-tripleo-heat-templates.git] / puppet / compute.yaml
1 heat_template_version: 2015-04-30
2
3 description: >
4   OpenStack hypervisor node configured via Puppet.
5
6 parameters:
7   AdminPassword:
8     default: unset
9     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
10     type: string
11     hidden: true
12   CeilometerComputeAgent:
13     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
14     type: string
15     default: ''
16     constraints:
17     - allowed_values: ['', Present]
18   CeilometerMeteringSecret:
19     default: unset
20     description: Secret shared by the ceilometer services.
21     type: string
22     hidden: true
23   CeilometerPassword:
24     default: unset
25     description: The password for the ceilometer service account.
26     type: string
27     hidden: true
28   CinderEnableNfsBackend:
29     default: false
30     description: Whether to enable or not the NFS backend for Cinder
31     type: boolean
32   CinderEnableRbdBackend:
33     default: false
34     description: Whether to enable or not the Rbd backend for Cinder
35     type: boolean
36   Debug:
37     default: ''
38     description: Set to True to enable debugging on all services.
39     type: string
40   ExtraConfig:
41     default: {}
42     description: |
43       Additional hiera configuration to inject into the cluster. Note
44       that NovaComputeExtraConfig takes precedence over ExtraConfig.
45     type: json
46   Flavor:
47     description: Flavor for the nova compute node
48     type: string
49     constraints:
50       - custom_constraint: nova.flavor
51   GlanceHost:
52     type: string
53     default: ''  # Has to be here because of the ignored empty value bug
54   GlancePort:
55     default: "9292"
56     description: Glance port.
57     type: string
58   GlanceProtocol:
59     default: http
60     description: Protocol to use when connecting to glance, set to https for SSL.
61     type: string
62   Image:
63     type: string
64     default: overcloud-compute
65     constraints:
66       - custom_constraint: glance.image
67   ImageUpdatePolicy:
68     default: 'REBUILD_PRESERVE_EPHEMERAL'
69     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
70     type: string
71   KeyName:
72     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
73     type: string
74     default: default
75     constraints:
76       - custom_constraint: nova.keypair
77   KeystoneAdminApiVirtualIP:
78     type: string
79     default: ''
80   KeystonePublicApiVirtualIP:
81      type: string
82      default: ''
83   NeutronBridgeMappings:
84     description: >
85       The OVS logical->physical bridge mappings to use. See the Neutron
86       documentation for details. Defaults to mapping br-ex - the external
87       bridge on hosts - to a physical name 'datacentre' which can be used
88       to create provider networks (and we use this for the default floating
89       network) - if changing this either use different post-install network
90       scripts or be sure to keep 'datacentre' as a mapping network name.
91     type: string
92     default: "datacentre:br-ex"
93   NeutronEnableTunnelling:
94     type: string
95     default: "True"
96   NeutronFlatNetworks:
97     type: string
98     default: 'datacentre'
99     description: >
100       If set, flat networks to configure in neutron plugins.
101   NeutronHost:
102     type: string
103     default: ''  # Has to be here because of the ignored empty value bug
104   NeutronNetworkType:
105     type: string
106     description: The tenant network type for Neutron, either gre or vxlan.
107     default: 'vxlan'
108   NeutronNetworkVLANRanges:
109     default: 'datacentre'
110     description: >
111       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
112       Neutron documentation for permitted values. Defaults to permitting any
113       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
114     type: comma_delimited_list
115   NeutronPassword:
116     default: unset
117     description: The password for the neutron service account, used by neutron agents.
118     type: string
119     hidden: true
120   NeutronPhysicalBridge:
121     default: 'br-ex'
122     description: An OVS bridge to create for accessing external networks.
123     type: string
124   NeutronPublicInterface:
125     default: nic1
126     description: A port to add to the NeutronPhysicalBridge.
127     type: string
128   NeutronTunnelTypes:
129     type: string
130     description: |
131         The tunnel types for the Neutron tenant network. To specify multiple
132         values, use a comma separated string, like so: 'gre,vxlan'
133     default: 'vxlan'
134   NeutronTunnelIdRanges:
135     description: |
136         Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges
137         of GRE tunnel IDs that are available for tenant network allocation
138     default: ["1:1000", ]
139     type: comma_delimited_list
140   NeutronVniRanges:
141     description: |
142         Comma-separated list of <vni_min>:<vni_max> tuples enumerating ranges
143         of VXLAN VNI IDs that are available for tenant network allocation
144     default: ["1:1000", ]
145     type: comma_delimited_list
146   NeutronPublicInterfaceRawDevice:
147     default: ''
148     type: string
149   NeutronDVR:
150     default: 'False'
151     type: string
152   NeutronMetadataProxySharedSecret:
153     default: 'unset'
154     description: Shared secret to prevent spoofing
155     type: string
156     hidden: true
157   NeutronCorePlugin:
158     default: 'ml2'
159     description: |
160         The core plugin for Neutron. The value should be the entrypoint to be loaded
161         from neutron.core_plugins namespace.
162     type: string
163   NeutronServicePlugins:
164     default: "router"
165     description: |
166         Comma-separated list of service plugin entrypoints to be loaded from the
167         neutron.service_plugins namespace.
168     type: comma_delimited_list
169   NeutronTypeDrivers:
170     default: "vxlan,vlan,flat,gre"
171     description: |
172         Comma-separated list of network type driver entrypoints to be loaded.
173     type: comma_delimited_list
174   NeutronMechanismDrivers:
175     default: 'openvswitch'
176     description: |
177         The mechanism drivers for the Neutron tenant network. To specify multiple
178         values, use a comma separated string, like so: 'openvswitch,l2_population'
179     type: string
180   # Not relevant for Computes, should be removed
181   NeutronAllowL3AgentFailover:
182     default: 'True'
183     description: Allow automatic l3-agent failover
184     type: string
185   # Not relevant for Computes, should be removed
186   NeutronL3HA:
187     default: 'False'
188     description: Whether to enable l3-agent HA
189     type: string
190   NeutronAgentMode:
191     default: 'dvr_snat'
192     description: Agent mode for the neutron-l3-agent on the controller hosts
193     type: string
194   NovaApiHost:
195     type: string
196     default: ''  # Has to be here because of the ignored empty value bug
197   NovaComputeDriver:
198     type: string
199     default: libvirt.LibvirtDriver
200   NovaComputeExtraConfig:
201     default: {}
202     description: |
203       NovaCompute specific configuration to inject into the cluster. Same
204       structure as ExtraConfig.
205     type: json
206   NovaComputeLibvirtType:
207     type: string
208     default: ''
209   NovaEnableRbdBackend:
210     default: false
211     description: Whether to enable or not the Rbd backend for Nova
212     type: boolean
213   NovaPassword:
214     default: unset
215     description: The password for the nova service account, used by nova-api.
216     type: string
217     hidden: true
218   NovaPublicIP:
219     type: string
220     default: ''  # Has to be here because of the ignored empty value bug
221   NtpServer:
222     type: string
223     default: ''
224   RabbitHost:
225     type: string
226     default: ''  # Has to be here because of the ignored empty value bug
227   RabbitPassword:
228     default: guest
229     description: The password for RabbitMQ
230     type: string
231     hidden: true
232   RabbitUserName:
233     default: guest
234     description: The username for RabbitMQ
235     type: string
236   RabbitClientUseSSL:
237     default: false
238     description: >
239         Rabbit client subscriber parameter to specify
240         an SSL connection to the RabbitMQ host.
241     type: string
242   RabbitClientPort:
243     default: 5672
244     description: Set rabbit subscriber port, change this if using SSL
245     type: number
246   SnmpdReadonlyUserName:
247     default: ro_snmp_user
248     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
249     type: string
250   SnmpdReadonlyUserPassword:
251     default: unset
252     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
253     type: string
254     hidden: true
255   EnablePackageInstall:
256     default: 'false'
257     description: Set to true to enable package installation via Puppet
258     type: boolean
259   ServiceNetMap:
260     default: {}
261     description: Mapping of service_name -> network name. Typically set
262                  via parameter_defaults in the resource registry.
263     type: json
264   UpdateIdentifier:
265     default: ''
266     type: string
267     description: >
268       Setting to a previously unused value during stack-update will trigger
269       package update on all nodes
270   Hostname:
271     type: string
272     default: '' # Defaults to Heat created hostname
273
274 resources:
275
276   NovaCompute:
277     type: OS::Nova::Server
278     properties:
279       image:
280         {get_param: Image}
281       image_update_policy:
282         get_param: ImageUpdatePolicy
283       flavor: {get_param: Flavor}
284       key_name: {get_param: KeyName}
285       networks:
286         - network: ctlplane
287       user_data_format: SOFTWARE_CONFIG
288       user_data: {get_resource: UserData}
289       name: {get_param: Hostname}
290
291   # Combine the NodeAdminUserData and NodeUserData mime archives
292   UserData:
293     type: OS::Heat::MultipartMime
294     properties:
295       parts:
296       - config: {get_resource: NodeAdminUserData}
297         type: multipart
298       - config: {get_resource: NodeUserData}
299         type: multipart
300
301   # Creates the "heat-admin" user if configured via the environment
302   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
303   NodeAdminUserData:
304     type: OS::TripleO::NodeAdminUserData
305
306   # For optional operator additional userdata
307   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
308   NodeUserData:
309     type: OS::TripleO::NodeUserData
310
311   InternalApiPort:
312     type: OS::TripleO::Compute::Ports::InternalApiPort
313     properties:
314       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
315
316   StoragePort:
317     type: OS::TripleO::Compute::Ports::StoragePort
318     properties:
319       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
320
321   TenantPort:
322     type: OS::TripleO::Compute::Ports::TenantPort
323     properties:
324       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
325
326   NetIpMap:
327     type: OS::TripleO::Network::Ports::NetIpMap
328     properties:
329       ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
330       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
331       StorageIp: {get_attr: [StoragePort, ip_address]}
332       TenantIp: {get_attr: [TenantPort, ip_address]}
333
334   NetworkConfig:
335     type: OS::TripleO::Compute::Net::SoftwareConfig
336     properties:
337       ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
338       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
339       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
340       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
341
342   NetworkDeployment:
343     type: OS::TripleO::SoftwareDeployment
344     properties:
345       config: {get_resource: NetworkConfig}
346       server: {get_resource: NovaCompute}
347       input_values:
348         bridge_name: {get_param: NeutronPhysicalBridge}
349         interface_name: {get_param: NeutronPublicInterface}
350
351   NovaComputeConfig:
352     type: OS::Heat::StructuredConfig
353     properties:
354       group: os-apply-config
355       config:
356         hiera:
357           hierarchy:
358             - '"%{::uuid}"'
359             - heat_config_%{::deploy_config_name}
360             - compute_extraconfig
361             - extraconfig
362             - compute
363             - ceph_cluster # provided by CephClusterConfig
364             - ceph
365             - all_nodes # provided by allNodesConfig
366             - '"%{::osfamily}"'
367             - common
368             - cisco_n1kv_data  # Optionally provided by ComputeExtraConfigPre
369           datafiles:
370             compute_extraconfig:
371               mapped_data: {get_param: NovaComputeExtraConfig}
372             extraconfig:
373               mapped_data: {get_param: ExtraConfig}
374             common:
375               raw_data: {get_file: hieradata/common.yaml}
376             ceph:
377               raw_data: {get_file: hieradata/ceph.yaml}
378             compute:
379               raw_data: {get_file: hieradata/compute.yaml}
380               mapped_data:
381                 cinder_enable_nfs_backend: {get_input: cinder_enable_nfs_backend}
382                 nova::debug: {get_input: debug}
383                 nova::rabbit_userid: {get_input: rabbit_username}
384                 nova::rabbit_password: {get_input: rabbit_password}
385                 nova::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
386                 nova::rabbit_port: {get_input: rabbit_client_port}
387                 nova_compute_driver: {get_input: nova_compute_driver}
388                 nova::compute::libvirt::libvirt_virt_type: {get_input: nova_compute_libvirt_type}
389                 nova_api_host: {get_input: nova_api_host}
390                 nova::compute::vncproxy_host: {get_input: nova_public_ip}
391                 nova::compute::rbd::ephemeral_storage: {get_input: nova_enable_rbd_backend}
392                 rbd_persistent_storage: {get_input: cinder_enable_rbd_backend}
393                 nova_password: {get_input: nova_password}
394                 nova::compute::vncserver_proxyclient_address: {get_input: nova_vnc_proxyclient_address}
395                 ceilometer::debug: {get_input: debug}
396                 ceilometer::rabbit_userid: {get_input: rabbit_username}
397                 ceilometer::rabbit_password: {get_input: rabbit_password}
398                 ceilometer::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
399                 ceilometer::rabbit_port: {get_input: rabbit_client_port}
400                 ceilometer::metering_secret: {get_input: ceilometer_metering_secret}
401                 ceilometer::agent::auth::auth_password: {get_input: ceilometer_password}
402                 ceilometer::agent::auth::auth_url: {get_input: ceilometer_agent_auth_url}
403                 ceilometer_compute_agent: {get_input: ceilometer_compute_agent}
404                 snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
405                 snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
406                 nova::glance_api_servers: {get_input: glance_api_servers}
407                 neutron::debug: {get_input: debug}
408                 neutron::rabbit_password: {get_input: rabbit_password}
409                 neutron::rabbit_user: {get_input: rabbit_user}
410                 neutron::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
411                 neutron::rabbit_port: {get_input: rabbit_client_port}
412                 neutron_flat_networks: {get_input: neutron_flat_networks}
413                 neutron_host: {get_input: neutron_host}
414                 neutron::agents::ml2::ovs::local_ip: {get_input: neutron_local_ip}
415
416                 neutron_tenant_network_type: {get_input: neutron_tenant_network_type}
417                 neutron_tunnel_types: {get_input: neutron_tunnel_types}
418                 neutron::plugins::ml2::network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
419                 neutron::plugins::ml2::tunnel_id_ranges: {get_input: neutron_tunnel_id_ranges}
420                 neutron::plugins::ml2::vni_ranges: {get_input: neutron_vni_ranges}
421                 neutron_bridge_mappings: {get_input: neutron_bridge_mappings}
422                 neutron::agents::ml2::ovs::enable_tunneling: {get_input: neutron_enable_tunneling}
423                 neutron_physical_bridge: {get_input: neutron_physical_bridge}
424                 neutron_public_interface: {get_input: neutron_public_interface}
425                 nova::network::neutron::neutron_admin_password: {get_input: neutron_password}
426                 nova::network::neutron::neutron_url: {get_input: neutron_url}
427                 nova::network::neutron::neutron_admin_auth_url: {get_input: neutron_admin_auth_url}
428                 neutron_router_distributed: {get_input: neutron_router_distributed}
429                 neutron_agent_mode: {get_input: neutron_agent_mode}
430                 neutron_metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
431                 neutron::core_plugin: {get_input: neutron_core_plugin}
432                 neutron::service_plugins: {get_input: neutron_service_plugins}
433                 neutron::plugins::ml2::type_drivers: {get_input: neutron_type_drivers}
434                 neutron_mechanism_drivers: {get_input: neutron_mechanism_drivers}
435                 neutron_public_interface_raw_device: {get_input: neutron_public_interface_raw_device}
436                 admin_password: {get_input: admin_password}
437                 ntp::servers: {get_input: ntp_servers}
438                 tripleo::packages::enable_install: {get_input: enable_package_install}
439                 tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
440
441   NovaComputeDeployment:
442     type: OS::TripleO::SoftwareDeployment
443     depends_on: NetworkDeployment
444     properties:
445       config: {get_resource: NovaComputeConfig}
446       server: {get_resource: NovaCompute}
447       input_values:
448         cinder_enable_nfs_backend: {get_param: CinderEnableNfsBackend}
449         debug: {get_param: Debug}
450         nova_compute_driver: {get_param: NovaComputeDriver}
451         nova_compute_libvirt_type: {get_param: NovaComputeLibvirtType}
452         nova_public_ip: {get_param: NovaPublicIP}
453         nova_api_host: {get_param: NovaApiHost}
454         nova_password: {get_param: NovaPassword}
455         nova_enable_rbd_backend: {get_param: NovaEnableRbdBackend}
456         cinder_enable_rbd_backend: {get_param: CinderEnableRbdBackend}
457         nova_vnc_proxyclient_address: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaVncProxyNetwork]}]}
458         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
459         ceilometer_password: {get_param: CeilometerPassword}
460         ceilometer_compute_agent: {get_param: CeilometerComputeAgent}
461         ceilometer_agent_auth_url:
462           list_join:
463             - ''
464             - - 'http://'
465               - {get_param: KeystonePublicApiVirtualIP}
466               - ':5000/v2.0'
467         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
468         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
469         glance_api_servers:
470           list_join:
471             - ''
472             - - {get_param: GlanceProtocol}
473               - '://'
474               - {get_param: GlanceHost}
475               - ':'
476               - {get_param: GlancePort}
477         neutron_flat_networks: {get_param: NeutronFlatNetworks}
478         neutron_host: {get_param: NeutronHost}
479         neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]}
480         neutron_tenant_network_type: {get_param: NeutronNetworkType}
481         neutron_tunnel_types: {get_param: NeutronTunnelTypes}
482         neutron_tunnel_id_ranges:
483           str_replace:
484             template: "['RANGES']"
485             params:
486               RANGES:
487                 list_join:
488                 - "','"
489                 - {get_param: NeutronTunnelIdRanges}
490         neutron_vni_ranges:
491           str_replace:
492             template: "['RANGES']"
493             params:
494               RANGES:
495                 list_join:
496                 - "','"
497                 - {get_param: NeutronVniRanges}
498         neutron_network_vlan_ranges:
499           str_replace:
500             template: "['RANGES']"
501             params:
502               RANGES:
503                 list_join:
504                 - "','"
505                 - {get_param: NeutronNetworkVLANRanges}
506         neutron_bridge_mappings: {get_param: NeutronBridgeMappings}
507         neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
508         neutron_physical_bridge: {get_param: NeutronPhysicalBridge}
509         neutron_public_interface: {get_param: NeutronPublicInterface}
510         neutron_password: {get_param: NeutronPassword}
511         neutron_agent_mode: {get_param: NeutronAgentMode}
512         neutron_router_distributed: {get_param: NeutronDVR}
513         neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
514         neutron_core_plugin: {get_param: NeutronCorePlugin}
515         neutron_service_plugins:
516           str_replace:
517             template: "['PLUGINS']"
518             params:
519               PLUGINS:
520                 list_join:
521                 - "','"
522                 - {get_param: NeutronServicePlugins}
523         neutron_type_drivers:
524           str_replace:
525             template: "['DRIVERS']"
526             params:
527               DRIVERS:
528                 list_join:
529                 - "','"
530                 - {get_param: NeutronTypeDrivers}
531         neutron_mechanism_drivers: {get_param: NeutronMechanismDrivers}
532         neutron_public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
533         neutron_url:
534           list_join:
535             - ''
536             - - 'http://'
537               - {get_param: NeutronHost}
538               - ':9696'
539         neutron_admin_auth_url:
540           list_join:
541             - ''
542             - - 'http://'
543               - {get_param: KeystoneAdminApiVirtualIP}
544               - ':35357/v2.0'
545         admin_password: {get_param: AdminPassword}
546         rabbit_username: {get_param: RabbitUserName}
547         rabbit_password: {get_param: RabbitPassword}
548         rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
549         rabbit_client_port: {get_param: RabbitClientPort}
550         ntp_servers:
551           str_replace:
552             template: '["server"]'
553             params:
554               server: {get_param: NtpServer}
555         enable_package_install: {get_param: EnablePackageInstall}
556         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
557
558   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
559   ComputeExtraConfigPre:
560     depends_on: NovaComputeDeployment
561     type: OS::TripleO::ComputeExtraConfigPre
562     properties:
563         server: {get_resource: NovaCompute}
564
565   # Hook for site-specific additional pre-deployment config,
566   # applying to all nodes, e.g node registration/unregistration
567   NodeExtraConfig:
568     depends_on: ComputeExtraConfigPre
569     type: OS::TripleO::NodeExtraConfig
570     properties:
571         server: {get_resource: NovaCompute}
572
573   UpdateConfig:
574     type: OS::TripleO::Tasks::PackageUpdate
575
576   UpdateDeployment:
577     type: OS::Heat::SoftwareDeployment
578     properties:
579       config: {get_resource: UpdateConfig}
580       server: {get_resource: NovaCompute}
581       input_values:
582         update_identifier:
583           get_param: UpdateIdentifier
584
585 outputs:
586   ip_address:
587     description: IP address of the server in the ctlplane network
588     value: {get_attr: [NovaCompute, networks, ctlplane, 0]}
589   internal_api_ip_address:
590     description: IP address of the server in the internal_api network
591     value: {get_attr: [InternalApiPort, ip_address]}
592   storage_ip_address:
593     description: IP address of the server in the storage network
594     value: {get_attr: [StoragePort, ip_address]}
595   tenant_ip_address:
596     description: IP address of the server in the tenant network
597     value: {get_attr: [TenantPort, ip_address]}
598   hostname:
599     description: Hostname of the server
600     value: {get_attr: [NovaCompute, name]}
601   hosts_entry:
602     description: >
603       Server's IP address and hostname in the /etc/hosts format
604     value:
605       str_replace:
606         template: "IP HOST.localdomain HOST"
607         params:
608           IP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ComputeHostnameResolveNetwork]}]}
609           HOST: {get_attr: [NovaCompute, name]}
610   nova_server_resource:
611     description: Heat resource handle for the Nova compute server
612     value:
613       {get_resource: NovaCompute}
614   config_identifier:
615     description: identifier which changes if the node configuration may need re-applying
616     value:
617       list_join:
618       - ','
619       - - {get_attr: [NovaComputeDeployment, deploy_stdout]}
620         - {get_attr: [ComputeExtraConfigPre, deploy_stdout]}
621         - {get_param: UpdateIdentifier}