blob: 220b8eb0c9d568bccd65751235c11175ab2a3f5b [file] [log] [blame]
Filip Pytloun4a72d792015-10-06 16:28:32 +02001
Aleš Komárek72152852017-04-11 13:48:48 +02002============
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03003Usage
Aleš Komárek72152852017-04-11 13:48:48 +02004============
Filip Pytloun4a72d792015-10-06 16:28:32 +02005
Jakub Pavlikfcf34f82016-05-20 09:35:51 +02006OpenStack Nova provides a cloud computing fabric controller, supporting a wide
7variety of virtualization technologies, including KVM, Xen, LXC, VMware, and
8more. In addition to its native API, it includes compatibility with the
9commonly encountered Amazon EC2 and S3 APIs.
Filip Pytloun4a72d792015-10-06 16:28:32 +020010
Aleš Komárek72152852017-04-11 13:48:48 +020011Sample Pillars
Filip Pytloun4a72d792015-10-06 16:28:32 +020012==============
13
14Controller nodes
15----------------
16
OlgaGusarenko9dd01c92018-07-31 00:49:30 +030017Nova services on the controller node:
Filip Pytloun4a72d792015-10-06 16:28:32 +020018
19.. code-block:: yaml
20
21 nova:
22 controller:
23 version: juno
24 enabled: true
25 security_group: true
Lachlan Evensonb72de502016-01-20 15:34:04 -080026 cpu_allocation_ratio: 8.0
27 ram_allocation_ratio: 1.0
Jiri Konecny9344a372016-03-21 19:25:48 +010028 disk_allocation_ratio: 1.0
Dmitry Stremkovskiy2bcba8d2017-07-30 21:43:59 +030029 cross_az_attach: false
Jiri Konecnyb5a80e42016-03-22 11:51:01 +010030 workers: 8
Jakub Pavlik617a8962016-09-04 18:50:06 +020031 report_interval: 60
Michel Nederlof8ff99332017-10-23 14:29:15 +020032 dhcp_domain: novalocal
Gleb Galkin32a54092018-10-02 17:16:40 +030033 consoleauth_token_ttl: 600
Filip Pytloun4a72d792015-10-06 16:28:32 +020034 bind:
35 public_address: 10.0.0.122
36 public_name: openstack.domain.com
37 novncproxy_port: 6080
38 database:
39 engine: mysql
40 host: 127.0.0.1
41 port: 3306
42 name: nova
43 user: nova
44 password: pwd
45 identity:
46 engine: keystone
47 host: 127.0.0.1
48 port: 35357
49 user: nova
50 password: pwd
51 tenant: service
52 message_queue:
53 engine: rabbitmq
54 host: 127.0.0.1
55 port: 5672
56 user: openstack
57 password: pwd
58 virtual_host: '/openstack'
59 network:
60 engine: neutron
61 host: 127.0.0.1
62 port: 9696
Jakub Pavlik617a8962016-09-04 18:50:06 +020063 extension_sync_interval: 600
Filip Pytloun4a72d792015-10-06 16:28:32 +020064 identity:
65 engine: keystone
66 host: 127.0.0.1
67 port: 35357
68 user: neutron
69 password: pwd
70 tenant: service
71 metadata:
72 password: password
Petr Michalecaa23dc02016-11-29 16:30:25 +010073 audit:
74 enabled: false
Simon Pasquier8683b7a2017-02-03 16:00:16 +010075 osapi_max_limit: 500
Oleg Iurchenko370c10d2017-10-19 14:03:37 +030076 barbican:
77 enabled: true
Filip Pytloun4a72d792015-10-06 16:28:32 +020078
OlgaGusarenko9dd01c92018-07-31 00:49:30 +030079Nova services from custom package repository:
Filip Pytloun4a72d792015-10-06 16:28:32 +020080
81.. code-block:: yaml
82
83 nova:
84 controller:
85 version: juno
86 source:
87 engine: pkg
88 address: http://...
89 ....
90
OlgaGusarenko9dd01c92018-07-31 00:49:30 +030091Client-side RabbitMQ HA setup:
Jiri Konecnye31f2c52016-04-14 17:16:02 +020092
93.. code-block:: yaml
94
95 nova:
96 controller:
97 ....
98 message_queue:
99 engine: rabbitmq
100 members:
101 - host: 10.0.16.1
102 - host: 10.0.16.2
103 - host: 10.0.16.3
104 user: openstack
105 password: pwd
106 virtual_host: '/openstack'
107 ....
108
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300109Enable auditing filter, i.e: CADF:
Petr Michalecaa23dc02016-11-29 16:30:25 +0100110
111.. code-block:: yaml
112
113 nova:
114 controller:
Simon Pasquier6a3c8f72016-12-19 15:37:24 +0100115 audit:
Petr Michalecaa23dc02016-11-29 16:30:25 +0100116 enabled: true
117 ....
118 filter_factory: 'keystonemiddleware.audit:filter_factory'
119 map_file: '/etc/pycadf/nova_api_audit_map.conf'
120 ....
121
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300122Enable CORS parameters:
Ondrej Smola25b53cb2017-04-28 10:56:19 +0200123
124.. code-block:: yaml
125
126 nova:
127 controller:
128 cors:
129 allowed_origin: https:localhost.local,http:localhost.local
130 expose_headers: X-Auth-Token,X-Openstack-Request-Id,X-Subject-Token
131 allow_methods: GET,PUT,POST,DELETE,PATCH
132 allow_headers: X-Auth-Token,X-Openstack-Request-Id,X-Subject-Token
133 allow_credentials: True
134 max_age: 86400
135
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300136Configuration of the ``policy.json`` file:
Dmitry Ukov3562a082017-05-04 00:00:48 +0400137
138.. code-block:: yaml
139
140 nova:
141 controller:
142 ....
143 policy:
144 context_is_admin: 'role:admin or role:administrator'
145 'compute:create': 'rule:admin_or_owner'
146 # Add key without value to remove line from policy.json
147 'compute:create:attach_network':
Ondrej Smola25b53cb2017-04-28 10:56:19 +0200148
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300149Enable Barbican integration:
Oleg Iurchenko370c10d2017-10-19 14:03:37 +0300150
151.. code-block:: yaml
152
153 nova:
154 controller:
155 ....
156 barbican:
157 enabled: true
158
Jiri Broulik789179a2018-02-13 16:16:46 +0100159Enable cells update:
160
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300161.. note:: Useful when upgrading Openstack. To update cells to test
162 sync db agains duplicated production database.
Jiri Broulik789179a2018-02-13 16:16:46 +0100163
164.. code-block:: yaml
165
166 nova:
167 controller:
168 update_cells: true
169
Kirill Bespalov64617172017-07-11 14:43:14 +0300170
Kirill Bespalova0eaca72017-11-20 13:40:42 +0300171Configuring TLS communications
172------------------------------
Kirill Bespalov64617172017-07-11 14:43:14 +0300173
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300174.. note:: By default system wide installed CA certs are used,
175 so ``cacert_file`` param is optional, as well as ``cacert``.
Kirill Bespalova0eaca72017-11-20 13:40:42 +0300176
177- **RabbitMQ TLS**
Kirill Bespalov64617172017-07-11 14:43:14 +0300178
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300179 .. code-block:: yaml
Kirill Bespalov64617172017-07-11 14:43:14 +0300180
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300181 nova:
182 compute:
183 message_queue:
184 port: 5671
185 ssl:
186 enabled: True
187 (optional) cacert: cert body if the cacert_file does not exists
188 (optional) cacert_file: /etc/openstack/rabbitmq-ca.pem
189 (optional) version: TLSv1_2
Kirill Bespalov64617172017-07-11 14:43:14 +0300190
Kirill Bespalova0eaca72017-11-20 13:40:42 +0300191- **MySQL TLS**
Kirill Bespalov64617172017-07-11 14:43:14 +0300192
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300193 .. code-block:: yaml
Kirill Bespalov64617172017-07-11 14:43:14 +0300194
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300195 nova:
196 controller:
197 database:
198 ssl:
199 enabled: True
200 (optional) cacert: cert body if the cacert_file does not exists
201 (optional) cacert_file: /etc/openstack/mysql-ca.pem
Kirill Bespalov64617172017-07-11 14:43:14 +0300202
Kirill Bespalova0eaca72017-11-20 13:40:42 +0300203- **Openstack HTTPS API**
204
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300205 Set the ``https`` as protocol at ``nova:compute`` and
206 ``nova:controller`` sections :
Kirill Bespalova0eaca72017-11-20 13:40:42 +0300207
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300208 .. code-block:: yaml
Kirill Bespalov64617172017-07-11 14:43:14 +0300209
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300210 nova:
211 controller :
212 identity:
213 protocol: https
214 (optional) cacert_file: /etc/openstack/proxy.pem
215 network:
216 protocol: https
217 (optional) cacert_file: /etc/openstack/proxy.pem
218 glance:
219 protocol: https
220 (optional) cacert_file: /etc/openstack/proxy.pem
Kirill Bespalov64617172017-07-11 14:43:14 +0300221
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300222 .. code-block:: yaml
Kirill Bespalov64617172017-07-11 14:43:14 +0300223
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300224 nova:
225 compute:
226 identity:
227 protocol: https
228 (optional) cacert_file: /etc/openstack/proxy.pem
229 network:
230 protocol: https
231 (optional) cacert_file: /etc/openstack/proxy.pem
232 image:
233 protocol: https
234 (optional) cacert_file: /etc/openstack/proxy.pem
235 ironic:
236 protocol: https
237 (optional) cacert_file: /etc/openstack/proxy.pem
Kirill Bespalov64617172017-07-11 14:43:14 +0300238
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300239.. note:: Barbican, Cinder, and placement url endpoints are discovering
240 using service catalog.
Kirill Bespalov64617172017-07-11 14:43:14 +0300241
Filip Pytloun4a72d792015-10-06 16:28:32 +0200242Compute nodes
243-------------
244
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300245Nova controller services on compute node:
Filip Pytloun4a72d792015-10-06 16:28:32 +0200246
247.. code-block:: yaml
248
249 nova:
250 compute:
251 version: juno
252 enabled: true
Dmitry Stremkovskiy2bcba8d2017-07-30 21:43:59 +0300253 cross_az_attach: false
Dmitry Stremkovskiy35e53b72017-07-29 12:50:39 +0300254 disk_cachemodes: network=writeback,block=none
Jiri Broulik70d9e3f2017-02-15 18:37:13 +0100255 availability_zone: availability_zone_01
Damian Szelugae1922412017-04-18 16:36:46 +0200256 aggregates:
257 - hosts_with_fc
258 - hosts_with_ssd
Filip Pytloun4a72d792015-10-06 16:28:32 +0200259 security_group: true
Petr Michalecf03e4882017-04-10 10:26:18 +0200260 resume_guests_state_on_host_boot: False
Michael Polenchuk159c2542018-06-09 15:31:51 +0400261 preallocate_images: space # Default is 'none'
Dmitry Stremkovskiy8a0ff512017-07-25 20:54:13 +0300262 my_ip: 10.1.0.16
Filip Pytloun4a72d792015-10-06 16:28:32 +0200263 bind:
264 vnc_address: 172.20.0.100
265 vnc_port: 6080
266 vnc_name: openstack.domain.com
267 vnc_protocol: http
268 database:
269 engine: mysql
270 host: 127.0.0.1
271 port: 3306
272 name: nova
273 user: nova
274 password: pwd
275 identity:
276 engine: keystone
277 host: 127.0.0.1
278 port: 35357
279 user: nova
280 password: pwd
281 tenant: service
282 message_queue:
283 engine: rabbitmq
284 host: 127.0.0.1
285 port: 5672
286 user: openstack
287 password: pwd
288 virtual_host: '/openstack'
289 image:
290 engine: glance
291 host: 127.0.0.1
292 port: 9292
293 network:
294 engine: neutron
295 host: 127.0.0.1
296 port: 9696
297 identity:
298 engine: keystone
299 host: 127.0.0.1
300 port: 35357
301 user: neutron
302 password: pwd
303 tenant: service
304 qemu:
305 max_files: 4096
306 max_processes: 4096
Dmitry Stremkovskiy96281f52017-07-26 00:39:22 +0300307 host: node-12.domain.tld
Filip Pytloun4a72d792015-10-06 16:28:32 +0200308
Vasyl Saienkocab3a902018-07-12 13:17:17 +0300309Compute with vmware driver. Each vmware cluster requires a separate process of nova-compute.
310Each process should have uniq host identifier. However multiple computes might be running on
311single host. It is not recommended to have multiple computes running on different hosts that
312manage the same vmware cluster. To achive this pacemaker/corosync or keepalived might be used.
313
314.. code-block:: yaml
315
316 nova:
317 compute:
318 compute_driver: vmwareapi.VMwareVCDriver
319 vmware:
320 host_username: vmware
321 host_password: vmware
322 cluster_name: vmware_cluster01
323 host_ip: 1.2.3.4
324
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300325Group and user to be used for QEMU processes run by the system instance:
kkalynovskyif50f0c02017-12-12 17:52:57 +0200326
327.. code-block:: yaml
328
329 nova:
330 compute:
331 enabled: true
332 ...
333 qemu:
334 user: nova
335 group: cinder
336 dynamic_ownership: 1
337
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300338Group membership for user nova (upgrade related):
Dmitry Stremkovskiy3cd6ba82017-07-25 17:15:36 +0300339
340.. code-block:: yaml
341
342 nova:
343 compute:
344 enabled: true
345 ...
346 user:
347 groups:
348 - libvirt
Filip Pytloun4a72d792015-10-06 16:28:32 +0200349
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300350Nova services on compute node with OpenContrail:
Filip Pytloun4a72d792015-10-06 16:28:32 +0200351
352.. code-block:: yaml
353
354 nova:
355 compute:
356 enabled: true
357 ...
358 networking: contrail
359
Oleksandr Bryndziibb8abfe2018-09-28 22:21:43 +0000360Nova services on compute node with memcached caching and security strategy:
Filip Pytloun4a72d792015-10-06 16:28:32 +0200361
362.. code-block:: yaml
363
364 nova:
365 compute:
366 enabled: true
367 ...
368 cache:
369 engine: memcached
370 members:
371 - host: 127.0.0.1
372 port: 11211
373 - host: 127.0.0.1
374 port: 11211
Oleksandr Bryndziibb8abfe2018-09-28 22:21:43 +0000375 security:
376 enabled: true
377 strategy: ENCRYPT
378 secret_key: secret
Filip Pytloun4a72d792015-10-06 16:28:32 +0200379
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300380Client-side RabbitMQ HA setup:
Jiri Konecnye31f2c52016-04-14 17:16:02 +0200381
382.. code-block:: yaml
383
384 nova:
Kirill Bespalov64617172017-07-11 14:43:14 +0300385 compute:
Jiri Konecnye31f2c52016-04-14 17:16:02 +0200386 ....
387 message_queue:
388 engine: rabbitmq
389 members:
390 - host: 10.0.16.1
391 - host: 10.0.16.2
392 - host: 10.0.16.3
393 user: openstack
394 password: pwd
395 virtual_host: '/openstack'
396 ....
397
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300398Nova with ephemeral configured with Ceph:
maxstack39e6aca2016-05-04 13:50:13 +0000399
400.. code-block:: yaml
401
402 nova:
403 compute:
404 enabled: true
405 ...
406 ceph:
407 ephemeral: yes
408 rbd_pool: nova
409 rbd_user: nova
410 secret_uuid: 03006edd-d957-40a3-ac4c-26cd254b3731
Kalynovskyi0bc79692017-07-21 16:22:09 +0300411 ....
maxstack39e6aca2016-05-04 13:50:13 +0000412
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300413Nova with ephemeral configured with LVM:
Kalynovskyi0bc79692017-07-21 16:22:09 +0300414
415.. code-block:: yaml
416
417 nova:
418 compute:
419 enabled: true
420 ...
421 lvm:
422 ephemeral: yes
423 images_volume_group: nova_vg
424
425 linux:
426 storage:
427 lvm:
428 nova_vg:
429 name: nova_vg
430 devices:
431 - /dev/sdf
432 - /dev/sdd
433 - /dev/sdg
434 - /dev/sde
435 - /dev/sdc
436 - /dev/sdj
437 - /dev/sdh
maxstack39e6aca2016-05-04 13:50:13 +0000438
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300439Enable Barbican integration:
Oleg Iurchenko370c10d2017-10-19 14:03:37 +0300440
441.. code-block:: yaml
442
443 nova:
444 compute:
445 ....
446 barbican:
447 enabled: true
448
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300449Nova metadata custom bindings:
Vasyl Saienko2d591282018-02-05 14:19:02 +0200450
451.. code-block:: yaml
452
453 nova:
454 controller:
455 enabled: true
456 ...
457 metadata:
458 bind:
459 address: 1.2.3.4
460 port: 8776
461
Jiri Broulik0ce9fc92017-02-01 23:10:40 +0100462Client role
463-----------
464
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300465Nova configured with NFS:
Dmitry Stremkovskiy665c7282017-07-05 17:36:27 +0300466
467.. code-block:: yaml
468
469 nova:
470 compute:
471 instances_path: /mnt/nova/instances
472
473 linux:
474 storage:
475 enabled: true
476 mount:
477 nfs_nova:
478 enabled: true
479 path: ${nova:compute:instances_path}
480 device: 172.31.35.145:/data
481 file_system: nfs
482 opts: rw,vers=3
483
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300484Nova flavors:
Jiri Broulik0ce9fc92017-02-01 23:10:40 +0100485
486.. code-block:: yaml
487
488 nova:
489 client:
490 enabled: true
491 server:
492 identity:
493 flavor:
Jiri Broulik70d9e3f2017-02-15 18:37:13 +0100494 flavor1:
Jiri Broulik0ce9fc92017-02-01 23:10:40 +0100495 flavor_id: 10
496 ram: 4096
497 disk: 10
498 vcpus: 1
Jiri Broulik70d9e3f2017-02-15 18:37:13 +0100499 flavor2:
500 flavor_id: auto
501 ram: 4096
502 disk: 20
503 vcpus: 2
Jiri Broulik0ce9fc92017-02-01 23:10:40 +0100504 identity1:
505 flavor:
506 ...
507
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300508Availability zones:
Jiri Broulik70d9e3f2017-02-15 18:37:13 +0100509
510.. code-block:: yaml
511
512 nova:
513 client:
514 enabled: true
515 server:
516 identity:
517 availability_zones:
518 - availability_zone_01
519 - availability_zone_02
520
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300521Aggregates:
Damian Szeluga5dca0f02017-04-13 17:27:15 +0200522
523.. code-block:: yaml
524
525 nova:
526 client:
527 enabled: true
528 server:
529 identity:
530 aggregates:
531 - aggregate1
532 - aggregate2
533
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300534Upgrade levels:
Dmitry Stremkovskiy91f45852017-07-18 16:22:31 +0300535
536.. code-block:: yaml
537
538 nova:
539 controller:
540 upgrade_levels:
541 compute: juno
542
543 nova:
544 compute:
545 upgrade_levels:
546 compute: juno
547
Petr Jedinýd855ef22017-03-06 22:24:33 +0100548SR-IOV
Jakub Pavlik39a05942017-02-13 23:03:08 +0100549------
550
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300551Add ``PciPassthroughFilter`` into scheduler filters and NICs on
552specific compute nodes:
Jakub Pavlik39a05942017-02-13 23:03:08 +0100553
554.. code-block:: yaml
555
556 nova:
557 controller:
558 sriov: true
sandriichenko4fe321d2018-01-22 17:34:06 +0000559 scheduler_default_filters: "DifferentHostFilter,SameHostFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,CoreFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,PciPassthroughFilter"
Jakub Pavlik39a05942017-02-13 23:03:08 +0100560
561 nova:
562 compute:
563 sriov:
564 nic_one:
565 devname: eth1
566 physical_network: physnet1
567
Jakub Pavlik26fb85c2017-02-16 22:29:22 +0100568CPU pinning & Hugepages
569-----------------------
570
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300571CPU pinning of virtual machine instances to dedicated physical
572CPU cores. Hugepages mount point for libvirt.
Jakub Pavlik26fb85c2017-02-16 22:29:22 +0100573
574.. code-block:: yaml
575
576 nova:
577 controller:
sandriichenko4fe321d2018-01-22 17:34:06 +0000578 scheduler_default_filters: "DifferentHostFilter,SameHostFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,CoreFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,NUMATopologyFilter,AggregateInstanceExtraSpecsFilter"
Jakub Pavlik26fb85c2017-02-16 22:29:22 +0100579
580 nova:
581 compute:
582 vcpu_pin_set: 2,3,4,5
583 hugepages:
584 mount_points:
585 - path: /mnt/hugepages_1GB
586 - path: /mnt/hugepages_2MB
Jiri Broulik0ce9fc92017-02-01 23:10:40 +0100587
Michel Nederlof171c7ac2017-04-13 12:54:14 +0200588Custom Scheduler filters
589------------------------
590
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300591If you have a custom filter, that needs to be included in the
592scheduler, then you can include it like so:
Michel Nederlof171c7ac2017-04-13 12:54:14 +0200593
594.. code-block:: yaml
595
596 nova:
597 controller:
598 scheduler_custom_filters:
599 - my_custom_driver.nova.scheduler.filters.my_custom_filter.MyCustomFilter
600
601 # Then add your custom filter on the end (make sure to include all other ones that you need as well)
sandriichenko4fe321d2018-01-22 17:34:06 +0000602 scheduler_default_filters: "DifferentHostFilter,SameHostFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,CoreFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,PciPassthroughFilter,MyCustomFilter"
Michel Nederlof171c7ac2017-04-13 12:54:14 +0200603
Michael Polenchuk2bce2cb2018-09-17 16:05:43 +0400604 # Since Queens version a sequence could be used as well:
605 ~scheduler_default_filters:
606 - DifferentHostFilter
607 - SameHostFilter
608 ...
609 - MyCustomFilter
610
611
Michel Nederlofeb566f62017-04-21 15:37:47 +0200612Hardware Trip/Unmap Support
613---------------------------
614
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300615To enable TRIM support for ephemeral images (thru nova managed
616images), libvirt has this option:
Michel Nederlofeb566f62017-04-21 15:37:47 +0200617
618.. code-block:: yaml
619
620 nova:
621 compute:
622 libvirt:
623 hw_disk_discard: unmap
624
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300625To actually utilize this feature, the following metadata must be
626set on the image as well, so the SCSI unmap is supported:
Michel Nederlofeb566f62017-04-21 15:37:47 +0200627
628.. code-block:: bash
629
630 glance image-update --property hw_scsi_model=virtio-scsi <image>
631 glance image-update --property hw_disk_bus=scsi <image>
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +0100632
Thom Gerdesf582f1e2017-05-02 18:05:50 +0000633Scheduler Host Manager
634----------------------
635
636Specify a custom host manager.
637
Thom Gerdesec00afd2017-04-07 18:06:59 +0000638libvirt CPU mode
639----------------
640
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300641Allow setting the model of CPU that is exposed to a VM. This
642allows for better support live migration between hypervisors with
643different hardware, among other things. Defaults to host-passthrough.
Jakub Pavlik7046b9c2017-09-19 12:04:19 +0200644
Thom Gerdesf582f1e2017-05-02 18:05:50 +0000645.. code-block:: yaml
646
647 nova:
648 controller:
649 scheduler_host_manager: ironic_host_manager
650
Thom Gerdesec00afd2017-04-07 18:06:59 +0000651 compute:
652 cpu_mode: host-model
653
Dzmitry Stremkouski7da9bf12018-04-25 22:30:37 +0200654Nova compute cpu model
655----------------------
656
657.. code-block:: yaml
658
659 nova:
660 compute:
661 cpu_mode: custom
662 libvirt:
663 cpu_model: IvyBridge
664
665
Michel Nederloff7eefb22017-07-10 11:14:33 +0200666Nova compute workarounds
667------------------------
668
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300669Live snapshotting is disabled by default in nova. To enable
670this, it needs a manual switch.
Michel Nederloff7eefb22017-07-10 11:14:33 +0200671
672From manual:
673
674.. code-block:: yaml
675
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300676 When using libvirt 1.2.2 live snapshots fail intermittently under load
677 (likely related to concurrent libvirt/qemu operations). This config
678 option provides a mechanism to disable live snapshot, in favor of cold
679 snapshot, while this is resolved. Cold snapshot causes an instance
680 outage while the guest is going through the snapshotting process.
681
682 For more information, refer to the bug report:
683
684 https://bugs.launchpad.net/nova/+bug/1334398
Michel Nederloff7eefb22017-07-10 11:14:33 +0200685
686Configurable pillar data:
687
688.. code-block:: yaml
689
690 nova:
691 compute:
Michel Nederlofe322ebb2017-07-10 12:29:21 +0200692 workaround:
Michel Nederloff7eefb22017-07-10 11:14:33 +0200693 disable_libvirt_livesnapshot: False
694
Michel Nederlofb51a5142017-06-27 08:31:35 +0200695Config drive options
696--------------------
697
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300698See example below on how to configure the options for the
699config drive:
Michel Nederlofb51a5142017-06-27 08:31:35 +0200700
701.. code-block:: yaml
702
703 nova:
704 compute:
705 config_drive:
706 forced: True # Default: True
707 cdrom: True # Default: False
708 format: iso9660 # Default: vfat
709 inject_password: False # Default: False
710
Michel Nederloff81919b2017-11-20 09:37:07 +0100711Number of concurrent live migrates
712----------------------------------
713
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300714Default is to have no concurrent live migrations (so 1
715live-migration at a time).
Michel Nederloff81919b2017-11-20 09:37:07 +0100716
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300717Excerpt from config options page
718https://docs.openstack.org/ocata/config-reference/compute/config-options.html:
Michel Nederloff81919b2017-11-20 09:37:07 +0100719
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300720Maximum number of live migrations to run concurrently. This limit is
721enforced to avoid outbound live migrations overwhelming the host/network
722and causing failures. It is not recommended that you change this unless
723you are very sure that doing so is safe and stable in your environment.
Michel Nederloff81919b2017-11-20 09:37:07 +0100724
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300725Possible values:
Michel Nederloff81919b2017-11-20 09:37:07 +0100726
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300727- 0 : treated as unlimited.
728- Negative value defaults to 0.
729- Any positive integer representing maximum number of live migrations
730 to run concurrently.
Michel Nederloff81919b2017-11-20 09:37:07 +0100731
732To configure this option:
733
734.. code-block:: yaml
735
736 nova:
737 compute:
738 max_concurrent_live_migrations: 1 # (1 is the default)
739
Sergio Lystopad9d31cba2018-05-15 11:29:11 +0300740Live migration with auto converge
741----------------------------------
742
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300743Auto converge throttles down CPU if a progress of on-going live
744migration is slow
745https://docs.openstack.org/ocata/config-reference/compute/config-options.html:
Sergio Lystopad9d31cba2018-05-15 11:29:11 +0300746
747.. code-block:: yaml
748
749 nova:
750 compute:
751 libvirt:
752 live_migration_permit_auto_converge: False # (False is the default)
753
754.. code-block:: yaml
755
756 nova:
757 controller:
758 libvirt:
759 live_migration_permit_auto_converge: False # (False is the default)
760
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400761Enhanced logging with logging.conf
762----------------------------------
763
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300764By default ``logging.conf`` is disabled.
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400765
766That is possible to enable per-binary logging.conf with new variables:
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400767
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300768* ``openstack_log_appender``
769 Set to true to enable log_config_append for all OpenStack services
770
771* ``openstack_fluentd_handler_enabled``
772 Set to true to enable FluentHandler for all Openstack services
773
774* ``openstack_ossyslog_handler_enabled``
775 Set to true to enable OSSysLogHandler for all Openstack services
776
777Only ``WatchedFileHandler``, ``OSSysLogHandler``, and ``FluentHandler``
778are available.
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400779
Dmitry Kalashnik8da249c2018-01-16 17:58:00 +0400780Also it is possible to configure this with pillar:
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400781
782.. code-block:: yaml
783
784 nova:
785 controller:
786 logging:
787 log_appender: true
788 log_handlers:
789 watchedfile:
790 enabled: true
791 fluentd:
792 enabled: true
Oleksii Chupryn99e35032018-02-06 01:59:40 +0200793 ossyslog:
794 enabled: true
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400795
796 compute:
797 logging:
798 log_appender: true
799 log_handlers:
800 watchedfile:
801 enabled: true
802 fluentd:
803 enabled: true
Oleksii Chupryn99e35032018-02-06 01:59:40 +0200804 ossyslog:
805 enabled: true
Thom Gerdesf582f1e2017-05-02 18:05:50 +0000806
Vasyl Saienko7243a952018-05-11 21:26:54 +0300807The log level might be configured per logger by using the
808following pillar structure:
809
810.. code-block:: yaml
811
812 nova:
813 compute:
814 logging:
815 loggers:
816 <logger_name>:
817 level: WARNING
818
819 nova:
820 compute:
821 logging:
822 loggers:
823 <logger_name>:
824 level: WARNING
825
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000826Configure syslog parameters for libvirtd
827----------------------------------------
828
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300829To configure syslog parameters for libvirtd the below pillar
830structure should be used with values which are supported
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000831by libvirtd. These values might be known from the documentation.
832
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300833.. code-block:: yaml
834
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000835 nova:
836 compute:
837 libvirt:
838 logging:
839 level: 3
840 filters: '3:remote 4:event'
841 outputs: '3:syslog:libvirtd'
842 buffer_size: 64
843
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300844Logging controls:
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000845
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300846Logging level: 4 errors, 3 warnings, 2 information, 1 debug
847basically 1 will log everything possible ``log_level = 3``
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000848
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300849Logging filters:
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000850
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300851A filter allows to select a different logging level for a given category
852of logs.
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000853
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300854The format for a filter is one of:
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000855
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300856* ``x:name``
857* ``x:+name``
858 where name is a string which is matched against source file name,
859 e.g., ``remote``, ``qemu``, or ``util/json``, the optional ``+`` prefix
860 tells libvirt to log stack trace for each message matching name,
861 and x is the minimal level where matching messages should be logged:
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000862
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300863* ``1: DEBUG``
864* ``2: INFO``
865* ``3: WARNING``
866* ``4: ERROR``
867
868Multiple filter can be defined in a single @filters, they just
869need to be separated by spaces.
870
871For example, to only get warning or errors from the remote layer
872and only errors from the event layer: ``log_filters="3:remote 4:event``
873
874Logging outputs:
875
876An output is one of the places to save logging information
877The format for an output can be:
878
879* ``x:stderr``
880 Output goes to stderr
881
882* ``x:syslog:name``
883 Use syslog for the output and use the given name as the ident
884
885* ``x:file:file_path``
886 output to a file, with the given filepath
887
888 In all case the x prefix is the minimal level, acting as a filter
889
890* ``1: DEBUG``
891* ``2: INFO``
892* ``3: WARNING``
893* ``4: ERROR``
894
895Multiple output can be defined, they just need to be separated by spaces.
896For example, to log all warnings and errors to syslog under the libvirt
897dident: ``log_outputs="3:syslog:libvirtd``
898
899Log debug buffer size: default 64
900The daemon keeps an internal debug log buffer which will be dumped
901in case of crash or upon receiving a ``SIGUSR2`` signal. This setting
902allows to override the default buffer size in kilobytes.
903If value is ``0`` or less the debug log buffer is deactivated
904``log_buffer_size = 64``
905
906To configure the logging parameters for QEMU, the below pillar
907structure and logging parameters should be used:
908
909.. code-block:: yaml
910
911 nova:
912 compute:
913 qemu:
914 logging:
915 handler: logd
916 virtlog:
917 enabled: true
918 level: 4
919 filters: '3:remote 3:event'
920 outputs: '4:syslog:virtlogd'
921 max_clients: 512
922 max_size: 2097100
923 max_backups: 2
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000924
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300925Inject password to VM
926---------------------
927
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300928By default nova blocks up any inject to VM because
929``inject_partition`` param is equal to ``-2``.
930If you want to inject password to VM, you will need to
931define ``inject_partition`` greater or equal to ``-1`` and
932define ``inject_password`` to ``True``
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300933
934For example:
935
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300936.. code-block:: yaml
937
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300938 nova:
939 compute:
940 inject_partition: '-1'
941 inject_password: True
942
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300943Allow the injection of an admin password for instance only at
944``create`` and ``rebuild`` process.
945
946There is no agent needed within the image to do this. If *libguestfs* is
947available on the host, it will be used. Otherwise *nbd* is used. The file
948system of the image will be mounted and the admin password, which is provided
949in the REST API call will be injected as password for the root user. If no
950root user is available, the instance won't be launched and an error is thrown.
951Be aware that the injection is *not* possible when the instance gets launched
952from a volume.
953
954Possible values:
955
956* ``True``
957 Allows the injection
958
959* ``False`` (default)
960 Disallows the injection. Any via the REST API provided
961 admin password will be silently ignored.
962
963Related options:
964
965* ``inject_partition``
966 Decides about the discovery and usage of the file system.
967 It also can disable the injection at all.
968 (boolean value)
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300969
970You can read more about injecting the administrator password here:
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300971https://docs.openstack.org/nova/queens/admin/admin-password-injection.html
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300972
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +0300973Enable libvirt control channel over TLS
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300974---------------------------------------
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +0300975
976By default TLS is disabled.
977
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300978Enable TLS transport:
979
980.. code-block:: yaml
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +0300981
982 compute:
983 libvirt:
984 tls:
985 enabled: True
986
987You able to set custom certificates in pillar:
988
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300989.. code-block:: yaml
990
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +0300991 nova:
992 compute:
993 libvirt:
994 tls:
995 key: (certificate content)
996 cert: (certificate content)
997 cacert: (certificate content)
998 client:
999 key: (certificate content)
1000 cert: (certificate content)
1001
Vasyl Saienko11ac9732018-10-02 17:04:33 +00001002Controlling access by `tls_allowed_dn_list`.
1003Enable an access control list of client certificate Distinguished Names (DNs)
1004which can connect to the TLS port on this server. The default is that DNs are
1005not checked. This list may contain wildcards such as
1006"C=GB,ST=London,L=London,O=Libvirt Project,CN=*" See the POSIX fnmatch function
1007for the format of the wildcards.
1008Note that if this is an empty list, no client can connect.
1009Note also that GnuTLS returns DNs without spaces after commas between
1010the fields (and this is what we check against), but the openssl x509 tool
1011shows spaces.
1012
1013.. code-block:: yaml
1014
1015 nova:
1016 compute:
1017 libvirt:
1018 tls:
1019 tls_allowed_dn_list:
1020 host1:
1021 enabled: true
1022 value: 'C=foo,CN=cmp1'
1023 host2:
1024 enabled: true
1025 value: 'C=foo,CN=cmp2'
1026
1027
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +03001028You can read more about live migration over TLS here:
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001029https://wiki.libvirt.org/page/TLSCreateServerCerts
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +03001030
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001031Enable transport + authentication for VNC over TLS
1032---------------------
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001033# Only for Queens. Communication between noVNC proxy service and QEMU
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001034
1035By default communication between nova-novncproxy and qemu service is unsecure.
1036
1037compute:
1038 qemu:
1039 vnc:
1040 tls:
1041 enabled: True
1042
1043controller:
1044 novncproxy:
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001045 # This section responsible for communication between noVNC proxy and client machine
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001046 tls:
1047 enabled: True
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001048 # This section responsible for communication between nova-novncproxy and qemu service
1049 vencrypt:
1050 tls:
1051 enabled: True
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001052
1053You able to set custom certificates in pillar:
1054
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001055nova:
1056 compute:
1057 qemu:
1058 vnc:
1059 tls:
1060 cacert (certificate content)
1061 cert (certificate content)
1062 key (certificate content)
1063
1064nova:
1065 controller:
1066 novncproxy:
1067 tls:
1068 server:
1069 cert (certificate content)
1070 key (certificate content)
1071 vencrypt:
1072 tls:
1073 cacert (certificate content)
1074 cert (certificate content)
1075 key (certificate content)
1076
1077
1078You can read more about it here:
1079 https://docs.openstack.org/nova/queens/admin/remote-console-access.html
1080
1081Enable communication between noVNC proxy and client machine over TLS
1082---------------------
1083
1084By default communication between noVNC proxy and client machine is unsecure.
1085
1086 controller:
1087 novncproxy:
1088 tls:
1089 enabled: True
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001090
1091 nova:
1092 controller:
1093 novncproxy:
1094 tls:
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001095 server:
1096 cert (certificate content)
1097 key (certificate content)
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001098
1099You can read more about it here:
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001100 https://docs.openstack.org/mitaka/config-reference/dashboard/configure.html
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001101
Oleksandr Shyshko55eeac72018-08-03 18:23:28 +03001102Enable x509 and ssl communication between Nova and Galera cluster.
1103---------------------
1104By default communication between Nova and Galera is unsecure.
1105
Oleksandr Shyshkocbe87352018-09-07 13:42:57 +03001106nova:
1107 controller:
1108 database:
1109 x509:
1110 enabled: True
1111
Oleksandr Shyshko55eeac72018-08-03 18:23:28 +03001112You able to set custom certificates in pillar:
Oleksandr Shyshko55eeac72018-08-03 18:23:28 +03001113
1114nova:
1115 controller:
1116 database:
1117 x509:
Oleksandr Shyshkocbe87352018-09-07 13:42:57 +03001118 cacert: (certificate content)
1119 cert: (certificate content)
1120 key: (certificate content)
Oleksandr Shyshko55eeac72018-08-03 18:23:28 +03001121
1122You can read more about it here:
1123 https://docs.openstack.org/security-guide/databases/database-access-control.html
1124
Oleh Hryhorov63ee8452018-08-14 09:16:02 +00001125Upgrades
1126========
1127
1128Each openstack formula provide set of phases (logical bloks) that will help to
1129build flexible upgrade orchestration logic for particular components. The list
1130of phases might and theirs descriptions are listed in table below:
1131
1132+-------------------------------+------------------------------------------------------+
1133| State | Description |
1134+===============================+======================================================+
1135| <app>.upgrade.service_running | Ensure that all services for particular application |
1136| | are enabled for autostart and running |
1137+-------------------------------+------------------------------------------------------+
1138| <app>.upgrade.service_stopped | Ensure that all services for particular application |
1139| | disabled for autostart and dead |
1140+-------------------------------+------------------------------------------------------+
1141| <app>.upgrade.pkgs_latest | Ensure that packages used by particular application |
1142| | are installed to latest available version. |
1143| | This will not upgrade data plane packages like qemu |
1144| | and openvswitch as usually minimal required version |
1145| | in openstack services is really old. The data plane |
1146| | packages should be upgraded separately by `apt-get |
1147| | upgrade` or `apt-get dist-upgrade` |
1148| | Applying this state will not autostart service. |
1149+-------------------------------+------------------------------------------------------+
1150| <app>.upgrade.render_config | Ensure configuration is rendered actual version. +
1151+-------------------------------+------------------------------------------------------+
1152| <app>.upgrade.pre | We assume this state is applied on all nodes in the |
1153| | cloud before running upgrade. |
1154| | Only non destructive actions will be applied during |
1155| | this phase. Perform service built in service check |
1156| | like (keystone-manage doctor and nova-status upgrade)|
1157+-------------------------------+------------------------------------------------------+
1158| <app>.upgrade.upgrade.pre | Mostly applicable for data plane nodes. During this |
1159| | phase resources will be gracefully removed from |
1160| | current node if it is allowed. Services for upgraded |
1161| | application will be set to admin disabled state to |
1162| | make sure node will not participate in resources |
1163| | scheduling. For example on gtw nodes this will set |
1164| | all agents to admin disable state and will move all |
1165| | routers to other agents. |
1166+-------------------------------+------------------------------------------------------+
1167| <app>.upgrade.upgrade | This state will basically upgrade application on |
1168| | particular target. Stop services, render |
1169| | configuration, install new packages, run offline |
1170| | dbsync (for ctl), start services. Data plane should |
1171| | not be affected, only OpenStack python services. |
1172+-------------------------------+------------------------------------------------------+
1173| <app>.upgrade.upgrade.post | Add services back to scheduling. |
1174+-------------------------------+------------------------------------------------------+
1175| <app>.upgrade.post | This phase should be launched only when upgrade of |
1176| | the cloud is completed. Cleanup temporary files, |
1177| | perform other post upgrade tasks. |
1178+-------------------------------+------------------------------------------------------+
1179| <app>.upgrade.verify | Here we will do basic health checks (API CRUD |
1180| | operations, verify do not have dead network |
1181| | agents/compute services) |
1182+-------------------------------+------------------------------------------------------+
1183
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001184Documentation and Bugs
1185======================
1186
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001187* http://salt-formulas.readthedocs.io/
1188 Learn how to install and update salt-formulas
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001189
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001190* https://github.com/salt-formulas/salt-formula-nova/issues
1191 In the unfortunate event that bugs are discovered, report the issue to the
1192 appropriate issue tracker. Use the Github issue tracker for a specific salt
1193 formula
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001194
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001195* https://launchpad.net/salt-formulas
1196 For feature requests, bug reports, or blueprints affecting the entire
1197 ecosystem, use the Launchpad salt-formulas project
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001198
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001199* https://launchpad.net/~salt-formulas-users
1200 Join the salt-formulas-users team and subscribe to mailing list if required
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001201
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001202* https://github.com/salt-formulas/salt-formula-nova
1203 Develop the salt-formulas projects in the master branch and then submit pull
1204 requests against a specific formula
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001205
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001206* #salt-formulas @ irc.freenode.net
1207 Use this IRC channel in case of any questions or feedback which is always
1208 welcome