blob: 98806c044070fb1027c1e312a15771583fe95879 [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
Michel Nederlofeb566f62017-04-21 15:37:47 +0200604Hardware Trip/Unmap Support
605---------------------------
606
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300607To enable TRIM support for ephemeral images (thru nova managed
608images), libvirt has this option:
Michel Nederlofeb566f62017-04-21 15:37:47 +0200609
610.. code-block:: yaml
611
612 nova:
613 compute:
614 libvirt:
615 hw_disk_discard: unmap
616
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300617To actually utilize this feature, the following metadata must be
618set on the image as well, so the SCSI unmap is supported:
Michel Nederlofeb566f62017-04-21 15:37:47 +0200619
620.. code-block:: bash
621
622 glance image-update --property hw_scsi_model=virtio-scsi <image>
623 glance image-update --property hw_disk_bus=scsi <image>
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +0100624
Thom Gerdesf582f1e2017-05-02 18:05:50 +0000625Scheduler Host Manager
626----------------------
627
628Specify a custom host manager.
629
Thom Gerdesec00afd2017-04-07 18:06:59 +0000630libvirt CPU mode
631----------------
632
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300633Allow setting the model of CPU that is exposed to a VM. This
634allows for better support live migration between hypervisors with
635different hardware, among other things. Defaults to host-passthrough.
Jakub Pavlik7046b9c2017-09-19 12:04:19 +0200636
Thom Gerdesf582f1e2017-05-02 18:05:50 +0000637.. code-block:: yaml
638
639 nova:
640 controller:
641 scheduler_host_manager: ironic_host_manager
642
Thom Gerdesec00afd2017-04-07 18:06:59 +0000643 compute:
644 cpu_mode: host-model
645
Dzmitry Stremkouski7da9bf12018-04-25 22:30:37 +0200646Nova compute cpu model
647----------------------
648
649.. code-block:: yaml
650
651 nova:
652 compute:
653 cpu_mode: custom
654 libvirt:
655 cpu_model: IvyBridge
656
657
Michel Nederloff7eefb22017-07-10 11:14:33 +0200658Nova compute workarounds
659------------------------
660
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300661Live snapshotting is disabled by default in nova. To enable
662this, it needs a manual switch.
Michel Nederloff7eefb22017-07-10 11:14:33 +0200663
664From manual:
665
666.. code-block:: yaml
667
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300668 When using libvirt 1.2.2 live snapshots fail intermittently under load
669 (likely related to concurrent libvirt/qemu operations). This config
670 option provides a mechanism to disable live snapshot, in favor of cold
671 snapshot, while this is resolved. Cold snapshot causes an instance
672 outage while the guest is going through the snapshotting process.
673
674 For more information, refer to the bug report:
675
676 https://bugs.launchpad.net/nova/+bug/1334398
Michel Nederloff7eefb22017-07-10 11:14:33 +0200677
678Configurable pillar data:
679
680.. code-block:: yaml
681
682 nova:
683 compute:
Michel Nederlofe322ebb2017-07-10 12:29:21 +0200684 workaround:
Michel Nederloff7eefb22017-07-10 11:14:33 +0200685 disable_libvirt_livesnapshot: False
686
Michel Nederlofb51a5142017-06-27 08:31:35 +0200687Config drive options
688--------------------
689
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300690See example below on how to configure the options for the
691config drive:
Michel Nederlofb51a5142017-06-27 08:31:35 +0200692
693.. code-block:: yaml
694
695 nova:
696 compute:
697 config_drive:
698 forced: True # Default: True
699 cdrom: True # Default: False
700 format: iso9660 # Default: vfat
701 inject_password: False # Default: False
702
Michel Nederloff81919b2017-11-20 09:37:07 +0100703Number of concurrent live migrates
704----------------------------------
705
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300706Default is to have no concurrent live migrations (so 1
707live-migration at a time).
Michel Nederloff81919b2017-11-20 09:37:07 +0100708
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300709Excerpt from config options page
710https://docs.openstack.org/ocata/config-reference/compute/config-options.html:
Michel Nederloff81919b2017-11-20 09:37:07 +0100711
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300712Maximum number of live migrations to run concurrently. This limit is
713enforced to avoid outbound live migrations overwhelming the host/network
714and causing failures. It is not recommended that you change this unless
715you are very sure that doing so is safe and stable in your environment.
Michel Nederloff81919b2017-11-20 09:37:07 +0100716
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300717Possible values:
Michel Nederloff81919b2017-11-20 09:37:07 +0100718
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300719- 0 : treated as unlimited.
720- Negative value defaults to 0.
721- Any positive integer representing maximum number of live migrations
722 to run concurrently.
Michel Nederloff81919b2017-11-20 09:37:07 +0100723
724To configure this option:
725
726.. code-block:: yaml
727
728 nova:
729 compute:
730 max_concurrent_live_migrations: 1 # (1 is the default)
731
Sergio Lystopad9d31cba2018-05-15 11:29:11 +0300732Live migration with auto converge
733----------------------------------
734
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300735Auto converge throttles down CPU if a progress of on-going live
736migration is slow
737https://docs.openstack.org/ocata/config-reference/compute/config-options.html:
Sergio Lystopad9d31cba2018-05-15 11:29:11 +0300738
739.. code-block:: yaml
740
741 nova:
742 compute:
743 libvirt:
744 live_migration_permit_auto_converge: False # (False is the default)
745
746.. code-block:: yaml
747
748 nova:
749 controller:
750 libvirt:
751 live_migration_permit_auto_converge: False # (False is the default)
752
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400753Enhanced logging with logging.conf
754----------------------------------
755
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300756By default ``logging.conf`` is disabled.
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400757
758That is possible to enable per-binary logging.conf with new variables:
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400759
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300760* ``openstack_log_appender``
761 Set to true to enable log_config_append for all OpenStack services
762
763* ``openstack_fluentd_handler_enabled``
764 Set to true to enable FluentHandler for all Openstack services
765
766* ``openstack_ossyslog_handler_enabled``
767 Set to true to enable OSSysLogHandler for all Openstack services
768
769Only ``WatchedFileHandler``, ``OSSysLogHandler``, and ``FluentHandler``
770are available.
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400771
Dmitry Kalashnik8da249c2018-01-16 17:58:00 +0400772Also it is possible to configure this with pillar:
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400773
774.. code-block:: yaml
775
776 nova:
777 controller:
778 logging:
779 log_appender: true
780 log_handlers:
781 watchedfile:
782 enabled: true
783 fluentd:
784 enabled: true
Oleksii Chupryn99e35032018-02-06 01:59:40 +0200785 ossyslog:
786 enabled: true
Dmitry Kalashnike58fe082017-12-01 16:31:14 +0400787
788 compute:
789 logging:
790 log_appender: true
791 log_handlers:
792 watchedfile:
793 enabled: true
794 fluentd:
795 enabled: true
Oleksii Chupryn99e35032018-02-06 01:59:40 +0200796 ossyslog:
797 enabled: true
Thom Gerdesf582f1e2017-05-02 18:05:50 +0000798
Vasyl Saienko7243a952018-05-11 21:26:54 +0300799The log level might be configured per logger by using the
800following pillar structure:
801
802.. code-block:: yaml
803
804 nova:
805 compute:
806 logging:
807 loggers:
808 <logger_name>:
809 level: WARNING
810
811 nova:
812 compute:
813 logging:
814 loggers:
815 <logger_name>:
816 level: WARNING
817
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000818Configure syslog parameters for libvirtd
819----------------------------------------
820
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300821To configure syslog parameters for libvirtd the below pillar
822structure should be used with values which are supported
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000823by libvirtd. These values might be known from the documentation.
824
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300825.. code-block:: yaml
826
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000827 nova:
828 compute:
829 libvirt:
830 logging:
831 level: 3
832 filters: '3:remote 4:event'
833 outputs: '3:syslog:libvirtd'
834 buffer_size: 64
835
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300836Logging controls:
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000837
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300838Logging level: 4 errors, 3 warnings, 2 information, 1 debug
839basically 1 will log everything possible ``log_level = 3``
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000840
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300841Logging filters:
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000842
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300843A filter allows to select a different logging level for a given category
844of logs.
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000845
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300846The format for a filter is one of:
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000847
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300848* ``x:name``
849* ``x:+name``
850 where name is a string which is matched against source file name,
851 e.g., ``remote``, ``qemu``, or ``util/json``, the optional ``+`` prefix
852 tells libvirt to log stack trace for each message matching name,
853 and x is the minimal level where matching messages should be logged:
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000854
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300855* ``1: DEBUG``
856* ``2: INFO``
857* ``3: WARNING``
858* ``4: ERROR``
859
860Multiple filter can be defined in a single @filters, they just
861need to be separated by spaces.
862
863For example, to only get warning or errors from the remote layer
864and only errors from the event layer: ``log_filters="3:remote 4:event``
865
866Logging outputs:
867
868An output is one of the places to save logging information
869The format for an output can be:
870
871* ``x:stderr``
872 Output goes to stderr
873
874* ``x:syslog:name``
875 Use syslog for the output and use the given name as the ident
876
877* ``x:file:file_path``
878 output to a file, with the given filepath
879
880 In all case the x prefix is the minimal level, acting as a filter
881
882* ``1: DEBUG``
883* ``2: INFO``
884* ``3: WARNING``
885* ``4: ERROR``
886
887Multiple output can be defined, they just need to be separated by spaces.
888For example, to log all warnings and errors to syslog under the libvirt
889dident: ``log_outputs="3:syslog:libvirtd``
890
891Log debug buffer size: default 64
892The daemon keeps an internal debug log buffer which will be dumped
893in case of crash or upon receiving a ``SIGUSR2`` signal. This setting
894allows to override the default buffer size in kilobytes.
895If value is ``0`` or less the debug log buffer is deactivated
896``log_buffer_size = 64``
897
898To configure the logging parameters for QEMU, the below pillar
899structure and logging parameters should be used:
900
901.. code-block:: yaml
902
903 nova:
904 compute:
905 qemu:
906 logging:
907 handler: logd
908 virtlog:
909 enabled: true
910 level: 4
911 filters: '3:remote 3:event'
912 outputs: '4:syslog:virtlogd'
913 max_clients: 512
914 max_size: 2097100
915 max_backups: 2
Oleh Hryhorove38525d2018-05-15 08:58:59 +0000916
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300917Inject password to VM
918---------------------
919
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300920By default nova blocks up any inject to VM because
921``inject_partition`` param is equal to ``-2``.
922If you want to inject password to VM, you will need to
923define ``inject_partition`` greater or equal to ``-1`` and
924define ``inject_password`` to ``True``
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300925
926For example:
927
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300928.. code-block:: yaml
929
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300930 nova:
931 compute:
932 inject_partition: '-1'
933 inject_password: True
934
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300935Allow the injection of an admin password for instance only at
936``create`` and ``rebuild`` process.
937
938There is no agent needed within the image to do this. If *libguestfs* is
939available on the host, it will be used. Otherwise *nbd* is used. The file
940system of the image will be mounted and the admin password, which is provided
941in the REST API call will be injected as password for the root user. If no
942root user is available, the instance won't be launched and an error is thrown.
943Be aware that the injection is *not* possible when the instance gets launched
944from a volume.
945
946Possible values:
947
948* ``True``
949 Allows the injection
950
951* ``False`` (default)
952 Disallows the injection. Any via the REST API provided
953 admin password will be silently ignored.
954
955Related options:
956
957* ``inject_partition``
958 Decides about the discovery and usage of the file system.
959 It also can disable the injection at all.
960 (boolean value)
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300961
962You can read more about injecting the administrator password here:
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300963https://docs.openstack.org/nova/queens/admin/admin-password-injection.html
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +0300964
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +0300965Enable libvirt control channel over TLS
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300966---------------------------------------
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +0300967
968By default TLS is disabled.
969
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300970Enable TLS transport:
971
972.. code-block:: yaml
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +0300973
974 compute:
975 libvirt:
976 tls:
977 enabled: True
978
979You able to set custom certificates in pillar:
980
OlgaGusarenko9dd01c92018-07-31 00:49:30 +0300981.. code-block:: yaml
982
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +0300983 nova:
984 compute:
985 libvirt:
986 tls:
987 key: (certificate content)
988 cert: (certificate content)
989 cacert: (certificate content)
990 client:
991 key: (certificate content)
992 cert: (certificate content)
993
Vasyl Saienko11ac9732018-10-02 17:04:33 +0000994Controlling access by `tls_allowed_dn_list`.
995Enable an access control list of client certificate Distinguished Names (DNs)
996which can connect to the TLS port on this server. The default is that DNs are
997not checked. This list may contain wildcards such as
998"C=GB,ST=London,L=London,O=Libvirt Project,CN=*" See the POSIX fnmatch function
999for the format of the wildcards.
1000Note that if this is an empty list, no client can connect.
1001Note also that GnuTLS returns DNs without spaces after commas between
1002the fields (and this is what we check against), but the openssl x509 tool
1003shows spaces.
1004
1005.. code-block:: yaml
1006
1007 nova:
1008 compute:
1009 libvirt:
1010 tls:
1011 tls_allowed_dn_list:
1012 host1:
1013 enabled: true
1014 value: 'C=foo,CN=cmp1'
1015 host2:
1016 enabled: true
1017 value: 'C=foo,CN=cmp2'
1018
1019
Oleksandr Shyshko1c020d12018-05-24 12:47:08 +03001020You can read more about live migration over TLS here:
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001021https://wiki.libvirt.org/page/TLSCreateServerCerts
Oleksandr Shyshko981b4fa2018-05-02 15:39:30 +03001022
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001023Enable transport + authentication for VNC over TLS
1024---------------------
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001025# Only for Queens. Communication between noVNC proxy service and QEMU
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001026
1027By default communication between nova-novncproxy and qemu service is unsecure.
1028
1029compute:
1030 qemu:
1031 vnc:
1032 tls:
1033 enabled: True
1034
1035controller:
1036 novncproxy:
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001037 # This section responsible for communication between noVNC proxy and client machine
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001038 tls:
1039 enabled: True
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001040 # This section responsible for communication between nova-novncproxy and qemu service
1041 vencrypt:
1042 tls:
1043 enabled: True
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001044
1045You able to set custom certificates in pillar:
1046
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001047nova:
1048 compute:
1049 qemu:
1050 vnc:
1051 tls:
1052 cacert (certificate content)
1053 cert (certificate content)
1054 key (certificate content)
1055
1056nova:
1057 controller:
1058 novncproxy:
1059 tls:
1060 server:
1061 cert (certificate content)
1062 key (certificate content)
1063 vencrypt:
1064 tls:
1065 cacert (certificate content)
1066 cert (certificate content)
1067 key (certificate content)
1068
1069
1070You can read more about it here:
1071 https://docs.openstack.org/nova/queens/admin/remote-console-access.html
1072
1073Enable communication between noVNC proxy and client machine over TLS
1074---------------------
1075
1076By default communication between noVNC proxy and client machine is unsecure.
1077
1078 controller:
1079 novncproxy:
1080 tls:
1081 enabled: True
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001082
1083 nova:
1084 controller:
1085 novncproxy:
1086 tls:
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001087 server:
1088 cert (certificate content)
1089 key (certificate content)
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001090
1091You can read more about it here:
Oleksandr Shyshkod8337cf2018-07-11 17:55:58 +03001092 https://docs.openstack.org/mitaka/config-reference/dashboard/configure.html
Oleksandr Shyshko1195fca2018-07-09 18:22:59 +03001093
Oleksandr Shyshko55eeac72018-08-03 18:23:28 +03001094Enable x509 and ssl communication between Nova and Galera cluster.
1095---------------------
1096By default communication between Nova and Galera is unsecure.
1097
Oleksandr Shyshkocbe87352018-09-07 13:42:57 +03001098nova:
1099 controller:
1100 database:
1101 x509:
1102 enabled: True
1103
Oleksandr Shyshko55eeac72018-08-03 18:23:28 +03001104You able to set custom certificates in pillar:
Oleksandr Shyshko55eeac72018-08-03 18:23:28 +03001105
1106nova:
1107 controller:
1108 database:
1109 x509:
Oleksandr Shyshkocbe87352018-09-07 13:42:57 +03001110 cacert: (certificate content)
1111 cert: (certificate content)
1112 key: (certificate content)
Oleksandr Shyshko55eeac72018-08-03 18:23:28 +03001113
1114You can read more about it here:
1115 https://docs.openstack.org/security-guide/databases/database-access-control.html
1116
Oleh Hryhorov63ee8452018-08-14 09:16:02 +00001117Upgrades
1118========
1119
1120Each openstack formula provide set of phases (logical bloks) that will help to
1121build flexible upgrade orchestration logic for particular components. The list
1122of phases might and theirs descriptions are listed in table below:
1123
1124+-------------------------------+------------------------------------------------------+
1125| State | Description |
1126+===============================+======================================================+
1127| <app>.upgrade.service_running | Ensure that all services for particular application |
1128| | are enabled for autostart and running |
1129+-------------------------------+------------------------------------------------------+
1130| <app>.upgrade.service_stopped | Ensure that all services for particular application |
1131| | disabled for autostart and dead |
1132+-------------------------------+------------------------------------------------------+
1133| <app>.upgrade.pkgs_latest | Ensure that packages used by particular application |
1134| | are installed to latest available version. |
1135| | This will not upgrade data plane packages like qemu |
1136| | and openvswitch as usually minimal required version |
1137| | in openstack services is really old. The data plane |
1138| | packages should be upgraded separately by `apt-get |
1139| | upgrade` or `apt-get dist-upgrade` |
1140| | Applying this state will not autostart service. |
1141+-------------------------------+------------------------------------------------------+
1142| <app>.upgrade.render_config | Ensure configuration is rendered actual version. +
1143+-------------------------------+------------------------------------------------------+
1144| <app>.upgrade.pre | We assume this state is applied on all nodes in the |
1145| | cloud before running upgrade. |
1146| | Only non destructive actions will be applied during |
1147| | this phase. Perform service built in service check |
1148| | like (keystone-manage doctor and nova-status upgrade)|
1149+-------------------------------+------------------------------------------------------+
1150| <app>.upgrade.upgrade.pre | Mostly applicable for data plane nodes. During this |
1151| | phase resources will be gracefully removed from |
1152| | current node if it is allowed. Services for upgraded |
1153| | application will be set to admin disabled state to |
1154| | make sure node will not participate in resources |
1155| | scheduling. For example on gtw nodes this will set |
1156| | all agents to admin disable state and will move all |
1157| | routers to other agents. |
1158+-------------------------------+------------------------------------------------------+
1159| <app>.upgrade.upgrade | This state will basically upgrade application on |
1160| | particular target. Stop services, render |
1161| | configuration, install new packages, run offline |
1162| | dbsync (for ctl), start services. Data plane should |
1163| | not be affected, only OpenStack python services. |
1164+-------------------------------+------------------------------------------------------+
1165| <app>.upgrade.upgrade.post | Add services back to scheduling. |
1166+-------------------------------+------------------------------------------------------+
1167| <app>.upgrade.post | This phase should be launched only when upgrade of |
1168| | the cloud is completed. Cleanup temporary files, |
1169| | perform other post upgrade tasks. |
1170+-------------------------------+------------------------------------------------------+
1171| <app>.upgrade.verify | Here we will do basic health checks (API CRUD |
1172| | operations, verify do not have dead network |
1173| | agents/compute services) |
1174+-------------------------------+------------------------------------------------------+
1175
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001176Documentation and Bugs
1177======================
1178
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001179* http://salt-formulas.readthedocs.io/
1180 Learn how to install and update salt-formulas
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001181
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001182* https://github.com/salt-formulas/salt-formula-nova/issues
1183 In the unfortunate event that bugs are discovered, report the issue to the
1184 appropriate issue tracker. Use the Github issue tracker for a specific salt
1185 formula
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001186
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001187* https://launchpad.net/salt-formulas
1188 For feature requests, bug reports, or blueprints affecting the entire
1189 ecosystem, use the Launchpad salt-formulas project
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001190
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001191* https://launchpad.net/~salt-formulas-users
1192 Join the salt-formulas-users team and subscribe to mailing list if required
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001193
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001194* https://github.com/salt-formulas/salt-formula-nova
1195 Develop the salt-formulas projects in the master branch and then submit pull
1196 requests against a specific formula
Filip Pytloun5bc9e9f2017-02-02 13:05:40 +01001197
OlgaGusarenko9dd01c92018-07-31 00:49:30 +03001198* #salt-formulas @ irc.freenode.net
1199 Use this IRC channel in case of any questions or feedback which is always
1200 welcome